{-# LANGUAGE Safe #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-|  This module contains a collection of monads that
   are defined in terms of the monad transformers from
   "MonadLib".   The definitions in this module are
   completely mechanical and so this module may become
   obsolete if support for automated derivations for instances
   becomes well supported across implementations.
 -}
module MonadLib.Monads (
  Reader, Writer, State, Exception, Cont,
  runReader, runWriter, runState, runException, runCont,
  module MonadLib
) where
import MonadLib
import MonadLib.Derive
import Control.Monad.Fix

newtype Reader    i a = R' { Reader i a -> ReaderT i Id a
unR :: ReaderT    i Id a }
newtype Writer    i a = W' { Writer i a -> WriterT i Id a
unW :: WriterT    i Id a }
newtype State     i a = S' { State i a -> StateT i Id a
unS :: StateT     i Id a }
newtype Exception i a = X' { Exception i a -> ExceptionT i Id a
unX :: ExceptionT i Id a }
newtype Cont      i a = C' { Cont i a -> ContT i Id a
unC :: ContT      i Id a }

iso_R :: Iso (ReaderT i Id) (Reader i)
iso_W :: Iso (WriterT i Id) (Writer i)
iso_S :: Iso (StateT i Id) (State i)
iso_X :: Iso (ExceptionT i Id) (Exception i)
iso_C :: Iso (ContT i Id) (Cont i)

iso_R :: Iso (ReaderT i Id) (Reader i)
iso_R = (forall a. ReaderT i Id a -> Reader i a)
-> (forall a. Reader i a -> ReaderT i Id a)
-> Iso (ReaderT i Id) (Reader i)
forall (m :: * -> *) (n :: * -> *).
(forall a. m a -> n a) -> (forall a. n a -> m a) -> Iso m n
Iso forall a. ReaderT i Id a -> Reader i a
forall i a. ReaderT i Id a -> Reader i a
R' forall a. Reader i a -> ReaderT i Id a
forall i a. Reader i a -> ReaderT i Id a
unR
iso_W :: Iso (WriterT i Id) (Writer i)
iso_W = (forall a. WriterT i Id a -> Writer i a)
-> (forall a. Writer i a -> WriterT i Id a)
-> Iso (WriterT i Id) (Writer i)
forall (m :: * -> *) (n :: * -> *).
(forall a. m a -> n a) -> (forall a. n a -> m a) -> Iso m n
Iso forall a. WriterT i Id a -> Writer i a
forall i a. WriterT i Id a -> Writer i a
W' forall a. Writer i a -> WriterT i Id a
forall i a. Writer i a -> WriterT i Id a
unW
iso_S :: Iso (StateT i Id) (State i)
iso_S = (forall a. StateT i Id a -> State i a)
-> (forall a. State i a -> StateT i Id a)
-> Iso (StateT i Id) (State i)
forall (m :: * -> *) (n :: * -> *).
(forall a. m a -> n a) -> (forall a. n a -> m a) -> Iso m n
Iso forall a. StateT i Id a -> State i a
forall i a. StateT i Id a -> State i a
S' forall a. State i a -> StateT i Id a
forall i a. State i a -> StateT i Id a
unS
iso_X :: Iso (ExceptionT i Id) (Exception i)
iso_X = (forall a. ExceptionT i Id a -> Exception i a)
-> (forall a. Exception i a -> ExceptionT i Id a)
-> Iso (ExceptionT i Id) (Exception i)
forall (m :: * -> *) (n :: * -> *).
(forall a. m a -> n a) -> (forall a. n a -> m a) -> Iso m n
Iso forall a. ExceptionT i Id a -> Exception i a
forall i a. ExceptionT i Id a -> Exception i a
X' forall a. Exception i a -> ExceptionT i Id a
forall i a. Exception i a -> ExceptionT i Id a
unX
iso_C :: Iso (ContT i Id) (Cont i)
iso_C = (forall a. ContT i Id a -> Cont i a)
-> (forall a. Cont i a -> ContT i Id a)
-> Iso (ContT i Id) (Cont i)
forall (m :: * -> *) (n :: * -> *).
(forall a. m a -> n a) -> (forall a. n a -> m a) -> Iso m n
Iso forall a. ContT i Id a -> Cont i a
forall i a. ContT i Id a -> Cont i a
C' forall a. Cont i a -> ContT i Id a
forall i a. Cont i a -> ContT i Id a
unC

