-
Notifications
You must be signed in to change notification settings - Fork 0
/
Interpreters.hs
58 lines (54 loc) · 1.97 KB
/
Interpreters.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
module Interpreters where
import Control.Monad.State
import qualified Control.Monad.Trans.Free as FT
import Types
import DSL
debugInterp :: GameData -> GameDSL r -> IO ()
debugInterp st act =
let (act', st') = runState (FT.runFreeT act) st
in case act' of
(FT.Free (AttackWith card f)) -> do
putStrLn $ "\n\nNew round"
putStrLn $ show st
putStrLn $ "Offense attacks with " ++ show card
putStrLn $ show st'
debugInterp st' f
(FT.Free (PassWith card f)) -> do
putStr $ "Defense passes with " ++ show card
putStrLn $ "; roles switch\n" ++ show st'
debugInterp st' f
(FT.Free (Defend pc c f)) -> do
putStrLn $ "Covering " ++ (show . card) pc ++ " with " ++ show c
putStrLn $ show st'
debugInterp st' f
(FT.Free (ReinforceWith cards f)) -> do
putStrLn $ "Offense reinforces with " ++ show cards
putStrLn $ show st'
debugInterp st' f
(FT.Free (WinTurn role f)) -> do
putStrLn $ show role ++ " wins that turn."
putStrLn $ show st'
debugInterp st' f
(FT.Free (Result n f)) -> do
putStrLn $ "\n\n" ++ show n
debugInterp st' f
FT.Pure _ -> return ()
quietInterp :: GameData -> GameDSL r -> IO ()
quietInterp st act =
let (act', st') = runState (FT.runFreeT act) st
in case act' of
-- FIXME: there's gotta be a better way here.
(FT.Free (AttackWith card f)) -> do
quietInterp st' f
(FT.Free (PassWith card f)) -> do
quietInterp st' f
(FT.Free (Defend pc c f)) -> do
quietInterp st' f
(FT.Free (ReinforceWith cards f)) -> do
quietInterp st' f
(FT.Free (WinTurn role f)) -> do
quietInterp st' f
(FT.Free (Result n f)) -> do
putStr $ show n
quietInterp st' f
FT.Pure _ -> return ()