monad-journal (empty) → 0.1.0.0
raw patch · 5 files changed
+124/−0 lines, 5 filesdep +basedep +mtldep +transformerssetup-changed
Dependencies added: base, mtl, transformers
Files
- Control/Monad/Journal.hs +17/−0
- Control/Monad/Journal/Class.hs +40/−0
- Control/Monad/Trans/Journal.hs +36/−0
- Setup.hs +2/−0
- monad-journal.cabal +29/−0
+ Control/Monad/Journal.hs view
@@ -0,0 +1,17 @@+{- |+Module : Control.Monad.Journal+Description : Journal monad class+Copyright : (c) Dimitri Sabadie+License : GPL-3++Maintainer : dimitri.sabadie@gmail.com+Stability : stable+Portability : portable++-}++module Control.Monad.Journal (+ module X+ ) where++import Control.Monad.Journal.Class as X
+ Control/Monad/Journal/Class.hs view
@@ -0,0 +1,40 @@+{-# LANGUAGE FunctionalDependencies #-}++{- |+Module : Control.Monad.Journal.Class+Description : `MonadJournal` class+Copyright : (c) Dimitri Sabadie+License : GPL-3++Maintainer : dimitri.sabadie@gmail.com+Stability : stable+Portability : portable++-}++module Control.Monad.Journal.Class (+ -- * MonadJournal+ MonadJournal(..)+ , sink+ , absorb+ ) where++import Control.Monad ( Monad )+import Control.Monad.Trans ( MonadIO, liftIO )+import Data.Monoid ( Monoid, mappend, mempty )++class (Monoid w, Monad m) => MonadJournal w m | m -> w where+ -- |Log something.+ journal :: w -> m ()+ -- |Extract the logs history.+ history :: m w+ -- |Clear the logs history.+ clear :: m ()+ +-- |Sink all logs history through `MonadIO` then clean it.+sink :: (MonadJournal w m, MonadIO m) => (w -> IO ()) -> m ()+sink out = history >>= liftIO . out >> clear++-- |Absorb a logs history and pass around the value.+absorb :: (MonadJournal w m) => (a,w) -> m a+absorb (a,w) = journal w >> return a
+ Control/Monad/Trans/Journal.hs view
@@ -0,0 +1,36 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++{- |+Module : Control.Monad.Trans.Journal+Description : Journal monad transformer+Copyright : (c) Dimitri Sabadie+License : GPL-3++Maintainer : dimitri.sabadie@gmail.com+Stability : stable+Portability : portable++-}++module Control.Monad.Trans.Journal (+ -- * LoggerT monad transformer+ LoggerT+ , runLoggerT+ , module X+ ) where++import Control.Applicative ( Applicative )+import Control.Monad.Journal.Class as X+import Control.Monad.Trans ( MonadTrans, MonadIO )+import Control.Monad.Trans.State ( StateT, get, modify, put, runStateT )+import Data.Monoid ( Monoid(..) )++newtype LoggerT w m a = LoggerT (StateT w m a) deriving (Applicative,Functor,Monad,MonadTrans,MonadIO)++instance (Monoid w, Monad m) => MonadJournal w (LoggerT w m) where+ journal = LoggerT . modify . flip mappend+ history = LoggerT get+ clear = LoggerT (put mempty)++runLoggerT :: (Monoid w, Monad m) => LoggerT w m a -> m (a,w)+runLoggerT (LoggerT s) = runStateT s mempty
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ monad-journal.cabal view
@@ -0,0 +1,29 @@+name: monad-journal+license: PublicDomain+version: 0.1.0.0+synopsis: On-the-fly logging typeclass and monad transformer +description: This package provides a typeclass for logging situations+ when you want to deal with the logs on-the-fly.+ It also exports a monad transformer that enables such a+ kind of logging in any monad.+homepage: https://github.com/skypers/monad-journal+author: DimitriSabadie+maintainer: dimitri.sabadie@gmail.com+category: Control+build-type: Simple++cabal-version: >= 1.10++library+ default-extensions: FlexibleInstances+ , MultiParamTypeClasses+ other-extensions: FunctionalDependencies+ , GeneralizedNewtypeDeriving+ exposed-modules: Control.Monad.Journal+ , Control.Monad.Journal.Class+ , Control.Monad.Trans.Journal+ build-depends: base >= 4.5 && < 4.6+ , mtl == 2.1.*+ , transformers == 0.3.*+ default-language: Haskell2010+