{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
module Control.Monad.Reader.Class (
MonadReader(..),
asks,
) where
import Control.Monad.Trans.Cont as Cont
import Control.Monad.Trans.Except
import Control.Monad.Trans.Error
import Control.Monad.Trans.Identity
import Control.Monad.Trans.List
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Reader (ReaderT)
import qualified Control.Monad.Trans.Reader as ReaderT (ask, local, reader)
import qualified Control.Monad.Trans.RWS.Lazy as LazyRWS (RWST, ask, local, reader)
import qualified Control.Monad.Trans.RWS.Strict as StrictRWS (RWST, ask, local, reader)
import Control.Monad.Trans.State.Lazy as Lazy
import Control.Monad.Trans.State.Strict as Strict
import Control.Monad.Trans.Writer.Lazy as Lazy
import Control.Monad.Trans.Writer.Strict as Strict
import Control.Monad.Trans.Class (lift)
import Control.Monad
import Data.Monoid
class Monad m => MonadReader r m | m -> r where
#if __GLASGOW_HASKELL__ >= 707
{-# MINIMAL (ask | reader), local #-}
#endif
ask :: m r
ask = (r -> r) -> m r
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader r -> r
forall a. a -> a
id
local :: (r -> r)
-> m a
-> m a
reader :: (r -> a)
-> m a
reader r -> a
f = do
r
r <- m r
forall r (m :: * -> *). MonadReader r m => m r
ask
a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (r -> a
f r
r)
asks :: MonadReader r m
=> (r -> a)
-> m a
asks :: (r -> a) -> m a
asks = (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader
instance MonadReader r ((->) r) where
ask :: r -> r
ask = r -> r
forall a. a -> a
id
local :: (r -> r) -> (r -> a) -> r -> a
local r -> r
f r -> a
m = r -> a
m (r -> a) -> (r -> r) -> r -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r -> r
f
reader :: (r -> a) -> r -> a
reader = (r -> a) -> r -> a
forall a. a -> a
id
instance Monad m => MonadReader r (ReaderT r m) where
ask :: ReaderT r m r
ask = ReaderT r m r
forall (m :: * -> *) r. Monad m => ReaderT r m r
ReaderT.ask
local :: (r -> r) -> ReaderT r m a -> ReaderT r m a
local = (r -> r) -> ReaderT r m a -> ReaderT r m a
forall r (m :: * -> *) a.
(r -> r) -> ReaderT r m a -> ReaderT r m a
ReaderT.local
reader :: (r -> a) -> ReaderT r m a
reader = (r -> a) -> ReaderT r m a
forall (m :: * -> *) r a. Monad m => (r -> a) -> ReaderT r m a
ReaderT.reader
instance (Monad m, Monoid w) => MonadReader r (LazyRWS.RWST r w s m) where
ask :: RWST r w s m r
ask = RWST r w s m r
forall w (m :: * -> *) r s. (Monoid w, Monad m) => RWST r w s m r
LazyRWS.ask
local :: (r -> r) -> RWST r w s m a -> RWST r w s m a
local = (r -> r) -> RWST r w s m a -> RWST r w s m a
forall r w s (m :: * -> *) a.
(r -> r) -> RWST r w s m a -> RWST r w s m a
LazyRWS.local
reader :: (r -> a) -> RWST r w s m a
reader = (r -> a) -> RWST r w s m a
forall w (m :: * -> *) r a s.
(Monoid w, Monad m) =>
(r -> a) -> RWST r w s m a
LazyRWS.reader
instance (Monad m, Monoid w) => MonadReader r (StrictRWS.RWST r w s m) where
ask :: RWST r w s m r
ask = RWST r w s m r
forall w (m :: * -> *) r s. (Monoid w, Monad m) => RWST r w s m r
StrictRWS.ask
local :: (r -> r) -> RWST r w s m a -> RWST r w s m a
local = (r -> r) -> RWST r w s m a -> RWST r w s m a
forall r w s (m :: * -> *) a.
(r -> r) -> RWST r w s m a -> RWST r w s m a
StrictRWS.local
reader :: (r -> a) -> RWST r w s m a
reader = (r -> a) -> RWST r w s m a
forall w (m :: * -> *) r a s.
(Monoid w, Monad m) =>
(r -> a) -> RWST r w s m a
StrictRWS.reader
instance MonadReader r' m => MonadReader r' (ContT r m) where
ask :: ContT r m r'
ask = m r' -> ContT r m r'
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r'
forall r (m :: * -> *). MonadReader r m => m r
ask
local :: (r' -> r') -> ContT r m a -> ContT r m a
local = m r'
-> ((r' -> r') -> m r -> m r)
-> (r' -> r')
-> ContT r m a
-> ContT r m a
forall (m :: * -> *) r' r a.
Monad m =>
m r'
-> ((r' -> r') -> m r -> m r)
-> (r' -> r')
-> ContT r m a
-> ContT r m a
Cont.liftLocal m r'
forall r (m :: * -> *). MonadReader r m => m r
ask (r' -> r') -> m r -> m r
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local
reader :: (r' -> a) -> ContT r m a
reader = m a -> ContT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ContT r m a)
-> ((r' -> a) -> m a) -> (r' -> a) -> ContT r m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r' -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader
instance (Error e, MonadReader r m) => MonadReader r (ErrorT e m) where
ask :: ErrorT e m r
ask = m r -> ErrorT e m r
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
ask
local :: (r -> r) -> ErrorT e m a -> ErrorT e m a
local = (m (Either e a) -> m (Either e a)) -> ErrorT e m a -> ErrorT e m a
forall (m :: * -> *) e a (n :: * -> *) e' b.
(m (Either e a) -> n (Either e' b))
-> ErrorT e m a -> ErrorT e' n b
mapErrorT ((m (Either e a) -> m (Either e a))
-> ErrorT e m a -> ErrorT e m a)
-> ((r -> r) -> m (Either e a) -> m (Either e a))
-> (r -> r)
-> ErrorT e m a
-> ErrorT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> r) -> m (Either e a) -> m (Either e a)
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local
reader :: (r -> a) -> ErrorT e m a
reader = m a -> ErrorT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ErrorT e m a)
-> ((r -> a) -> m a) -> (r -> a) -> ErrorT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader
instance MonadReader r m => MonadReader r (ExceptT e m) where
ask :: ExceptT e m r
ask = m r -> ExceptT e m r
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
ask
local :: (r -> r) -> ExceptT e m a -> ExceptT e m a
local = (m (Either e a) -> m (Either e a))
-> ExceptT e m a -> ExceptT e m a
forall (m :: * -> *) e a (n :: * -> *) e' b.
(m (Either e a) -> n (Either e' b))
-> ExceptT e m a -> ExceptT e' n b
mapExceptT ((m (Either e a) -> m (Either e a))
-> ExceptT e m a -> ExceptT e m a)
-> ((r -> r) -> m (Either e a) -> m (Either e a))
-> (r -> r)
-> ExceptT e m a
-> ExceptT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> r) -> m (Either e a) -> m (Either e a)
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local
reader :: (r -> a) -> ExceptT e m a
reader = m a -> ExceptT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ExceptT e m a)
-> ((r -> a) -> m a) -> (r -> a) -> ExceptT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader
instance MonadReader r m => MonadReader r (IdentityT m) where
ask :: IdentityT m r
ask = m r -> IdentityT m r
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
ask
local :: (r -> r) -> IdentityT m a -> IdentityT m a
local = (m a -> m a) -> IdentityT m a -> IdentityT m a
forall k1 k2 (m :: k1 -> *) (a :: k1) (n :: k2 -> *) (b :: k2).
(m a -> n b) -> IdentityT m a -> IdentityT n b
mapIdentityT ((m a -> m a) -> IdentityT m a -> IdentityT m a)
-> ((r -> r) -> m a -> m a)
-> (r -> r)
-> IdentityT m a
-> IdentityT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> r) -> m a -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local
reader :: (r -> a) -> IdentityT m a
reader = m a -> IdentityT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> IdentityT m a)
-> ((r -> a) -> m a) -> (r -> a) -> IdentityT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader
instance MonadReader r m => MonadReader r (ListT m) where
ask :: ListT m r
ask = m r -> ListT m r
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
ask
local :: (r -> r) -> ListT m a -> ListT m a
local = (m [a] -> m [a]) -> ListT m a -> ListT m a
forall (m :: * -> *) a (n :: * -> *) b.
(m [a] -> n [b]) -> ListT m a -> ListT n b
mapListT ((m [a] -> m [a]) -> ListT m a -> ListT m a)
-> ((r -> r) -> m [a] -> m [a])
-> (r -> r)
-> ListT m a
-> ListT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> r) -> m [a] -> m [a]
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local
reader :: (r -> a) -> ListT m a
reader = m a -> ListT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ListT m a) -> ((r -> a) -> m a) -> (r -> a) -> ListT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader
instance MonadReader r m => MonadReader r (MaybeT m) where
ask :: MaybeT m r
ask = m r -> MaybeT m r
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
ask
local :: (r -> r) -> MaybeT m a -> MaybeT m a
local = (m (Maybe a) -> m (Maybe a)) -> MaybeT m a -> MaybeT m a
forall (m :: * -> *) a (n :: * -> *) b.
(m (Maybe a) -> n (Maybe b)) -> MaybeT m a -> MaybeT n b
mapMaybeT ((m (Maybe a) -> m (Maybe a)) -> MaybeT m a -> MaybeT m a)
-> ((r -> r) -> m (Maybe a) -> m (Maybe a))
-> (r -> r)
-> MaybeT m a
-> MaybeT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> r) -> m (Maybe a) -> m (Maybe a)
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local
reader :: (r -> a) -> MaybeT m a
reader = m a -> MaybeT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> MaybeT m a) -> ((r -> a) -> m a) -> (r -> a) -> MaybeT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader
instance MonadReader r m => MonadReader r (Lazy.StateT s m) where
ask :: StateT s m r
ask = m r -> StateT s m r
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
ask
local :: (r -> r) -> StateT s m a -> StateT s m a
local = (m (a, s) -> m (a, s)) -> StateT s m a -> StateT s m a
forall (m :: * -> *) a s (n :: * -> *) b.
(m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
Lazy.mapStateT ((m (a, s) -> m (a, s)) -> StateT s m a -> StateT s m a)
-> ((r -> r) -> m (a, s) -> m (a, s))
-> (r -> r)
-> StateT s m a
-> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> r) -> m (a, s) -> m (a, s)
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local
reader :: (r -> a) -> StateT s m a
reader = m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> StateT s m a)
-> ((r -> a) -> m a) -> (r -> a) -> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader
instance MonadReader r m => MonadReader r (Strict.StateT s m) where
ask :: StateT s m r
ask = m r -> StateT s m r
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
ask
local :: (r -> r) -> StateT s m a -> StateT s m a
local = (m (a, s) -> m (a, s)) -> StateT s m a -> StateT s m a
forall (m :: * -> *) a s (n :: * -> *) b.
(m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
Strict.mapStateT ((m (a, s) -> m (a, s)) -> StateT s m a -> StateT s m a)
-> ((r -> r) -> m (a, s) -> m (a, s))
-> (r -> r)
-> StateT s m a
-> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> r) -> m (a, s) -> m (a, s)
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local
reader :: (r -> a) -> StateT s m a
reader = m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> StateT s m a)
-> ((r -> a) -> m a) -> (r -> a) -> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader
instance (Monoid w, MonadReader r m) => MonadReader r (Lazy.WriterT w m) where
ask :: WriterT w m r
ask = m r -> WriterT w m r
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
ask
local :: (r -> r) -> WriterT w m a -> WriterT w m a
local = (m (a, w) -> m (a, w)) -> WriterT w m a -> WriterT w m a
forall (m :: * -> *) a w (n :: * -> *) b w'.
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
Lazy.mapWriterT ((m (a, w) -> m (a, w)) -> WriterT w m a -> WriterT w m a)
-> ((r -> r) -> m (a, w) -> m (a, w))
-> (r -> r)
-> WriterT w m a
-> WriterT w m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> r) -> m (a, w) -> m (a, w)
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local
reader :: (r -> a) -> WriterT w m a
reader = m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> WriterT w m a)
-> ((r -> a) -> m a) -> (r -> a) -> WriterT w m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader
instance (Monoid w, MonadReader r m) => MonadReader r (Strict.WriterT w m) where
ask :: WriterT w m r
ask = m r -> WriterT w m r
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
ask
local :: (r -> r) -> WriterT w m a -> WriterT w m a
local = (m (a, w) -> m (a, w)) -> WriterT w m a -> WriterT w m a
forall (m :: * -> *) a w (n :: * -> *) b w'.
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
Strict.mapWriterT ((m (a, w) -> m (a, w)) -> WriterT w m a -> WriterT w m a)
-> ((r -> r) -> m (a, w) -> m (a, w))
-> (r -> r)
-> WriterT w m a
-> WriterT w m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> r) -> m (a, w) -> m (a, w)
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local
reader :: (r -> a) -> WriterT w m a
reader = m a -> WriterT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> WriterT w m a)
-> ((r -> a) -> m a) -> (r -> a) -> WriterT w m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader