{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
-- Search for UndecidableInstances to see why this is needed
{- |
Module      :  Control.Monad.Reader.Class
Copyright   :  (c) Andy Gill 2001,
               (c) Oregon Graduate Institute of Science and Technology 2001,
               (c) Jeff Newbern 2003-2007,
               (c) Andriy Palamarchuk 2007
License     :  BSD-style (see the file LICENSE)

Maintainer  :  libraries@haskell.org
Stability   :  experimental
Portability :  non-portable (multi-param classes, functional dependencies)

[Computation type:] Computations which read values from a shared environment.

[Binding strategy:] Monad values are functions from the environment to a value.
The bound function is applied to the bound value, and both have access
to the shared environment.

[Useful for:] Maintaining variable bindings, or other shared environment.

[Zero and plus:] None.

[Example type:] @'Reader' [(String,Value)] a@

The 'Reader' monad (also called the Environment monad).
Represents a computation, which can read values from
a shared environment, pass values from function to function,
and execute sub-computations in a modified environment.
Using 'Reader' monad for such computations is often clearer and easier
than using the 'Control.Monad.State.State' monad.

  Inspired by the paper
  /Functional Programming with Overloading and Higher-Order Polymorphism/,
    Mark P Jones (<http://web.cecs.pdx.edu/~mpj/>)
    Advanced School of Functional Programming, 1995.
-}

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 MonadReader
--  asks for the internal (non-mutable) state.

-- | See examples in "Control.Monad.Reader".
-- Note, the partially applied function type @(->) r@ is a simple reader monad.
-- See the @instance@ declaration below.
class Monad m => MonadReader r m | m -> r where
#if __GLASGOW_HASKELL__ >= 707
    {-# MINIMAL (ask | reader), local #-}
#endif
    -- | Retrieves the monad environment.
    ask   :: m r
    ask = (r -> r) -> m r
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
Evidence bound by a type signature of the constraint type MonadReader r m
reader r -> r
forall a. a -> a
id

    -- | Executes a computation in a modified environment.
    local :: (r -> r) -- ^ The function to modify the environment.
          -> m a      -- ^ @Reader@ to run in the modified environment.
          -> m a

    -- | Retrieves a function of the current environment.
    reader :: (r -> a) -- ^ The selector function to apply to the environment.
           -> m a
    reader r -> a
f = do
      r
r <- m r
forall r (m :: * -> *). MonadReader r m => m r
Evidence bound by a type signature of the constraint type MonadReader r m
ask
      a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
return (r -> a
f r
r)

-- | Retrieves a function of the current environment.
asks :: MonadReader r m
    => (r -> a) -- ^ The selector function to apply to the environment.
    -> m a
asks :: (r -> a) -> m a
asks = (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
Evidence bound by a type signature of the constraint type MonadReader r m
reader

-- ----------------------------------------------------------------------------
-- The partially applied function type is a simple reader monad

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
Evidence bound by a type signature of the constraint type Monad m
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
Evidence bound by a type signature of the constraint type Monad m
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
Evidence bound by a type signature of the constraint type Monad m
Evidence bound by a type signature of the constraint type Monoid w
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
Evidence bound by a type signature of the constraint type Monad m
Evidence bound by a type signature of the constraint type Monoid w
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
Evidence bound by a type signature of the constraint type Monad m
Evidence bound by a type signature of the constraint type Monoid w
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
Evidence bound by a type signature of the constraint type Monad m
Evidence bound by a type signature of the constraint type Monoid w
StrictRWS.reader

-- ---------------------------------------------------------------------------
-- Instances for other mtl transformers
--
-- All of these instances need UndecidableInstances,
-- because they do not satisfy the coverage condition.

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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r' m
External instance of the constraint type forall r. MonadTrans (ContT r)
lift m r'
forall r (m :: * -> *). MonadReader r m => m r
Evidence bound by a type signature of the constraint type MonadReader r' m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r' m
Cont.liftLocal m r'
forall r (m :: * -> *). MonadReader r m => m r
Evidence bound by a type signature of the constraint type MonadReader r' m
ask (r' -> r') -> m r -> m r
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
Evidence bound by a type signature of the constraint type MonadReader r' m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r' m
External instance of the constraint type forall r. MonadTrans (ContT r)
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
Evidence bound by a type signature of the constraint type MonadReader r' m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type forall e. MonadTrans (ErrorT e)
lift m r
forall r (m :: * -> *). MonadReader r m => m r
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type forall e. MonadTrans (ErrorT e)
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
Evidence bound by a type signature of the constraint type MonadReader r m
reader

{- | @since 2.2 -}
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type forall e. MonadTrans (ExceptT e)
lift m r
forall r (m :: * -> *). MonadReader r m => m r
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type forall e. MonadTrans (ExceptT e)
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type MonadTrans IdentityT
lift m r
forall r (m :: * -> *). MonadReader r m => m r
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type MonadTrans IdentityT
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type MonadTrans ListT
lift m r
forall r (m :: * -> *). MonadReader r m => m r
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type MonadTrans ListT
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type MonadTrans MaybeT
lift m r
forall r (m :: * -> *). MonadReader r m => m r
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type MonadTrans MaybeT
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type forall s. MonadTrans (StateT s)
lift m r
forall r (m :: * -> *). MonadReader r m => m r
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type forall s. MonadTrans (StateT s)
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type forall s. MonadTrans (StateT s)
lift m r
forall r (m :: * -> *). MonadReader r m => m r
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type forall s. MonadTrans (StateT s)
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type forall w. Monoid w => MonadTrans (WriterT w)
Evidence bound by a type signature of the constraint type Monoid w
lift m r
forall r (m :: * -> *). MonadReader r m => m r
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type forall w. Monoid w => MonadTrans (WriterT w)
Evidence bound by a type signature of the constraint type Monoid w
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type forall w. Monoid w => MonadTrans (WriterT w)
Evidence bound by a type signature of the constraint type Monoid w
lift m r
forall r (m :: * -> *). MonadReader r m => m r
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a type signature of the constraint type MonadReader r m
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
Evidence bound by a superclass of: MonadReader of the constraint type forall r (m :: * -> *). MonadReader r m => Monad m
Evidence bound by a type signature of the constraint type MonadReader r m
External instance of the constraint type forall w. Monoid w => MonadTrans (WriterT w)
Evidence bound by a type signature of the constraint type Monoid w
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
Evidence bound by a type signature of the constraint type MonadReader r m
reader