log-warper 1.0.3 → 1.0.4
raw patch · 3 files changed
+59/−19 lines, 3 filesdep +mmorphPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: mmorph
API changes (from Hackage documentation)
+ System.Wlog.CanLog: NamedPureLogger :: PureLogger (LoggerNameBox m) a -> NamedPureLogger m a
+ System.Wlog.CanLog: [runNamedPureLogger] :: NamedPureLogger m a -> PureLogger (LoggerNameBox m) a
+ System.Wlog.CanLog: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (System.Wlog.CanLog.NamedPureLogger m)
+ System.Wlog.CanLog: instance Control.Monad.Catch.MonadThrow m => Control.Monad.Catch.MonadThrow (System.Wlog.CanLog.NamedPureLogger m)
+ System.Wlog.CanLog: instance Control.Monad.Catch.MonadThrow m => Control.Monad.Catch.MonadThrow (System.Wlog.CanLog.PureLogger m)
+ System.Wlog.CanLog: instance Control.Monad.Error.Class.MonadError e m => Control.Monad.Error.Class.MonadError e (System.Wlog.CanLog.NamedPureLogger m)
+ System.Wlog.CanLog: instance Control.Monad.Morph.MFunctor System.Wlog.CanLog.NamedPureLogger
+ System.Wlog.CanLog: instance Control.Monad.Morph.MFunctor System.Wlog.CanLog.PureLogger
+ System.Wlog.CanLog: instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (System.Wlog.CanLog.NamedPureLogger m)
+ System.Wlog.CanLog: instance Control.Monad.State.Class.MonadState s m => Control.Monad.State.Class.MonadState s (System.Wlog.CanLog.NamedPureLogger m)
+ System.Wlog.CanLog: instance Control.Monad.Trans.Class.MonadTrans System.Wlog.CanLog.NamedPureLogger
+ System.Wlog.CanLog: instance GHC.Base.Applicative m => GHC.Base.Applicative (System.Wlog.CanLog.NamedPureLogger m)
+ System.Wlog.CanLog: instance GHC.Base.Functor m => GHC.Base.Functor (System.Wlog.CanLog.NamedPureLogger m)
+ System.Wlog.CanLog: instance GHC.Base.Monad m => Control.Monad.Writer.Class.MonadWriter (Data.DList.DList System.Wlog.CanLog.LogEvent) (System.Wlog.CanLog.NamedPureLogger m)
+ System.Wlog.CanLog: instance GHC.Base.Monad m => GHC.Base.Monad (System.Wlog.CanLog.NamedPureLogger m)
+ System.Wlog.CanLog: instance GHC.Base.Monad m => System.Wlog.CanLog.CanLog (System.Wlog.CanLog.NamedPureLogger m)
+ System.Wlog.CanLog: instance GHC.Base.Monad m => System.Wlog.LoggerNameBox.HasLoggerName (System.Wlog.CanLog.NamedPureLogger m)
+ System.Wlog.CanLog: newtype NamedPureLogger m a
+ System.Wlog.LoggerNameBox: instance Control.Monad.Error.Class.MonadError e m => Control.Monad.Error.Class.MonadError e (System.Wlog.LoggerNameBox.LoggerNameBox m)
+ System.Wlog.LoggerNameBox: instance Control.Monad.Morph.MFunctor System.Wlog.LoggerNameBox.LoggerNameBox
- System.Wlog.CanLog: launchNamedPureLog :: WithLogger m => PureLogger (LoggerNameBox m) a -> m a
+ System.Wlog.CanLog: launchNamedPureLog :: (WithLogger n, Monad m) => (forall f. Functor f => m (f a) -> n (f b)) -> NamedPureLogger m a -> n b
- System.Wlog.CanLog: launchPureLog :: CanLog m => PureLogger m a -> m a
+ System.Wlog.CanLog: launchPureLog :: (CanLog n, Monad m) => (forall f. Functor f => m (f a) -> n (f b)) -> PureLogger m a -> n b
- System.Wlog.CanLog: runNamedPureLog :: (Monad m, HasLoggerName m) => PureLogger (LoggerNameBox m) a -> m (a, [LogEvent])
+ System.Wlog.CanLog: runNamedPureLog :: (Monad m, HasLoggerName m) => NamedPureLogger m a -> m (a, [LogEvent])
Files
- log-warper.cabal +2/−1
- src/System/Wlog/CanLog.hs +50/−17
- src/System/Wlog/LoggerNameBox.hs +7/−1
log-warper.cabal view
@@ -1,5 +1,5 @@ name: log-warper-version: 1.0.3+version: 1.0.4 synopsis: Flexible, configurable, monadic and pretty logging homepage: https://github.com/serokell/log-warper license: MIT@@ -54,6 +54,7 @@ , lens >= 4.14 , monad-control >= 1.0.1.0 , monad-loops >= 0.4.3+ , mmorph >= 1.0.9 , mtl >= 2.2.1 , network >= 2.6.3.1 , safecopy >= 0.9.1
src/System/Wlog/CanLog.hs view
@@ -5,6 +5,7 @@ {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE OverloadedLists #-}+{-# LANGUAGE Rank2Types #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-}@@ -25,6 +26,8 @@ , dispatchEvents , runPureLog , launchPureLog++ , NamedPureLogger (..) , runNamedPureLog , launchNamedPureLog @@ -40,6 +43,7 @@ import Control.Concurrent (modifyMVar_) import Control.Monad.Base (MonadBase) import Control.Monad.Except (ExceptT, MonadError)+import Control.Monad.Morph (MFunctor (..)) import qualified Control.Monad.RWS as RWSLazy import qualified Control.Monad.RWS.Strict as RWSStrict import qualified Control.Monad.State.Strict as StateStrict@@ -123,23 +127,19 @@ newtype PureLogger m a = PureLogger { runPureLogger :: WriterT (DL.DList LogEvent) m a } deriving (Functor, Applicative, Monad, MonadTrans, MonadWriter (DL.DList LogEvent),- MonadBase b, MonadState s, MonadReader r, MonadError e, HasLoggerName)+ MonadBase b, MonadState s, MonadReader r, MonadError e, MonadThrow,+ HasLoggerName) instance Monad m => CanLog (PureLogger m) where dispatchMessage leLoggerName leSeverity leMessage = tell [LogEvent{..}] +instance MFunctor PureLogger where+ hoist f = PureLogger . hoist f . runPureLogger+ -- | Return log of pure logging action as list of 'LogEvent'. runPureLog :: Monad m => PureLogger m a -> m (a, [LogEvent]) runPureLog = fmap (second toList) . runWriterT . runPureLogger --- | Return log of pure logging action as list of 'LogEvent',--- using logger name provided by context.-runNamedPureLog- :: (Monad m, HasLoggerName m)- => PureLogger (LoggerNameBox m) a -> m (a, [LogEvent])-runNamedPureLog action =- getLoggerName >>= (`usingLoggerName` runPureLog action)- -- | Logs all 'LogEvent'`s from given list. This function supposed to -- be used after 'runPureLog'. dispatchEvents :: CanLog m => [LogEvent] -> m ()@@ -148,16 +148,49 @@ dispatchLogEvent (LogEvent name sev t) = dispatchMessage name sev t -- | Performs actual logging once given action completes.-launchPureLog :: CanLog m => PureLogger m a -> m a-launchPureLog action = do- (res, logs) <- runPureLog action- dispatchEvents logs- return res+launchPureLog+ :: (CanLog n, Monad m)+ => (forall f. Functor f => m (f a) -> n (f b))+ -> PureLogger m a+ -> n b+launchPureLog hoist' action = do+ (logs, res) <- hoist' $ swap <$> runPureLog action+ res <$ dispatchEvents logs +newtype NamedPureLogger m a = NamedPureLogger+ { runNamedPureLogger :: PureLogger (LoggerNameBox m) a+ } deriving (Functor, Applicative, Monad, MonadWriter (DL.DList LogEvent),+ MonadBase b, MonadState s, MonadReader r, MonadError e,+ MonadThrow, HasLoggerName)++instance MonadTrans NamedPureLogger where+ lift = NamedPureLogger . lift . lift++instance Monad m => CanLog (NamedPureLogger m) where+ dispatchMessage name sev msg =+ NamedPureLogger $ dispatchMessage name sev msg++instance MFunctor NamedPureLogger where+ hoist f = NamedPureLogger . hoist (hoist f) . runNamedPureLogger++-- | Return log of pure logging action as list of 'LogEvent',+-- using logger name provided by context.+runNamedPureLog+ :: (Monad m, HasLoggerName m)+ => NamedPureLogger m a -> m (a, [LogEvent])+runNamedPureLog (NamedPureLogger action) =+ getLoggerName >>= (`usingLoggerName` runPureLog action)+ -- | Similar as `launchPureLog`, but provides logger name from current context.-launchNamedPureLog :: WithLogger m => PureLogger (LoggerNameBox m) a -> m a-launchNamedPureLog action =- getLoggerName >>= (`usingLoggerName` launchPureLog action)+launchNamedPureLog+ :: (WithLogger n, Monad m)+ => (forall f. Functor f => m (f a) -> n (f b))+ -> NamedPureLogger m a+ -> n b+launchNamedPureLog hoist' (NamedPureLogger action) = do+ name <- getLoggerName+ (logs, res) <- hoist' $ swap <$> usingLoggerName name (runPureLog action)+ res <$ dispatchEvents logs -- | Shortcut for 'logMessage' to use according severity. logDebug, logInfo, logNotice, logWarning, logError
src/System/Wlog/LoggerNameBox.hs view
@@ -16,7 +16,9 @@ import Control.Monad.Base (MonadBase) import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow) import Control.Monad.Except (ExceptT (..), mapExceptT)+import Control.Monad.Except (MonadError) import Control.Monad.Fix (MonadFix)+import Control.Monad.Morph (MFunctor (..)) import Control.Monad.Reader (MonadReader (..), ReaderT, mapReaderT, runReaderT) import qualified Control.Monad.RWS as RWSLazy@@ -83,7 +85,8 @@ newtype LoggerNameBox m a = LoggerNameBox { loggerNameBoxEntry :: ReaderT LoggerName m a } deriving (Functor, Applicative, Monad, MonadIO, MonadTrans, MonadBase b,- MonadThrow, MonadCatch, MonadMask, MonadState s, MonadFix)+ MonadThrow, MonadCatch, MonadMask, MonadError e, MonadState s,+ MonadFix) instance MonadReader r m => MonadReader r (LoggerNameBox m) where ask = lift ask@@ -95,6 +98,9 @@ liftBaseWith io = LoggerNameBox $ liftBaseWith $ \runInBase -> io $ runInBase . loggerNameBoxEntry restoreM = LoggerNameBox . restoreM++instance MFunctor LoggerNameBox where+ hoist f = LoggerNameBox . hoist f . loggerNameBoxEntry -- | Runs a `LoggerNameBox` with specified initial `LoggerName`. usingLoggerName :: LoggerName -> LoggerNameBox m a -> m a