-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Pure logger typeclass and monad transformer
--   
--   This package provides a typeclass for logging in pure code, or more
--   generally, in any kind of context. You can do whatever you want with
--   logs, especially get them, clear them or even sink them through
--   <a>IO</a> if you're logging in <tt>(MonadIO m) =&gt; m</tt>.
@package monad-journal
@version 0.7.1


-- | <tt>MonadWriter</tt> on steroids.
--   
--   <a>MonadJournal</a> is a more controlable version of
--   <tt>MonadWriter</tt> because it enables you to access the
--   <a>Monoid</a> being computed up. You can then access logs inside the
--   computation itself, whereas you cannot with <tt>MonadWriter</tt> –
--   unless you use specific functions like <tt>listen</tt>, but that still
--   stacks <a>Monoid</a> in the monad.
--   
--   Typically, you can use <a>MonadJournal</a> when you come across the
--   logging problem and you need logs as long as you proceed.
module Control.Monad.Journal.Class

-- | This typeclass provides the ability to accumulate <a>Monoid</a> in a
--   monad via the <a>journal</a> function; to get them via the
--   <a>history</a> function and finally, to purge them all with the
--   <a>clear</a> function.
--   
--   In most cases, you won’t need <a>history</a> neither <a>clear</a>.
--   There’s a cool function that combines both and enables you to deal
--   with the <a>Monoid</a>: <a>sink</a>.
class (Monoid w, Monad m) => MonadJournal w m | m -> w
journal :: MonadJournal w m => w -> m ()
history :: MonadJournal w m => m w
clear :: MonadJournal w m => m ()

-- | Sink all logs history through <a>MonadIO</a> then clean it.
sink :: (MonadJournal w m, MonadIO m) => (w -> IO ()) -> m ()

-- | Absorb a logs history and pass around the value.
absorb :: MonadJournal w m => (a, w) -> m a
instance (Monad m, Monoid w, MonadJournal w m) => MonadJournal w (EitherT e m)
instance (Monad m, Monoid w, Monoid q, MonadJournal w m) => MonadJournal w (WriterT q m)
instance (Monad m, Monoid w, MonadJournal w m) => MonadJournal w (StateT s m)
instance (Monad m, Monoid w, MonadJournal w m) => MonadJournal w (ReaderT r m)
instance (Monad m, Monoid w, MonadJournal w m) => MonadJournal w (RWST r w s m)
instance (Monad m, Monoid w, MonadJournal w m) => MonadJournal w (MaybeT m)
instance (Monad m, Monoid w, MonadJournal w m) => MonadJournal w (ListT m)
instance (Monad m, Monoid w, MonadJournal w m) => MonadJournal w (IdentityT m)


-- | Monad transformer version of <a>MonadJournal</a>. <a>JournalT</a>
--   provides journaling over a monad.
--   
--   This modules defines a few useful instances. Check the list below for
--   further information.
module Control.Monad.Trans.Journal

-- | Transformer version of <a>MonadJournal</a>.
data JournalT w m a

-- | Retrieve the value and the log history.
runJournalT :: (Monoid w, Monad m) => JournalT w m a -> m (a, w)

-- | Only retrieve the value.
evalJournalT :: (Monoid w, Monad m) => JournalT w m a -> m a

-- | Only retrieve the log history.
execJournalT :: (Monoid w, Monad m) => JournalT w m a -> m w
instance (Monad m, Functor m) => Applicative (JournalT w m)
instance (Functor m, MonadPlus m) => Alternative (JournalT w m)
instance Functor m => Functor (JournalT w m)
instance Monad m => Monad (JournalT w m)
instance MonadError e m => MonadError e (JournalT w m)
instance MonadIO m => MonadIO (JournalT w m)
instance MonadPlus m => MonadPlus (JournalT w m)
instance MonadReader r m => MonadReader r (JournalT w m)
instance MonadTrans (JournalT w)
instance MonadWriter w' m => MonadWriter w' (JournalT w m)
instance (Monoid w, MonadBaseControl b m) => MonadBaseControl b (JournalT w m)
instance Monoid w => MonadTransControl (JournalT w)
instance MonadBase b m => MonadBase b (JournalT w m)
instance MonadState s m => MonadState s (JournalT w m)
instance (Monoid w, Monad m) => MonadJournal w (JournalT w m)


-- | This module re-exports anything about the <a>MonadJournal</a>
--   *typeclass*.
module Control.Monad.Journal
