drain and pump
[ekitaihs.git] / Render.hs
1 module Render ( ekitaiMain ) where
2
3 import Brick.AttrMap
4 import Brick.Main
5 import Brick.Types
6 import Brick.Widgets.Core
7 import Brick.BChan (newBChan, writeBChan)
8 import Graphics.Vty
9
10 import Control.Monad (forever, void)
11 import Control.Monad.IO.Class (liftIO)
12 import Control.Concurrent (threadDelay, forkIO)
13
14 import qualified Data.Vector as V
15 import Sim
16
17 type ResourceName = String
18
19 data EkitaiState = EkitaiState
20     { ekitaiStateSim           :: Simulation
21     } deriving (Show)
22
23 -- custom event
24 data Tick = Tick
25
26 ekitaiApp :: App EkitaiState Tick ResourceName
27 ekitaiApp = App
28     { appDraw = drawEkitai
29     , appChooseCursor = showFirstCursor
30     , appHandleEvent = handleEkitaiEvent
31     , appStartEvent = pure
32     , appAttrMap = const $ attrMap mempty []
33     }
34
35 ekitaiMain sim timestep = do
36     chan <- newBChan 10
37     -- tick game
38     forkIO $ forever $ do
39         writeBChan chan Tick
40         threadDelay timestep
41     let buildVty = Graphics.Vty.mkVty Graphics.Vty.defaultConfig
42     initialVty <- buildVty
43     initialState <- buildInitialState sim
44     endState <- customMain initialVty buildVty (Just chan) ekitaiApp initialState
45     return 0
46
47 buildInitialState :: Simulation -> IO EkitaiState
48 buildInitialState sim =
49     pure EkitaiState
50     { ekitaiStateSim = sim
51     }
52
53 drawEkitai :: EkitaiState -> [Widget ResourceName]
54 drawEkitai state = [ vBox [str $ simToString $ ekitaiStateSim state] ]
55
56 handleEkitaiEvent :: EkitaiState -> BrickEvent n Tick -> EventM n (Next EkitaiState)
57 handleEkitaiEvent s (VtyEvent (EvKey (KChar 'q') [])) = halt s
58 handleEkitaiEvent s (AppEvent Tick) = continue s { ekitaiStateSim = physStep $ ekitaiStateSim s }
59 handleEkitaiEvent s _ = continue s
60