0 | module Control.Effect.Reader
2 | import Control.EffectAlgebra
4 | import Control.Monad.Reader
8 | data ReaderE : Type -> (Type -> Type) -> Type -> Type where
12 | Functor (\r => ReaderE r m r) where
17 | ask : Inj (ReaderE r) sig => Algebra sig m => m r
24 | [Reader] (al : Algebra sig m) => Algebra (ReaderE s :+: sig) (ReaderT s m) where
25 | alg ctx hdl (Inl Ask) = MkReaderT $
\s => pure (s <$ ctx)
26 | alg ctx hdl (Inr x) = MkReaderT $
\r => alg ctx (runReaderT r . hdl) x
29 | HintReader : (al : Algebra sig m) => Algebra (ReaderE s :+: sig) (ReaderT s m)