summaryrefslogtreecommitdiff
path: root/events/src/Events/Spec.hs
diff options
context:
space:
mode:
Diffstat (limited to 'events/src/Events/Spec.hs')
-rw-r--r--events/src/Events/Spec.hs18
1 files changed, 7 insertions, 11 deletions
diff --git a/events/src/Events/Spec.hs b/events/src/Events/Spec.hs
index 2af3446..e098886 100644
--- a/events/src/Events/Spec.hs
+++ b/events/src/Events/Spec.hs
@@ -1,11 +1,13 @@
1{-# LANGUAGE GADTs #-} 1{-# LANGUAGE GADTs, DataKinds, TypeOperators #-}
2 2
3module Events.Spec 3module Events.Spec
4 ( interpret 4 ( interpret
5 , Spec, Cmnd(..), Expr(..) 5 , Spec, Cmnd(..), Expr(..), Elem(..)
6 ) where 6 ) where
7 7
8import Events.Types 8import Events.Types
9import Events.Spec.Types
10import Events.Spec.Eval
9 11
10import Control.Monad ((<=<)) 12import Control.Monad ((<=<))
11import Control.Monad.IO.Class 13import Control.Monad.IO.Class
@@ -17,21 +19,15 @@ import Control.Lens
17 19
18import Debug.Trace 20import Debug.Trace
19 21
20type Spec = [Expr Cmnd] -- most significant last 22type Spec m = Expr (Eval m) '[] Cmnd -- most significant last
21 23
22data Cmnd = COverride Object 24data Cmnd = COverride Object
23 | COccurs Bool 25 | COccurs Bool
24 | CNop 26 | CNop
25 deriving (Show) 27 deriving (Show)
26 28
27data Expr a where 29interpret :: MonadIO m => Spec m -> Eval m ()
28 ELit :: a -> Expr a 30interpret = join . fmap interpretCmnd . evalExpr
29
30interpret :: MonadIO m => Spec -> Eval m ()
31interpret = mapM_ $ interpretCmnd <=< interpretExpr
32
33interpretExpr :: MonadIO m => Expr Cmnd -> m Cmnd
34interpretExpr (ELit a) = return a
35 31
36interpretCmnd :: MonadIO m => Cmnd -> Eval m () 32interpretCmnd :: MonadIO m => Cmnd -> Eval m ()
37interpretCmnd (COverride obj) = objPayload ?= obj 33interpretCmnd (COverride obj) = objPayload ?= obj