{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}

-- | See "Control.Monad.Ether.Reader".

module Control.Monad.Ether.Implicit.Reader
    (
    -- * MonadReader class
      MonadReader
    , local
    , ask
    , reader
    , asks
    -- * The Reader monad
    , Reader
    , runReader
    -- * The ReaderT monad transformer
    , ReaderT
    , readerT
    , runReaderT
    , mapReaderT
    ) where

import Data.Proxy
import qualified Control.Monad.Ether.Reader as Explicit

-- | See 'Control.Monad.Ether.Reader.ReaderT'.
type ReaderT r = Explicit.ReaderT r r

-- | See 'Control.Monad.Ether.Reader.Reader'.
type Reader  r = Explicit.Reader  r r

-- | See 'Control.Monad.Ether.Reader.readerT'.
readerT :: (r -> m a) -> ReaderT r m a
readerT = Explicit.readerT Proxy

-- | See 'Control.Monad.Ether.Reader.runReaderT'.
runReaderT :: ReaderT r m a -> r -> m a
runReaderT = Explicit.runReaderT Proxy

-- | See 'Control.Monad.Ether.Reader.runReader'.
runReader :: Reader r a -> r -> a
runReader = Explicit.runReader Proxy

-- | See 'Control.Monad.Ether.Reader.mapReaderT'.
mapReaderT :: (m a -> n b) -> ReaderT r m a -> ReaderT r n b
mapReaderT = Explicit.mapReaderT Proxy

-- | See 'Control.Monad.Ether.Reader.MonadReader'.
type MonadReader r = Explicit.MonadReader r r

-- | See 'Control.Monad.Ether.Reader.local'.
local :: forall m r a . MonadReader r m => (r -> r) -> m a -> m a
local = Explicit.local (Proxy :: Proxy r)

-- | See 'Control.Monad.Ether.Reader.ask'.
ask :: forall m r . MonadReader r m => m r
ask = Explicit.ask (Proxy :: Proxy r)

-- | See 'Control.Monad.Ether.Reader.reader'.
reader :: forall m r a . MonadReader r m => (r -> a) -> m a
reader = Explicit.reader (Proxy :: Proxy r)

-- | See 'Control.Monad.Ether.Reader.asks'.
asks :: forall m r a . MonadReader r m => (r -> a) -> m a
asks = Explicit.asks (Proxy :: Proxy r)