instance               BaseM (Reader    i) (Reader    i) where inBase :: Reader i a -> Reader i a
inBase = Reader i a -> Reader i a
forall a. a -> a
id
instance (Monoid i) => BaseM (Writer    i) (Writer    i) where inBase :: Writer i a -> Writer i a
inBase = Writer i a -> Writer i a
forall a. a -> a
id
instance               BaseM (State     i) (State     i) where inBase :: State i a -> State i a
inBase = State i a -> State i a
forall a. a -> a
id
instance               BaseM (Exception i) (Exception i) where inBase :: Exception i a -> Exception i a
inBase = Exception i a -> Exception i a
forall a. a -> a
id
instance               BaseM (Cont      i) (Cont      i) where inBase :: Cont i a -> Cont i a
inBase = Cont i a -> Cont i a
forall a. a -> a
id

instance Monad (Reader i) where
  >>= :: Reader i a -> (a -> Reader i b) -> Reader i b
(>>=)   = Iso (ReaderT i Id) (Reader i)
-> Reader i a -> (a -> Reader i b) -> Reader i b
forall (m :: * -> *) (n :: * -> *) a b.
Monad m =>
Iso m n -> n a -> (a -> n b) -> n b
derive_bind Iso (ReaderT i Id) (Reader i)
forall i. Iso (ReaderT i Id) (Reader i)
iso_R

#if !MIN_VERSION_base(4,11,0)
  fail = error
#endif

instance (Monoid i) => Monad (Writer i) where
  >>= :: Writer i a -> (a -> Writer i b) -> Writer i b
(>>=)   = Iso (WriterT i Id) (Writer i)
-> Writer i a -> (a -> Writer i b) -> Writer i b
forall (m :: * -> *) (n :: * -> *) a b.
Monad m =>
Iso m n -> n a -> (a -> n b) -> n b
derive_bind Iso (WriterT i Id) (Writer i)
forall i. Iso (WriterT i Id) (Writer i)
iso_W

#if !MIN_VERSION_base(4,11,0)
  fail = error
#endif

instance Monad (State i) where
  >>= :: State i a -> (a -> State i b) -> State i b
(>>=)   = Iso (StateT i Id) (State i)
-> State i a -> (a -> State i b) -> State i b
forall (m :: * -> *) (n :: * -> *) a b.
Monad m =>
Iso m n -> n a -> (a -> n b) -> n b
derive_bind Iso (StateT i Id) (State i)
forall i. Iso (StateT i Id) (State i)
iso_S

#if !MIN_VERSION_base(4,11,0)
  fail = error
#endif


instance Monad (Exception i) where
  >>= :: Exception i a -> (a -> Exception i b) -> Exception i b
(>>=)   = Iso (ExceptionT i Id) (Exception i)
-> Exception i a -> (a -> Exception i b) -> Exception i b
forall (m :: * -> *) (n :: * -> *) a b.
Monad m =>
Iso m n -> n a -> (a -> n b) -> n b
derive_bind Iso (ExceptionT i Id) (Exception i)
forall i. Iso (ExceptionT i Id) (Exception i)
iso_X

#if !MIN_VERSION_base(4,11,0)
  fail = error
#endif

instance Monad (Cont i) where
  >>= :: Cont i a -> (a -> Cont i b) -> Cont i b
(>>=)   = Iso (ContT i Id) (Cont i)
-> Cont i a -> (a -> Cont i b) -> Cont i b
forall (m :: * -> *) (n :: * -> *) a b.
Monad m =>
Iso m n -> n a -> (a -> n b) -> n b
derive_bind Iso (ContT i Id) (Cont i)
forall i. Iso (ContT i Id) (Cont i)
iso_C

#if !MIN_VERSION_base(4,11,0)
  fail = error
#endif

