{-# LANGUAGE Safe #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
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' { forall i a. Reader i a -> ReaderT i Id a
unR :: ReaderT i Id a }
newtype Writer i a = W' { forall i a. Writer i a -> WriterT i Id a
unW :: WriterT i Id a }
newtype State i a = S' { forall i a. State i a -> StateT i Id a
unS :: StateT i Id a }
newtype Exception i a = X' { forall i a. Exception i a -> ExceptionT i Id a
unX :: ExceptionT i Id a }
newtype Cont i a = C' { forall i a. 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 :: forall i. 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 ReaderT i Id a -> Reader i a
forall a. ReaderT i Id a -> Reader i a
forall i a. ReaderT i Id a -> Reader i a
R' Reader i a -> ReaderT i Id a
forall a. Reader i a -> ReaderT i Id a
forall i a. Reader i a -> ReaderT i Id a
unR
iso_W :: forall i. 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 WriterT i Id a -> Writer i a
forall a. WriterT i Id a -> Writer i a
forall i a. WriterT i Id a -> Writer i a
W' Writer i a -> WriterT i Id a
forall a. Writer i a -> WriterT i Id a
forall i a. Writer i a -> WriterT i Id a
unW
iso_S :: forall i. 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 StateT i Id a -> State i a
forall a. StateT i Id a -> State i a
forall i a. StateT i Id a -> State i a
S' State i a -> StateT i Id a
forall a. State i a -> StateT i Id a
forall i a. State i a -> StateT i Id a
unS
iso_X :: forall i. 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 ExceptionT i Id a -> Exception i a
forall a. ExceptionT i Id a -> Exception i a
forall i a. ExceptionT i Id a -> Exception i a
X' Exception i a -> ExceptionT i Id a
forall a. Exception i a -> ExceptionT i Id a
forall i a. Exception i a -> ExceptionT i Id a
unX
iso_C :: forall i. 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 ContT i Id a -> Cont i a
forall a. ContT i Id a -> Cont i a
forall i a. ContT i Id a -> Cont i a
C' Cont i a -> ContT i Id a
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 :: forall a. 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 :: forall a. 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 :: forall a. 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 :: forall a. 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 :: forall a. Cont i a -> Cont i a
inBase = Cont i a -> Cont i a
forall a. a -> a
id
instance Monad (Reader i) where
>>= :: forall a b. 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
>>= :: forall a b. 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
>>= :: forall a b. 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
>>= :: forall a b. 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
>>= :: forall a b. 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 :: forall a b. (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 :: forall a b. (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 :: forall a b. (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 :: forall a b. (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 :: forall a b. (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 :: forall a. 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
<*> :: forall a b. 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 :: forall a. 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
<*> :: forall a b. 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 :: forall a. 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
<*> :: forall a b. 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 :: forall a. 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
<*> :: forall a b. 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 :: forall a. 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
<*> :: forall a b. 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 :: forall a. (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 :: forall a. (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 :: forall a. (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 :: forall a. (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 :: forall a. 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 :: forall a. ((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 :: forall i a. 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 :: forall i a. 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 :: forall i a. 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 :: forall i a. 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 :: forall a i. (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 a. a -> Id a
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 :: forall a. 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 :: forall a. 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 :: forall a. 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