summaryrefslogtreecommitdiff
path: root/events/src/Events/Spec.hs
blob: 1e7e1b40b86e9d9119108d3ff5aa5187e907e9a7 (plain)
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
module Events.Spec
       ( interpret
       , Spec, Expr(..), BoolExpr(..)
       ) where

import Events.Types

import Control.Monad.IO.Class
import Control.Monad.State.Lazy

import Data.Monoid
import Data.Foldable
import Control.Lens

import Debug.Trace

type Spec = [Expr] -- most significant last

data Expr = Override Object
          | Occurs BoolExpr
          | Nop
          deriving (Show)

data BoolExpr = BoolLit Bool
              deriving (Show)

interpret :: MonadIO m => Spec -> Eval m ()
interpret = mapM_ interpretExpr

interpretExpr :: MonadIO m => Expr -> Eval m ()
interpretExpr (Override obj) = objPayload ?= obj
interpretExpr (Occurs expr)  = objOccurs <~ interpretBoolExpr expr
interpretExpr _              = return ()

interpretBoolExpr :: Monad m => BoolExpr -> Eval m Bool
interpretBoolExpr (BoolLit v) = return v