{-# LANGUAGE ViewPatterns #-} module Events.Eval ( evaluate , ordPredicate , module Data.Ord ) where import Control.Monad.Fix (MonadFix(mfix)) import Events.Types import Data.Maybe (catMaybes) import Control.Lens import Data.Ord (Ordering(..)) evaluate :: MonadFix m => (Maybe Object -> ReaderT EvalCtx m Bool) -> Eval m () -> m [Object] evaluate predicate (unEval -> x) = catMaybes <$> mfix x' where x' = runReaderT (foldNDT predicate (preview objCtx <$> execStateT x def)) . flip (set ctxEvents) def . catMaybes ordPredicate :: Applicative m => (Object -> Ordering) -> (Maybe Object -> m Bool) ordPredicate _ Nothing = pure True ordPredicate f (Just (f -> o)) = pure $ o <= EQ