instance               Functor (Reader    i) where fmap :: (a -> b) -> Reader i a -> Reader i b
fmap = Iso (ReaderT i Id) (Reader i)
-> (a -> b) -> Reader i a -> Reader i b
forall (m :: * -> *) (n :: * -> *) a b.
Functor m =>
Iso m n -> (a -> b) -> n a -> n b
derive_fmap Iso (ReaderT i Id) (Reader i)
forall i. Iso (ReaderT i Id) (Reader i)
iso_R
instance (Monoid i) => Functor (Writer    i) where fmap :: (a -> b) -> Writer i a -> Writer i b
fmap = Iso (WriterT i Id) (Writer i)
-> (a -> b) -> Writer i a -> Writer i b
forall (m :: * -> *) (n :: * -> *) a b.
Functor m =>
Iso m n -> (a -> b) -> n a -> n b
derive_fmap Iso (WriterT i Id) (Writer i)
forall i. Iso (WriterT i Id) (Writer i)
iso_W
instance               Functor (State     i) where fmap :: (a -> b) -> State i a -> State i b
fmap = Iso (StateT i Id) (State i) -> (a -> b) -> State i a -> State i b
forall (m :: * -> *) (n :: * -> *) a b.
Functor m =>
Iso m n -> (a -> b) -> n a -> n b
derive_fmap Iso (StateT i Id) (State i)
forall i. Iso (StateT i Id) (State i)
iso_S
instance               Functor (Exception i) where fmap :: (a -> b) -> Exception i a -> Exception i b
fmap = Iso (ExceptionT i Id) (Exception i)
-> (a -> b) -> Exception i a -> Exception i b
forall (m :: * -> *) (n :: * -> *) a b.
Functor m =>
Iso m n -> (a -> b) -> n a -> n b
derive_fmap Iso (ExceptionT i Id) (Exception i)
forall i. Iso (ExceptionT i Id) (Exception i)
iso_X
instance               Functor (Cont      i) where fmap :: (a -> b) -> Cont i a -> Cont i b
fmap = Iso (ContT i Id) (Cont i) -> (a -> b) -> Cont i a -> Cont i b
forall (m :: * -> *) (n :: * -> *) a b.
Functor m =>
Iso m n -> (a -> b) -> n a -> n b
derive_fmap Iso (ContT i Id) (Cont i)
forall i. Iso (ContT i Id) (Cont i)
iso_C

instance Applicative (Reader i) where
  pure :: a -> Reader i a
pure = Iso (ReaderT i Id) (Reader i) -> a -> Reader i a
forall (m :: * -> *) (n :: * -> *) a.
Monad m =>
Iso m n -> a -> n a
derive_return Iso (ReaderT i Id) (Reader i)
forall i. Iso (ReaderT i Id) (Reader i)
iso_R
  <*> :: Reader i (a -> b) -> Reader i a -> Reader i b
(<*>) = Reader i (a -> b) -> Reader i a -> Reader i b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap

instance (Monoid i) => Applicative (Writer i) where
  pure :: a -> Writer i a
pure = Iso (WriterT i Id) (Writer i) -> a -> Writer i a
forall (m :: * -> *) (n :: * -> *) a.
Monad m =>
Iso m n -> a -> n a
derive_return Iso (WriterT i Id) (Writer i)
forall i. Iso (WriterT i Id) (Writer i)
iso_W
  <*> :: Writer i (a -> b) -> Writer i a -> Writer i b
(<*>) = Writer i (a -> b) -> Writer i a -> Writer i b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap

instance Applicative (State i) where
  pure :: a -> State i a
pure = Iso (StateT i Id) (State i) -> a -> State i a
forall (m :: * -> *) (n :: * -> *) a.
Monad m =>
Iso m n -> a -> n a
derive_return Iso (StateT i Id) (State i)
forall i. Iso (StateT i Id) (State i)
iso_S
  <*> :: State i (a -> b) -> State i a -> State i b
(<*>) = State i (a -> b) -> State i a -> State i b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap

instance Applicative (Exception i) where
  pure :: a -> Exception i a
pure = Iso (ExceptionT i Id) (Exception i) -> a -> Exception i a
forall (m :: * -> *) (n :: * -> *) a.
Monad m =>
Iso m n -> a -> n a
derive_return Iso (ExceptionT i Id) (Exception i)
forall i. Iso (ExceptionT i Id) (Exception i)
iso_X
  <*> :: Exception i (a -> b) -> Exception i a -> Exception i b
(<*>) = Exception i (a -> b) -> Exception i a -> Exception i b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap

instance Applicative (Cont i) where
  pure :: a -> Cont i a
pure = Iso (ContT i Id) (Cont i) -> a -> Cont i a
forall (m :: * -> *) (n :: * -> *) a.
Monad m =>
Iso m n -> a -> n a
derive_return Iso (ContT i Id) (Cont i)
forall i. Iso (ContT i Id) (Cont i)
iso_C
  <*> :: Cont i (a -> b) -> Cont i a -> Cont i b
(<*>) = Cont i (a -> b) -> Cont i a -> Cont i b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap

