{-# LANGUAGE GADTs #-} module Events.Spec ( interpret , Spec, Cmnd(..), Expr(..) ) where import Events.Types import Control.Monad ((<=<)) 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 Cmnd] -- most significant last data Cmnd = COverride Object | COccurs Bool | CNop deriving (Show) data Expr a where ELit :: a -> Expr a interpret :: MonadIO m => Spec -> Eval m () interpret = mapM_ $ interpretCmnd <=< interpretExpr interpretExpr :: MonadIO m => Expr Cmnd -> m Cmnd interpretExpr (ELit a) = return a interpretCmnd :: MonadIO m => Cmnd -> Eval m () interpretCmnd (COverride obj) = objPayload ?= obj interpretCmnd (COccurs b) = objOccurs .= b interpretCmnd _ = return ()