module Events.Eval ( evaluate ) where import Control.Monad.Fix (MonadFix(mfix)) import Events.Types import Data.Maybe (catMaybes) import Control.Lens evaluate :: MonadFix m => (Maybe Object -> StateT EvalCtx m Bool) -> Eval m () -> m [Object] evaluate predicate x = catMaybes <$> mfix x' where x' = evalStateT (foldNDT predicate (preview objCtx <$> execStateT x def)) . flip (set ctxEvents) def . catMaybes