instance               MonadFix (Reader    i) where mfix :: (a -> Reader i a) -> Reader i a
mfix = Iso (ReaderT i Id) (Reader i) -> (a -> Reader i a) -> Reader i a
forall (m :: * -> *) (n :: * -> *) a.
MonadFix m =>
Iso m n -> (a -> n a) -> n a
derive_mfix Iso (ReaderT i Id) (Reader i)
forall i. Iso (ReaderT i Id) (Reader i)
iso_R
instance (Monoid i) => MonadFix (Writer    i) where mfix :: (a -> Writer i a) -> Writer i a
mfix = Iso (WriterT i Id) (Writer i) -> (a -> Writer i a) -> Writer i a
forall (m :: * -> *) (n :: * -> *) a.
MonadFix m =>
Iso m n -> (a -> n a) -> n a
derive_mfix Iso (WriterT i Id) (Writer i)
forall i. Iso (WriterT i Id) (Writer i)
iso_W
instance               MonadFix (State     i) where mfix :: (a -> State i a) -> State i a
mfix = Iso (StateT i Id) (State i) -> (a -> State i a) -> State i a
forall (m :: * -> *) (n :: * -> *) a.
MonadFix m =>
Iso m n -> (a -> n a) -> n a
derive_mfix Iso (StateT i Id) (State i)
forall i. Iso (StateT i Id) (State i)
iso_S
instance               MonadFix (Exception i) where mfix :: (a -> Exception i a) -> Exception i a
mfix = Iso (ExceptionT i Id) (Exception i)
-> (a -> Exception i a) -> Exception i a
forall (m :: * -> *) (n :: * -> *) a.
MonadFix m =>
Iso m n -> (a -> n a) -> n a
derive_mfix Iso (ExceptionT i Id) (Exception i)
forall i. Iso (ExceptionT i Id) (Exception i)
iso_X

instance ReaderM (Reader i) i where ask :: Reader i i
ask = Iso (ReaderT i Id) (Reader i) -> Reader i i
forall (m :: * -> *) i (n :: * -> *). ReaderM m i => Iso m n -> n i
derive_ask Iso (ReaderT i Id) (Reader i)
forall i. Iso (ReaderT i Id) (Reader i)
iso_R
instance (Monoid i) => WriterM (Writer i) i where put :: i -> Writer i ()
put = Iso (WriterT i Id) (Writer i) -> i -> Writer i ()
forall (m :: * -> *) i (n :: * -> *).
WriterM m i =>
Iso m n -> i -> n ()
derive_put Iso (WriterT i Id) (Writer i)
forall i. Iso (WriterT i Id) (Writer i)
iso_W
instance StateM (State i) i where get :: State i i
get = Iso (StateT i Id) (State i) -> State i i
forall (m :: * -> *) i (n :: * -> *). StateM m i => Iso m n -> n i
derive_get Iso (StateT i Id) (State i)
forall i. Iso (StateT i Id) (State i)
iso_S; set :: i -> State i ()
set = Iso (StateT i Id) (State i) -> i -> State i ()
forall (m :: * -> *) i (n :: * -> *).
StateM m i =>
Iso m n -> i -> n ()
derive_set Iso (StateT i Id) (State i)
forall i. Iso (StateT i Id) (State i)
iso_S
instance ExceptionM (Exception i) i where raise :: i -> Exception i a
raise = Iso (ExceptionT i Id) (Exception i) -> i -> Exception i a
forall (m :: * -> *) i (n :: * -> *) a.
ExceptionM m i =>
Iso m n -> i -> n a
derive_raise Iso (ExceptionT i Id) (Exception i)
forall i. Iso (ExceptionT i Id) (Exception i)
iso_X
instance ContM (Cont i) where callWithCC :: ((a -> Label (Cont i)) -> Cont i a) -> Cont i a
callWithCC = Iso (ContT i Id) (Cont i)
-> ((a -> Label (Cont i)) -> Cont i a) -> Cont i a
forall (m :: * -> *) (n :: * -> *) a.
ContM m =>
Iso m n -> ((a -> Label n) -> n a) -> n a
derive_callWithCC Iso (ContT i Id) (Cont i)
forall i. Iso (ContT i Id) (Cont i)
iso_C

runReader     :: i -> Reader i a -> a
runWriter     :: Writer i a -> (a,i)
runState      :: i -> State i a -> (a,i)
runException  :: Exception i a -> Either i a
runCont       :: (a -> i) -> Cont i a -> i

