Safe Haskell | None |
---|---|
Language | Haskell2010 |
A logging effect based on MonadLog
.
Synopsis
- logMsg :: (NFData m, Member (Logs m) e) => m -> Eff e ()
- logMsgs :: (Traversable f, MonadPlus f, NFData1 f, NFData (f m), NFData m, Member (Logs m) e) => f m -> Eff e ()
- type HasLogWriter message logWriterMonad effects = (Member (Reader (LogWriter message logWriterMonad)) effects, Member (Logs message) effects, NFData message, Monad logWriterMonad, Lifted logWriterMonad effects)
- mapLogMessages :: forall m r b. (NFData m, Member (Logs m) r) => (m -> m) -> Eff r b -> Eff r b
- filterLogMessages :: forall m r b. (NFData m, Member (Logs m) r) => (m -> Bool) -> Eff r b -> Eff r b
- traverseLogMessages :: forall m r h b. (Member (Logs m) r, Monad h, Lifted h r, Member (Reader (LogWriter m h)) r) => (forall f. (MonadPlus f, Traversable f, NFData1 f) => f m -> h (f m)) -> Eff r b -> Eff r b
- changeLogWriter :: forall r m h a. (Monad h, Lifted h r, Member (Reader (LogWriter m h)) r) => (forall f. (Traversable f, NFData1 f, MonadPlus f) => f m -> Eff '[Reader (LogWriter m h), Lift h] ()) -> Eff r a -> Eff r a
- ignoreLogs :: forall message r a. Eff (Logs message ': r) a -> Eff r a
- traceLogs :: forall message r a. (message -> String) -> Eff (Logs message ': r) a -> Eff r a
- data LogWriter message writerM
- type LogWriterReader message writerM = Reader (LogWriter message writerM)
- foldingLogWriter :: (forall f. (MonadPlus f, Traversable f, NFData1 f) => f message -> writerM ()) -> LogWriter message writerM
- writeAllLogMessages :: (NFData1 f, MonadPlus f, Traversable f, Applicative writerM) => LogWriter message writerM -> f message -> writerM ()
- singleMessageLogWriter :: Applicative writerM => (message -> writerM ()) -> LogWriter message writerM
- multiMessageLogWriter :: Applicative writerM => (((message -> writerM ()) -> writerM ()) -> writerM ()) -> LogWriter message writerM
- askLogWriter :: forall m h r. Member (Reader (LogWriter m h)) r => Eff r (LogWriter m h)
- data Logs m v
- writeLogs :: forall message writerM r a. (Applicative writerM, Lifted writerM r, NFData message) => LogWriter message writerM -> Eff (Logs message ': (Reader (LogWriter message writerM) ': r)) a -> Eff r a
- runLogs :: forall m h e b. (Applicative h, Lifted h e, Member (LogWriterReader m h) e, NFData m) => Eff (Logs m ': e) b -> Eff e b
Documentation
logMsg :: (NFData m, Member (Logs m) e) => m -> Eff e () Source #
Log a message. The message is reduced to normal form (strict).
logMsgs :: (Traversable f, MonadPlus f, NFData1 f, NFData (f m), NFData m, Member (Logs m) e) => f m -> Eff e () Source #
Log a bunch of messages. This might be more efficient than calling logMsg
multiple times.
The messages are reduced to normal form (strict).
type HasLogWriter message logWriterMonad effects = (Member (Reader (LogWriter message logWriterMonad)) effects, Member (Logs message) effects, NFData message, Monad logWriterMonad, Lifted logWriterMonad effects) Source #
A constraint that combines constraints for logging into any log writer monad.
mapLogMessages :: forall m r b. (NFData m, Member (Logs m) r) => (m -> m) -> Eff r b -> Eff r b Source #
Map a pure function over log messages.
filterLogMessages :: forall m r b. (NFData m, Member (Logs m) r) => (m -> Bool) -> Eff r b -> Eff r b Source #
Keep only those messages, for which a predicate holds.
E.g. to keep only messages which begin with OMG
:
filterLogMessages (\msg -> case msg of 'O':'M':'G':_ -> True _ -> False) (do logMsg "this message will not be logged" logMsg "OMG logged")
traverseLogMessages :: forall m r h b. (Member (Logs m) r, Monad h, Lifted h r, Member (Reader (LogWriter m h)) r) => (forall f. (MonadPlus f, Traversable f, NFData1 f) => f m -> h (f m)) -> Eff r b -> Eff r b Source #
Map an Eff
ectful function over every bunch of log messages.
For example, to attach the current time to each log message:
appendTimestamp :: ( Member (Logs String) e , Lifted IO e) => Eff e a -> Eff e a appendTimestamp = traverseLogMessages $ \ms -> do now <- getCurrentTime return (fmap (show now ++) ms)
changeLogWriter :: forall r m h a. (Monad h, Lifted h r, Member (Reader (LogWriter m h)) r) => (forall f. (Traversable f, NFData1 f, MonadPlus f) => f m -> Eff '[Reader (LogWriter m h), Lift h] ()) -> Eff r a -> Eff r a Source #
ignoreLogs :: forall message r a. Eff (Logs message ': r) a -> Eff r a Source #
Throw away all log messages.
traceLogs :: forall message r a. (message -> String) -> Eff (Logs message ': r) a -> Eff r a Source #
data LogWriter message writerM Source #
A function that takes a log message and returns an effect that logs the message.
Instances
type LogWriterReader message writerM = Reader (LogWriter message writerM) Source #
Type alias for the Reader
effect that writes logs
foldingLogWriter :: (forall f. (MonadPlus f, Traversable f, NFData1 f) => f message -> writerM ()) -> LogWriter message writerM Source #
Create a LogWriter
from a function that can write
a Traversable
container.
writeAllLogMessages :: (NFData1 f, MonadPlus f, Traversable f, Applicative writerM) => LogWriter message writerM -> f message -> writerM () Source #
Efficiently apply the LogWriter
to a Traversable
container of log
messages.
singleMessageLogWriter :: Applicative writerM => (message -> writerM ()) -> LogWriter message writerM Source #
Create a LogWriter
from a function that is applied to each
individual log message. NOTE: This is probably the simplest,
but also the most inefficient and annoying way to make
a LogWriter
. Better use foldingLogWriter
or even
multiMessageLogWriter
.
multiMessageLogWriter :: Applicative writerM => (((message -> writerM ()) -> writerM ()) -> writerM ()) -> LogWriter message writerM Source #
Create a LogWriter
from a function that is applied to each
individual log message. Don't be scared by the type signature,
here is an example file appender that re-opens the log file
everytime a bunch of log messages are written:
fileAppender fn = multiMessageLogWriter (\writeLogMessageWith -> withFile fn AppendMode (writeLogMessageWith . hPutStrLn))
askLogWriter :: forall m h r. Member (Reader (LogWriter m h)) r => Eff r (LogWriter m h) Source #
Get the current LogWriter
This effect sends log messages.
The logs are not sent one-by-one, but always in batches of
containers that must be Traversable
and MonadPlus
instances.
Log messages are consumed by LogWriter
s installed via
runLogs
or more high level functions like writeLogs
.
Instances
writeLogs :: forall message writerM r a. (Applicative writerM, Lifted writerM r, NFData message) => LogWriter message writerM -> Eff (Logs message ': (Reader (LogWriter message writerM) ': r)) a -> Eff r a Source #
Handle log message effects by a monadic action, e.g. an IO action
to send logs to the console output or a log-server.
The monadic log writer action is wrapped in a newtype called
LogWriter
.
Use the smart constructors below to create them, e.g.
foldingLogWriter
, singleMessageLogWriter
or
mulitMessageLogWriter
.