summaryrefslogtreecommitdiff
path: root/events/src/Events/Spec.hs
blob: deabcc33560509c9b9151fbfc1909c2cb89f7961 (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) = ctxEvent ?= obj
interpretExpr (Occurs expr)  = ctxOccurs <~ interpretBoolExpr expr
interpretExpr _              = return ()

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