runReader :: i -> Reader i a -> a
runReader i
i  = Id a -> a
forall a. Id a -> a
runId (Id a -> a) -> (Reader i a -> Id a) -> Reader i a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. i -> ReaderT i Id a -> Id a
forall i (m :: * -> *) a. i -> ReaderT i m a -> m a
runReaderT i
i          (ReaderT i Id a -> Id a)
-> (Reader i a -> ReaderT i Id a) -> Reader i a -> Id a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reader i a -> ReaderT i Id a
forall i a. Reader i a -> ReaderT i Id a
unR
runWriter :: Writer i a -> (a, i)
runWriter    = Id (a, i) -> (a, i)
forall a. Id a -> a
runId (Id (a, i) -> (a, i))
-> (Writer i a -> Id (a, i)) -> Writer i a -> (a, i)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WriterT i Id a -> Id (a, i)
forall (m :: * -> *) i a. Monad m => WriterT i m a -> m (a, i)
runWriterT            (WriterT i Id a -> Id (a, i))
-> (Writer i a -> WriterT i Id a) -> Writer i a -> Id (a, i)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Writer i a -> WriterT i Id a
forall i a. Writer i a -> WriterT i Id a
unW
runState :: i -> State i a -> (a, i)
runState  i
i  = Id (a, i) -> (a, i)
forall a. Id a -> a
runId (Id (a, i) -> (a, i))
-> (State i a -> Id (a, i)) -> State i a -> (a, i)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. i -> StateT i Id a -> Id (a, i)
forall i (m :: * -> *) a. i -> StateT i m a -> m (a, i)
runStateT i
i           (StateT i Id a -> Id (a, i))
-> (State i a -> StateT i Id a) -> State i a -> Id (a, i)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. State i a -> StateT i Id a
forall i a. State i a -> StateT i Id a
unS
runException :: Exception i a -> Either i a
runException = Id (Either i a) -> Either i a
forall a. Id a -> a
runId (Id (Either i a) -> Either i a)
-> (Exception i a -> Id (Either i a))
-> Exception i a
-> Either i a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExceptionT i Id a -> Id (Either i a)
forall i (m :: * -> *) a. ExceptionT i m a -> m (Either i a)
runExceptionT         (ExceptionT i Id a -> Id (Either i a))
-> (Exception i a -> ExceptionT i Id a)
-> Exception i a
-> Id (Either i a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exception i a -> ExceptionT i Id a
forall i a. Exception i a -> ExceptionT i Id a
unX
runCont :: (a -> i) -> Cont i a -> i
runCont   a -> i
i  = Id i -> i
forall a. Id a -> a
runId (Id i -> i) -> (Cont i a -> Id i) -> Cont i a -> i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Id i) -> ContT i Id a -> Id i
forall a (m :: * -> *) i. (a -> m i) -> ContT i m a -> m i
runContT (i -> Id i
forall (m :: * -> *) a. Monad m => a -> m a
return (i -> Id i) -> (a -> i) -> a -> Id i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> i
i) (ContT i Id a -> Id i)
-> (Cont i a -> ContT i Id a) -> Cont i a -> Id i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Cont i a -> ContT i Id a
forall i a. Cont i a -> ContT i Id a
unC

instance RunReaderM (Reader i) i where
  local :: i -> Reader i a -> Reader i a
local = Iso (ReaderT i Id) (Reader i) -> i -> Reader i a -> Reader i a
forall (m :: * -> *) i (n :: * -> *) a.
RunReaderM m i =>
Iso m n -> i -> n a -> n a
derive_local Iso (ReaderT i Id) (Reader i)
forall i. Iso (ReaderT i Id) (Reader i)
iso_R

instance (Monoid i) => RunWriterM (Writer i) i where
  collect :: Writer i a -> Writer i (a, i)
collect = Iso (WriterT i Id) (Writer i) -> Writer i a -> Writer i (a, i)
forall (m :: * -> *) i (n :: * -> *) a.
RunWriterM m i =>
Iso m n -> n a -> n (a, i)
derive_collect Iso (WriterT i Id) (Writer i)
forall i. Iso (WriterT i Id) (Writer i)
iso_W

instance RunExceptionM (Exception i) i where
  try :: Exception i a -> Exception i (Either i a)
try = Iso (ExceptionT i Id) (Exception i)
-> Exception i a -> Exception i (Either i a)
forall (m :: * -> *) i (n :: * -> *) a.
RunExceptionM m i =>
Iso m n -> n a -> n (Either i a)
derive_try Iso (ExceptionT i Id) (Exception i)
forall i. Iso (ExceptionT i Id) (Exception i)
iso_X