diff options
Diffstat (limited to 'events/src/Events/Spec.hs')
-rw-r--r-- | events/src/Events/Spec.hs | 18 |
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 | ||
3 | module Events.Spec | 3 | module Events.Spec |
4 | ( interpret | 4 | ( interpret |
5 | , Spec, Cmnd(..), Expr(..) | 5 | , Spec, Cmnd(..), Expr(..), Elem(..) |
6 | ) where | 6 | ) where |
7 | 7 | ||
8 | import Events.Types | 8 | import Events.Types |
9 | import Events.Spec.Types | ||
10 | import Events.Spec.Eval | ||
9 | 11 | ||
10 | import Control.Monad ((<=<)) | 12 | import Control.Monad ((<=<)) |
11 | import Control.Monad.IO.Class | 13 | import Control.Monad.IO.Class |
@@ -17,21 +19,15 @@ import Control.Lens | |||
17 | 19 | ||
18 | import Debug.Trace | 20 | import Debug.Trace |
19 | 21 | ||
20 | type Spec = [Expr Cmnd] -- most significant last | 22 | type Spec m = Expr (Eval m) '[] Cmnd -- most significant last |
21 | 23 | ||
22 | data Cmnd = COverride Object | 24 | data Cmnd = COverride Object |
23 | | COccurs Bool | 25 | | COccurs Bool |
24 | | CNop | 26 | | CNop |
25 | deriving (Show) | 27 | deriving (Show) |
26 | 28 | ||
27 | data Expr a where | 29 | interpret :: MonadIO m => Spec m -> Eval m () |
28 | ELit :: a -> Expr a | 30 | interpret = join . fmap interpretCmnd . evalExpr |
29 | |||
30 | interpret :: MonadIO m => Spec -> Eval m () | ||
31 | interpret = mapM_ $ interpretCmnd <=< interpretExpr | ||
32 | |||
33 | interpretExpr :: MonadIO m => Expr Cmnd -> m Cmnd | ||
34 | interpretExpr (ELit a) = return a | ||
35 | 31 | ||
36 | interpretCmnd :: MonadIO m => Cmnd -> Eval m () | 32 | interpretCmnd :: MonadIO m => Cmnd -> Eval m () |
37 | interpretCmnd (COverride obj) = objPayload ?= obj | 33 | interpretCmnd (COverride obj) = objPayload ?= obj |