-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Arrow-like monad composition for monadLib.
--
-- Arrow-like monad composition for monadLib.
@package monadLib-compose
@version 0.1
-- | This module provides Arrow-like monad composition for monadLib. To be
-- more precise, it is Category-like, i.e. the parallels are to
-- Control.Category.Category.
--
-- Control.Category.Category generalises . and id
-- to arrows and categories. One such arrow is Kleisli, which
-- represents functions returning monadic values. Incidentally, that's
-- equivalent to ReaderT! So it turns out that it is possible to
-- generalise . and id to ReaderT (id is just
-- ask), as well as to many monad transformer stacks that embed a
-- ReaderT inside.
--
-- The motivation to create this module was a nagging feeling when
-- reading the documentation for hxt and HaXml:
-- composing filters is very nice, but the abundance of constant arrows,
-- and the lack of access to the very extensive set of monad combinators,
-- leads to duplicated effort and unwieldy code (in my humble opinion). I
-- think it is possible to gain similar functionality with a stack of
-- monad transformers including ReaderT, and ComposeM,
-- presented here.
module MonadLib.Compose
-- | Alias for ask. Compare with Control.Category.id.
mid :: (ReaderM m s) => m s
-- | Composable monads. Compare with Control.Category.Category.
-- Note that there are two different monad types involved in each
-- instance.
class (Monad m, Monad n) => ComposeM m n s t | m -> s, n -> t, n s -> m
mcompose :: (ComposeM m n s t) => m a -> n s -> n a
-- | Compose two monadic values from right to left. Compare with
-- Control.Category.<<<. f <<< g is
-- equivalent to mcompose f g.
(<<<) :: (ComposeM m n s t) => m a -> n s -> n a
-- | Compose two monadic values from left to right. Compare with
-- Control.Category.>>>. g >>> f is
-- equivalent to mcompose f g.
(>>>) :: (ComposeM m n s t) => n s -> m a -> n a
instance (ComposeM m n s t) => ComposeM (ChoiceT m) (ChoiceT n) s t
instance (ComposeM m n s t) => ComposeM (StateT i m) (StateT i n) s t
instance (ComposeM m n s t) => ComposeM (ExceptionT e m) (ExceptionT e n) s t
instance (ComposeM m n s t, Monoid w) => ComposeM (WriterT w m) (WriterT w n) s t
instance (ComposeM m n s t) => ComposeM (IdT m) (IdT n) s t
instance ComposeM (Reader s) (Reader t) s t
instance (Monad m) => ComposeM (ReaderT s m) (ReaderT t m) s t
instance ComposeM ((->) s) ((->) t) s t