-- |
-- This module reexports most of the definitions from the \"transformers\" package.
-- Strict variants are provided instead of the lazy variants.
-- Notably, the functions for lifting callcc, listen, pass, and catch
-- are left out because there are different
-- variants for every monad transformer. 
--
-- 'Control.Monad.Trans.Error' is left out because it is deprecated.
--
-- 'ListT' is left out because it is not actually a monad transformer and
-- it is despised by most.
--
-- From 'Control.Monad.Trans.RWS.Strict', we do not export functions like 
-- 'reader', 'writer','ask', 'tell', 'state', etc. that would clash with 
-- the identically-named functions that deal specifically with 'ReaderT', 
-- 'WriterT', and 'StateT'. You will need to import this module qualified
-- to use those functions.
--
-- Both 'Data.Functor.Sum' and 'Data.Functor.Product' are left out because
-- the names of these data types clash with the commonly used newtypes
-- in 'Data.Monoid'.
--
-- From 'Control.Monad.Trans.Cont', 'reset' and 'shift' have been left out
-- because there is a 'shift' in 'Data.Bits'.
--

module Prelude.Transformers.Strict
  ( module E
  ) where

-- Applicatives
import Control.Applicative.Backwards as E
import Control.Applicative.Lift as E (Lift(..),unLift,mapLift)

-- Typeclasses
import Control.Monad.IO.Class as E
import Control.Monad.Trans.Class as E

-- Transformers
import Control.Monad.Trans.Cont as E (Cont,ContT(..),cont
  ,runCont,evalCont,mapCont,withCont,evalContT,mapContT,withContT
  ,resetT,shiftT)
import Control.Monad.Trans.Except as E (Except,ExceptT(..),except
  ,runExcept,mapExcept,withExcept,runExceptT,mapExceptT,withExceptT
  ,throwE,catchE)
import Control.Monad.Trans.Identity as E (IdentityT(..),mapIdentityT)
import Control.Monad.Trans.Maybe as E (MaybeT(..),mapMaybeT
  ,maybeToExceptT,exceptToMaybeT)
import Control.Monad.Trans.RWS.Strict as E (RWS,RWST(..),rws,runRWS
  ,evalRWS,execRWS,mapRWS,withRWS,evalRWST,execRWST,mapRWST,withRWST)
import Control.Monad.Trans.Reader as E (Reader,ReaderT(..),reader
  ,runReader,mapReader,withReader,mapReaderT,withReaderT,ask,local
  ,asks)
import Control.Monad.Trans.State.Strict as E (State,StateT(..),state
  ,runState,evalState,execState,mapState,withState,evalStateT
  ,execStateT,mapStateT,withStateT,get,put,modify,modify',gets)
import Control.Monad.Trans.Writer.Strict as E (Writer,WriterT(..)
  ,writer,runWriter,execWriter,mapWriter,execWriterT,mapWriterT
  ,tell,listen,listens,pass,censor)

-- Functors
import Data.Functor.Classes as E
import Data.Functor.Compose as E
import Data.Functor.Constant as E
import Data.Functor.Reverse as E