imprevu-0.1.0: src/Imprevu/Evaluation/Types.hs
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
module Imprevu.Evaluation.Types where
import Control.Lens
import Control.Monad.Except
import Control.Monad.State
import Imprevu.Types
data EvalEnvN n s = EvalEnv { _evalEnv :: s,
_evalConf :: EvalConfN n s}
data EvalConfN n s = EvalConf { getEvents :: s -> [EventInfoN n],
setEvents :: [EventInfoN n] -> s -> s,
_evalFunc :: forall a. n a -> EvaluateN n s a, -- evaluation function
_errorHandler :: EventNumber -> String -> EvaluateN n s (), -- error function
_withEvent :: EventInfoN n -> EvaluateN n s () -> EvaluateN n s ()} -- change the context of the event
-- | Environment necessary for the evaluation
type EvaluateN n s a = ExceptT String (State (EvalEnvN n s)) a
makeLenses ''EvalEnvN
makeLenses ''EvalConfN
events :: Lens' (EvalEnvN n s) [EventInfoN n]
events f ee@(EvalEnv s (EvalConf ge se _ _ _)) = fmap (\s' -> ee{_evalEnv = se s' s}) (f $ ge s)