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