monad-logger (empty) → 0.2.0
raw patch · 4 files changed
+149/−0 lines, 4 filesdep +basedep +fast-loggerdep +resourcetsetup-changed
Dependencies added: base, fast-logger, resourcet, template-haskell, text, transformers
Files
- Control/Monad/Logger.hs +105/−0
- LICENSE +20/−0
- Setup.hs +2/−0
- monad-logger.cabal +22/−0
+ Control/Monad/Logger.hs view
@@ -0,0 +1,105 @@+{-# LANGUAGE TemplateHaskell #-}+module Control.Monad.Logger+ ( -- * MonadLogger+ MonadLogger(..)+ , LogLevel(..)+ -- * TH logging+ , logDebug+ , logInfo+ , logWarn+ , logError+ , logOther+ ) where++import Language.Haskell.TH.Syntax (Lift (lift), Q, Exp, Loc (Loc), qLocation)+import System.Log.FastLogger (ToLogStr)++import Data.Monoid (Monoid)++import Data.Functor.Identity (Identity)+import Control.Monad.ST (ST)+import qualified Control.Monad.ST.Lazy as Lazy (ST)++import Control.Monad.Trans.Identity ( IdentityT)+import Control.Monad.Trans.List ( ListT )+import Control.Monad.Trans.Maybe ( MaybeT )+import Control.Monad.Trans.Error ( ErrorT, Error)+import Control.Monad.Trans.Reader ( ReaderT )+import Control.Monad.Trans.Cont ( ContT )+import Control.Monad.Trans.State ( StateT )+import Control.Monad.Trans.Writer ( WriterT )+import Control.Monad.Trans.RWS ( RWST )+import Control.Monad.Trans.Resource ( ResourceT)++import qualified Control.Monad.Trans.RWS.Strict as Strict ( RWST )+import qualified Control.Monad.Trans.State.Strict as Strict ( StateT )+import qualified Control.Monad.Trans.Writer.Strict as Strict ( WriterT )++import Control.Monad.Trans.Class (MonadTrans)+import qualified Control.Monad.Trans.Class as Trans++import Data.Text (Text, pack, unpack)++data LogLevel = LevelDebug | LevelInfo | LevelWarn | LevelError | LevelOther Text+ deriving (Eq, Prelude.Show, Prelude.Read, Ord)++instance Lift LogLevel where+ lift LevelDebug = [|LevelDebug|]+ lift LevelInfo = [|LevelInfo|]+ lift LevelWarn = [|LevelWarn|]+ lift LevelError = [|LevelError|]+ lift (LevelOther x) = [|LevelOther $ pack $(lift $ unpack x)|]++class Monad m => MonadLogger m where+ monadLoggerLog :: ToLogStr msg => Loc -> LogLevel -> msg -> m ()++instance MonadLogger IO where monadLoggerLog _ _ _ = return ()+instance MonadLogger Identity where monadLoggerLog _ _ _ = return ()+instance MonadLogger (ST s) where monadLoggerLog _ _ _ = return ()+instance MonadLogger (Lazy.ST s) where monadLoggerLog _ _ _ = return ()++liftLog :: (MonadTrans t, MonadLogger m, ToLogStr msg) => Loc -> LogLevel -> msg -> t m ()+liftLog a b c = Trans.lift $ monadLoggerLog a b c++instance MonadLogger m => MonadLogger (IdentityT m) where monadLoggerLog = liftLog+instance MonadLogger m => MonadLogger (ListT m) where monadLoggerLog = liftLog+instance MonadLogger m => MonadLogger (MaybeT m) where monadLoggerLog = liftLog+instance (MonadLogger m, Error e) => MonadLogger (ErrorT e m) where monadLoggerLog = liftLog+instance MonadLogger m => MonadLogger (ReaderT r m) where monadLoggerLog = liftLog+instance MonadLogger m => MonadLogger (ContT r m) where monadLoggerLog = liftLog+instance MonadLogger m => MonadLogger (StateT s m) where monadLoggerLog = liftLog+instance (MonadLogger m, Monoid w) => MonadLogger (WriterT w m) where monadLoggerLog = liftLog+instance (MonadLogger m, Monoid w) => MonadLogger (RWST r w s m) where monadLoggerLog = liftLog+instance MonadLogger m => MonadLogger (ResourceT m) where monadLoggerLog = liftLog+instance MonadLogger m => MonadLogger (Strict.StateT s m) where monadLoggerLog = liftLog+instance (MonadLogger m, Monoid w) => MonadLogger (Strict.WriterT w m) where monadLoggerLog = liftLog+instance (MonadLogger m, Monoid w) => MonadLogger (Strict.RWST r w s m) where monadLoggerLog = liftLog++logTH :: LogLevel -> Q Exp+logTH level =+ [|monadLoggerLog $(qLocation >>= liftLoc) $(lift level) . (id :: Text -> Text)|]+ where+ liftLoc :: Loc -> Q Exp+ liftLoc (Loc a b c d e) = [|Loc $(lift a) $(lift b) $(lift c) $(lift d) $(lift e)|]++-- | Generates a function that takes a 'Text' and logs a 'LevelDebug' message. Usage:+--+-- > $(logDebug) "This is a debug log message"+logDebug :: Q Exp+logDebug = logTH LevelDebug++-- | See 'logDebug'+logInfo :: Q Exp+logInfo = logTH LevelInfo+-- | See 'logDebug'+logWarn :: Q Exp+logWarn = logTH LevelWarn+-- | See 'logDebug'+logError :: Q Exp+logError = logTH LevelError++-- | Generates a function that takes a 'Text' and logs a 'LevelOther' message. Usage:+--+-- > $(logOther "My new level") "This is a log message"+logOther :: Text -> Q Exp+logOther = logTH . LevelOther
+ LICENSE view
@@ -0,0 +1,20 @@+Copyright (c) 2012 Michael Snoyman, http://www.yesodweb.com/++Permission is hereby granted, free of charge, to any person obtaining+a copy of this software and associated documentation files (the+"Software"), to deal in the Software without restriction, including+without limitation the rights to use, copy, modify, merge, publish,+distribute, sublicense, and/or sell copies of the Software, and to+permit persons to whom the Software is furnished to do so, subject to+the following conditions:++The above copyright notice and this permission notice shall be+included in all copies or substantial portions of the Software.++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ monad-logger.cabal view
@@ -0,0 +1,22 @@+name: monad-logger+version: 0.2.0+synopsis: A class of monads which can log messages.+description: This package uses template-haskell for determining source code locations of messages.+homepage: https://github.com/kazu-yamamoto/logger+license: MIT+license-file: LICENSE+author: Michael Snoyman+maintainer: michael@snoyman.com+category: System+build-type: Simple+cabal-version: >=1.8+++library+ exposed-modules: Control.Monad.Logger+ build-depends: base >= 4 && < 5+ , template-haskell+ , transformers+ , text+ , resourcet >= 0.3 && < 0.4+ , fast-logger >= 0.2 && < 0.3