0 | module Control.Monad.Reader.Reader
2 | import Control.Monad.Identity
3 | import Control.Monad.Trans
12 | record ReaderT (stateType : Type) (m : Type -> Type) (a : Type) where
13 | constructor MkReaderT
14 | 1 runReaderT' : stateType -> m a
17 | public export %inline
18 | mapReaderT : (m a -> n b) -> ReaderT r m a -> ReaderT r n b
19 | mapReaderT f m = MkReaderT $
\st => f (runReaderT' m st)
24 | runReaderT : stateType -> ReaderT stateType m a -> m a
25 | runReaderT s action = runReaderT' action s
35 | Reader : (stateType : Type) -> (a : Type) -> Type
36 | Reader s = ReaderT s Identity
39 | public export %inline
40 | runReader : stateType -> Reader stateType a -> a
41 | runReader s = runIdentity . runReaderT s
48 | implementation Functor f => Functor (ReaderT stateType f) where
49 | map f (MkReaderT g) = MkReaderT $
\st => f <$> g st
52 | implementation Applicative f => Applicative (ReaderT stateType f) where
53 | pure x = MkReaderT $
\_ => pure x
55 | MkReaderT f <*> MkReaderT a =
62 | implementation Monad m => Monad (ReaderT stateType m) where
64 | MkReaderT $
\st => f st >>= runReaderT st . k
67 | implementation MonadTrans (ReaderT stateType) where
68 | lift x = MkReaderT $
\_ => x
71 | implementation HasIO m => HasIO (ReaderT stateType m) where
72 | liftIO f = MkReaderT $
\_ => liftIO f
75 | implementation Alternative f => Alternative (ReaderT stateType f) where
76 | empty = MkReaderT $
const empty
78 | MkReaderT f <|> mg = MkReaderT $
\st => f st <|> runReaderT' mg st