module Preamble.Types.Trans
( module Preamble.Types.Trans
, MonadBaseControl
, MonadReader
, MonadResource
, runResourceT
) where
import Control.Monad.Base
import Control.Monad.Catch
import Control.Monad.Logger
import Control.Monad.Random
import Control.Monad.Reader
import Control.Monad.Trans.Control
import Control.Monad.Trans.Resource
import Preamble.Prelude
newtype TransT c m a = TransT
{ unTransT :: LoggingT (ReaderT c m) a
} deriving (Functor, Applicative, Monad, MonadLogger, MonadReader c, MonadIO, MonadThrow, MonadCatch, MonadMask)
instance MonadBase b m => MonadBase b (TransT c m) where
liftBase = liftBaseDefault
instance MonadBaseControl b m => MonadBaseControl b (TransT c m) where
type StM (TransT c m) a = ComposeSt (TransT c) m a
liftBaseWith = defaultLiftBaseWith
restoreM = defaultRestoreM
instance MonadTransControl (TransT c) where
type StT (TransT c) a = StT (ReaderT c) a
liftWith f = TransT $
liftWith $ \g ->
liftWith $ \h ->
f (h . g . unTransT)
restoreT = TransT . restoreT . restoreT
instance MonadTrans (TransT c) where
lift = TransT . lift . lift
instance MonadResource m => MonadResource (TransT c m) where
liftResourceT = lift . liftResourceT
instance MonadRandom m => MonadRandom (TransT c m) where
getRandom = lift getRandom
getRandomR = lift . getRandomR
getRandoms = lift getRandoms
getRandomRs = lift . getRandomRs