{-# LANGUAGE Safe #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
module Control.Monad.Reader.Class (
MonadReader(..),
asks,
) where
import qualified Control.Monad.Trans.Cont as Cont
import Control.Monad.Trans.Cont (ContT)
import Control.Monad.Trans.Except (ExceptT, mapExceptT)
import Control.Monad.Trans.Identity (IdentityT, mapIdentityT)
import Control.Monad.Trans.Maybe (MaybeT, mapMaybeT)
import Control.Monad.Trans.Reader (ReaderT)
import qualified Control.Monad.Trans.Reader as ReaderT
import qualified Control.Monad.Trans.RWS.Lazy as LazyRWS
import qualified Control.Monad.Trans.RWS.Strict as StrictRWS
import qualified Control.Monad.Trans.State.Lazy as Lazy
import qualified Control.Monad.Trans.State.Strict as Strict
import qualified Control.Monad.Trans.Writer.Lazy as Lazy
import qualified Control.Monad.Trans.Writer.Strict as Strict
import Control.Monad.Trans.Accum (AccumT)
import qualified Control.Monad.Trans.Accum as Accum
import Control.Monad.Trans.Select (SelectT (SelectT), runSelectT)
import qualified Control.Monad.Trans.RWS.CPS as CPSRWS
import qualified Control.Monad.Trans.Writer.CPS as CPS
import Control.Monad.Trans.Class (lift)
class Monad m => MonadReader r m | m -> r where
{-# MINIMAL (ask | reader), local #-}
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 (CPSRWS.RWST r w s m) where
ask :: RWST r w s m r
ask = RWST r w s m r
forall (m :: * -> *) r w s. Monad m => RWST r w s m r
CPSRWS.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
CPSRWS.local
reader :: (r -> a) -> RWST r w s m a
reader = (r -> a) -> RWST r w s m a
forall (m :: * -> *) r a w s. Monad m => (r -> a) -> RWST r w s m a
CPSRWS.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 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 (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 (CPS.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 (n :: * -> *) w w' (m :: * -> *) a b.
(Monad n, Monoid w, Monoid w') =>
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
CPS.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 (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
instance
( Monoid w
, MonadReader r m
) => MonadReader r (AccumT w m) where
ask :: AccumT w m r
ask = m r -> AccumT 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) -> AccumT w m a -> AccumT w m a
local = (m (a, w) -> m (a, w)) -> AccumT w m a -> AccumT w m a
forall (m :: * -> *) a w (n :: * -> *) b.
(m (a, w) -> n (b, w)) -> AccumT w m a -> AccumT w n b
Accum.mapAccumT ((m (a, w) -> m (a, w)) -> AccumT w m a -> AccumT w m a)
-> ((r -> r) -> m (a, w) -> m (a, w))
-> (r -> r)
-> AccumT w m a
-> AccumT 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) -> AccumT w m a
reader = m a -> AccumT w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> AccumT w m a)
-> ((r -> a) -> m a) -> (r -> a) -> AccumT 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
( MonadReader r' m
) => MonadReader r' (SelectT r m) where
ask :: SelectT r m r'
ask = m r' -> SelectT 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') -> SelectT r m a -> SelectT r m a
local r' -> r'
f SelectT r m a
m = ((a -> m r) -> m a) -> SelectT r m a
forall r (m :: * -> *) a. ((a -> m r) -> m a) -> SelectT r m a
SelectT (((a -> m r) -> m a) -> SelectT r m a)
-> ((a -> m r) -> m a) -> SelectT r m a
forall a b. (a -> b) -> a -> b
$ \a -> m r
c -> do
r'
r <- m r'
forall r (m :: * -> *). MonadReader r m => m r
ask
(r' -> r') -> m a -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local r' -> r'
f (SelectT r m a -> (a -> m r) -> m a
forall r (m :: * -> *) a. SelectT r m a -> (a -> m r) -> m a
runSelectT SelectT r m a
m ((r' -> r') -> m r -> m r
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (r' -> r' -> r'
forall a b. a -> b -> a
const r'
r) (m r -> m r) -> (a -> m r) -> a -> m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> m r
c))
reader :: (r' -> a) -> SelectT r m a
reader = m a -> SelectT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> SelectT r m a)
-> ((r' -> a) -> m a) -> (r' -> a) -> SelectT 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