{-# LANGUAGE GADTs, DataKinds, TypeOperators #-} module Events.Spec ( interpret , Spec, Cmnd(..), Expr(..), Elem(..) ) where import Events.Types import Events.Spec.Types import Events.Spec.Eval 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 m = Expr (Eval m) '[] Cmnd -- most significant last data Cmnd = COverride Object | COccurs Bool | CNop deriving (Show) interpret :: MonadIO m => Spec m -> Eval m () interpret = join . fmap interpretCmnd . evalExpr interpretCmnd :: MonadIO m => Cmnd -> Eval m () interpretCmnd (COverride obj) = objPayload ?= obj interpretCmnd (COccurs b) = objOccurs .= b interpretCmnd _ = return ()