extensible-effects-concurrent 0.30.0 → 0.31.0
raw patch · 34 files changed
+641/−680 lines, 34 filesdep ~monad-controlPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: monad-control
API changes (from Hackage documentation)
- Control.Eff.Concurrent.Protocol.Broker: instance (Control.Eff.Log.Handler.LogIo q, Control.Eff.Concurrent.Protocol.Broker.TangibleBroker p, Control.Eff.Concurrent.Protocol.Tangible (Control.Eff.Concurrent.Protocol.Broker.ChildId p), Data.Typeable.Internal.Typeable (Control.Eff.Concurrent.Protocol.EffectfulServer.ServerPdu p), Control.Eff.Concurrent.Protocol.EffectfulServer.Server p (Control.Eff.Concurrent.Process.Processes q), Control.Eff.Concurrent.Process.HasProcesses (Control.Eff.Concurrent.Protocol.EffectfulServer.ServerEffects p (Control.Eff.Concurrent.Process.Processes q)) q) => Control.Eff.Concurrent.Protocol.StatefulServer.Server (Control.Eff.Concurrent.Protocol.Broker.Broker p) (Control.Eff.Concurrent.Process.Processes q)
- Control.Eff.Concurrent.Pure: -- method.
- Control.Eff.Concurrent.Pure: captureLogWriter :: LogWriter CaptureLogWriter
- Control.Eff.Concurrent.Pure: censorLogsM :: (LogsTo h e, Monad (LogWriterM h)) => (LogMessage -> LogWriterM h LogMessage) -> Eff e a -> Eff e a
- Control.Eff.Concurrent.Pure: class HandleLogWriter (writer :: Type -> Type) where {
- Control.Eff.Concurrent.Pure: data LogWriterReader h v
- Control.Eff.Concurrent.Pure: defaultIoLogWriter :: Text -> Facility -> LogWriter (Lift IO) -> LogWriter (Lift IO)
- Control.Eff.Concurrent.Pure: handleLogWriterEffect :: (HandleLogWriter writer, Member writer e) => LogWriterM writer () -> Eff e ()
- Control.Eff.Concurrent.Pure: mappingLogWriterM :: Monad (LogWriterM e) => (LogMessage -> LogWriterM e LogMessage) -> LogWriter e -> LogWriter e
- Control.Eff.Concurrent.Pure: mkLogWriterIO :: HasCallStack => (LogMessage -> IO ()) -> LogWriter (Lift IO)
- Control.Eff.Concurrent.Pure: printLogMessage :: LogMessage -> IO ()
- Control.Eff.Concurrent.Pure: runCaptureLogWriter :: Eff (CaptureLogWriter : e) a -> Eff e (a, [LogMessage])
- Control.Eff.Concurrent.Pure: type CaptureLogWriter = Writer LogMessage
- Control.Eff.Concurrent.Pure: type CaptureLogs a = LogWriterM CaptureLogWriter a
- Control.Eff.Concurrent.Pure: type LogIo e = (LogsTo (Lift IO) e, Lifted IO e)
- Control.Eff.Concurrent.Pure: type LogsTo h e = (Member Logs e, HandleLogWriter h, Member h e, SetMember LogWriterReader (LogWriterReader h) e)
- Control.Eff.Concurrent.Pure: withIoLogging :: Lifted IO e => LogWriter (Lift IO) -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
- Control.Eff.Concurrent.Pure: withSomeLogging :: forall h e a. (Applicative (LogWriterM h), LogsTo h (Logs : (LogWriterReader h : e))) => Eff (Logs : (LogWriterReader h : e)) a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: -- method.
- Control.Eff.Concurrent.SingleThreaded: captureLogWriter :: LogWriter CaptureLogWriter
- Control.Eff.Concurrent.SingleThreaded: censorLogsM :: (LogsTo h e, Monad (LogWriterM h)) => (LogMessage -> LogWriterM h LogMessage) -> Eff e a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: class HandleLogWriter (writer :: Type -> Type) where {
- Control.Eff.Concurrent.SingleThreaded: data LogWriterReader h v
- Control.Eff.Concurrent.SingleThreaded: defaultIoLogWriter :: Text -> Facility -> LogWriter (Lift IO) -> LogWriter (Lift IO)
- Control.Eff.Concurrent.SingleThreaded: handleLogWriterEffect :: (HandleLogWriter writer, Member writer e) => LogWriterM writer () -> Eff e ()
- Control.Eff.Concurrent.SingleThreaded: mappingLogWriterM :: Monad (LogWriterM e) => (LogMessage -> LogWriterM e LogMessage) -> LogWriter e -> LogWriter e
- Control.Eff.Concurrent.SingleThreaded: mkLogWriterIO :: HasCallStack => (LogMessage -> IO ()) -> LogWriter (Lift IO)
- Control.Eff.Concurrent.SingleThreaded: printLogMessage :: LogMessage -> IO ()
- Control.Eff.Concurrent.SingleThreaded: runCaptureLogWriter :: Eff (CaptureLogWriter : e) a -> Eff e (a, [LogMessage])
- Control.Eff.Concurrent.SingleThreaded: type CaptureLogWriter = Writer LogMessage
- Control.Eff.Concurrent.SingleThreaded: type CaptureLogs a = LogWriterM CaptureLogWriter a
- Control.Eff.Concurrent.SingleThreaded: type LogIo e = (LogsTo (Lift IO) e, Lifted IO e)
- Control.Eff.Concurrent.SingleThreaded: type LogsTo h e = (Member Logs e, HandleLogWriter h, Member h e, SetMember LogWriterReader (LogWriterReader h) e)
- Control.Eff.Concurrent.SingleThreaded: withIoLogging :: Lifted IO e => LogWriter (Lift IO) -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: withSomeLogging :: forall h e a. (Applicative (LogWriterM h), LogsTo h (Logs : (LogWriterReader h : e))) => Eff (Logs : (LogWriterReader h : e)) a -> Eff e a
- Control.Eff.Log: censorLogsM :: (LogsTo h e, Monad (LogWriterM h)) => (LogMessage -> LogWriterM h LogMessage) -> Eff e a -> Eff e a
- Control.Eff.Log: type LogIo e = (LogsTo (Lift IO) e, Lifted IO e)
- Control.Eff.Log: type LogsTo h e = (Member Logs e, HandleLogWriter h, Member h e, SetMember LogWriterReader (LogWriterReader h) e)
- Control.Eff.Log: withSomeLogging :: forall h e a. (Applicative (LogWriterM h), LogsTo h (Logs : (LogWriterReader h : e))) => Eff (Logs : (LogWriterReader h : e)) a -> Eff e a
- Control.Eff.Log.Examples: exampleLogCapture :: IO ()
- Control.Eff.Log.Examples: exampleLogPredicate :: HasCallStack => IO Int
- Control.Eff.Log.Handler: censorLogsM :: (LogsTo h e, Monad (LogWriterM h)) => (LogMessage -> LogWriterM h LogMessage) -> Eff e a -> Eff e a
- Control.Eff.Log.Handler: instance (Control.Monad.Base.MonadBase m m, Control.Eff.Internal.LiftedBase m e, Control.Eff.Log.Handler.LogsTo (Control.Eff.Internal.Lift m) (Control.Eff.Log.Handler.Logs : e)) => Control.Monad.Trans.Control.MonadBaseControl m (Control.Eff.Internal.Eff (Control.Eff.Log.Handler.Logs : e))
- Control.Eff.Log.Handler: instance (GHC.Base.Applicative m, Control.Eff.Internal.LiftedBase m e, Control.Monad.Catch.MonadCatch (Control.Eff.Internal.Eff e), Control.Eff.Log.Handler.LogsTo (Control.Eff.Internal.Lift m) (Control.Eff.Log.Handler.Logs : e)) => Control.Monad.Catch.MonadCatch (Control.Eff.Internal.Eff (Control.Eff.Log.Handler.Logs : e))
- Control.Eff.Log.Handler: instance (GHC.Base.Applicative m, Control.Eff.Internal.LiftedBase m e, Control.Monad.Catch.MonadMask (Control.Eff.Internal.Eff e), Control.Eff.Log.Handler.LogsTo (Control.Eff.Internal.Lift m) (Control.Eff.Log.Handler.Logs : e)) => Control.Monad.Catch.MonadMask (Control.Eff.Internal.Eff (Control.Eff.Log.Handler.Logs : e))
- Control.Eff.Log.Handler: instance Control.Eff.Log.Writer.HandleLogWriter Control.Eff.Log.Handler.Logs
- Control.Eff.Log.Handler: instance GHC.Base.Applicative (Control.Eff.Log.Writer.LogWriterM Control.Eff.Log.Handler.Logs)
- Control.Eff.Log.Handler: instance GHC.Base.Functor (Control.Eff.Log.Writer.LogWriterM Control.Eff.Log.Handler.Logs)
- Control.Eff.Log.Handler: instance GHC.Base.Monad (Control.Eff.Log.Writer.LogWriterM Control.Eff.Log.Handler.Logs)
- Control.Eff.Log.Handler: type LogIo e = (LogsTo (Lift IO) e, Lifted IO e)
- Control.Eff.Log.Handler: type LogsTo h e = (Member Logs e, HandleLogWriter h, Member h e, SetMember LogWriterReader (LogWriterReader h) e)
- Control.Eff.Log.Handler: withSomeLogging :: forall h e a. (Applicative (LogWriterM h), LogsTo h (Logs : (LogWriterReader h : e))) => Eff (Logs : (LogWriterReader h : e)) a -> Eff e a
- Control.Eff.Log.Writer: -- method.
- Control.Eff.Log.Writer: -- | The <a>Eff</a>ects required by the <a>handleLogWriterEffect</a>
- Control.Eff.Log.Writer: class HandleLogWriter (writer :: Type -> Type) where {
- Control.Eff.Log.Writer: data LogWriterReader h v
- Control.Eff.Log.Writer: data family LogWriterM writer a;
- Control.Eff.Log.Writer: handleLogWriterEffect :: (HandleLogWriter writer, Member writer e) => LogWriterM writer () -> Eff e ()
- Control.Eff.Log.Writer: instance (Control.Eff.Internal.LiftedBase m e, Control.Monad.Catch.MonadThrow (Control.Eff.Internal.Eff e)) => Control.Monad.Catch.MonadThrow (Control.Eff.Internal.Eff (Control.Eff.Log.Writer.LogWriterReader h : e))
- Control.Eff.Log.Writer: instance (Control.Monad.Base.MonadBase m m, Control.Eff.Internal.LiftedBase m r) => Control.Monad.Trans.Control.MonadBaseControl m (Control.Eff.Internal.Eff (Control.Eff.Log.Writer.LogWriterReader h : r))
- Control.Eff.Log.Writer: instance (GHC.Base.Applicative m, Control.Eff.Internal.LiftedBase m e, Control.Monad.Catch.MonadCatch (Control.Eff.Internal.Eff e)) => Control.Monad.Catch.MonadCatch (Control.Eff.Internal.Eff (Control.Eff.Log.Writer.LogWriterReader h : e))
- Control.Eff.Log.Writer: instance (GHC.Base.Applicative m, Control.Eff.Internal.LiftedBase m e, Control.Monad.Catch.MonadMask (Control.Eff.Internal.Eff e)) => Control.Monad.Catch.MonadMask (Control.Eff.Internal.Eff (Control.Eff.Log.Writer.LogWriterReader h : e))
- Control.Eff.Log.Writer: instance Control.Eff.Internal.Handle (Control.Eff.Log.Writer.LogWriterReader h) e a (Control.Eff.Log.Writer.LogWriter h -> k)
- Control.Eff.Log.Writer: instance Control.Eff.Log.Writer.HandleLogWriter (Control.Eff.Internal.Lift GHC.Types.IO)
- Control.Eff.Log.Writer: instance Control.Eff.Log.Writer.HandleLogWriter (Control.Eff.Writer.Strict.Writer Control.Eff.Log.Message.LogMessage)
- Control.Eff.Log.Writer: instance GHC.Base.Applicative (Control.Eff.Log.Writer.LogWriterM (Control.Eff.Internal.Lift GHC.Types.IO))
- Control.Eff.Log.Writer: instance GHC.Base.Applicative (Control.Eff.Log.Writer.LogWriterM (Control.Eff.Writer.Strict.Writer Control.Eff.Log.Message.LogMessage))
- Control.Eff.Log.Writer: instance GHC.Base.Applicative (Control.Eff.Log.Writer.LogWriterM w) => Data.Default.Class.Default (Control.Eff.Log.Writer.LogWriter w)
- Control.Eff.Log.Writer: instance GHC.Base.Functor (Control.Eff.Log.Writer.LogWriterM (Control.Eff.Internal.Lift GHC.Types.IO))
- Control.Eff.Log.Writer: instance GHC.Base.Functor (Control.Eff.Log.Writer.LogWriterM (Control.Eff.Writer.Strict.Writer Control.Eff.Log.Message.LogMessage))
- Control.Eff.Log.Writer: instance GHC.Base.Monad (Control.Eff.Log.Writer.LogWriterM (Control.Eff.Internal.Lift GHC.Types.IO))
- Control.Eff.Log.Writer: instance GHC.Base.Monad (Control.Eff.Log.Writer.LogWriterM (Control.Eff.Writer.Strict.Writer Control.Eff.Log.Message.LogMessage))
- Control.Eff.Log.Writer: mappingLogWriterM :: Monad (LogWriterM e) => (LogMessage -> LogWriterM e LogMessage) -> LogWriter e -> LogWriter e
- Control.Eff.Log.Writer: }
- Control.Eff.LogWriter.Capture: captureLogWriter :: LogWriter CaptureLogWriter
- Control.Eff.LogWriter.Capture: runCaptureLogWriter :: Eff (CaptureLogWriter : e) a -> Eff e (a, [LogMessage])
- Control.Eff.LogWriter.Capture: type CaptureLogWriter = Writer LogMessage
- Control.Eff.LogWriter.Capture: type CaptureLogs a = LogWriterM CaptureLogWriter a
- Control.Eff.LogWriter.Console: stdoutLogWriter :: LogMessageRenderer Text -> LogWriter (Lift IO)
- Control.Eff.LogWriter.IO: defaultIoLogWriter :: Text -> Facility -> LogWriter (Lift IO) -> LogWriter (Lift IO)
- Control.Eff.LogWriter.IO: ioHandleLogWriter :: HasCallStack => Handle -> LogWriter (Lift IO)
- Control.Eff.LogWriter.IO: mkLogWriterIO :: HasCallStack => (LogMessage -> IO ()) -> LogWriter (Lift IO)
- Control.Eff.LogWriter.IO: printLogMessage :: LogMessage -> IO ()
- Control.Eff.LogWriter.IO: type LoggingAndIo = '[Logs, LogWriterReader (Lift IO), Lift IO]
- Control.Eff.LogWriter.IO: withIoLogging :: Lifted IO e => LogWriter (Lift IO) -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.Protocol.Broker: instance (Control.Eff.Log.Handler.IoLogging q, Control.Eff.Concurrent.Protocol.Broker.TangibleBroker p, Control.Eff.Concurrent.Protocol.Tangible (Control.Eff.Concurrent.Protocol.Broker.ChildId p), Data.Typeable.Internal.Typeable (Control.Eff.Concurrent.Protocol.EffectfulServer.ServerPdu p), Control.Eff.Concurrent.Protocol.EffectfulServer.Server p (Control.Eff.Concurrent.Process.Processes q), Control.Eff.Concurrent.Process.HasProcesses (Control.Eff.Concurrent.Protocol.EffectfulServer.ServerEffects p (Control.Eff.Concurrent.Process.Processes q)) q) => Control.Eff.Concurrent.Protocol.StatefulServer.Server (Control.Eff.Concurrent.Protocol.Broker.Broker p) (Control.Eff.Concurrent.Process.Processes q)
+ Control.Eff.Concurrent.Pure: censorLogsIo :: IoLogging e => (LogMessage -> IO LogMessage) -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.Pure: mappingLogWriterIO :: (LogMessage -> IO LogMessage) -> LogWriter -> LogWriter
+ Control.Eff.Concurrent.Pure: renderConsoleMinimalisticWide :: LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: richLogWriter :: Text -> Facility -> LogWriter -> LogWriter
+ Control.Eff.Concurrent.Pure: type FilteredLogging e = (Member Logs e, Member LogWriterReader e)
+ Control.Eff.Concurrent.Pure: type IoLogging e = (FilteredLogging e, Lifted IO e)
+ Control.Eff.Concurrent.Pure: type LogMessageTextRenderer = LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: type LogWriterReader = Reader LogWriter
+ Control.Eff.Concurrent.Pure: withRichLogging :: Lifted IO e => LogWriter -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
+ Control.Eff.Concurrent.Pure: withoutLogging :: Eff (Logs : (LogWriterReader : e)) a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: censorLogsIo :: IoLogging e => (LogMessage -> IO LogMessage) -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: mappingLogWriterIO :: (LogMessage -> IO LogMessage) -> LogWriter -> LogWriter
+ Control.Eff.Concurrent.SingleThreaded: renderConsoleMinimalisticWide :: LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: richLogWriter :: Text -> Facility -> LogWriter -> LogWriter
+ Control.Eff.Concurrent.SingleThreaded: type FilteredLogging e = (Member Logs e, Member LogWriterReader e)
+ Control.Eff.Concurrent.SingleThreaded: type IoLogging e = (FilteredLogging e, Lifted IO e)
+ Control.Eff.Concurrent.SingleThreaded: type LogMessageTextRenderer = LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: type LogWriterReader = Reader LogWriter
+ Control.Eff.Concurrent.SingleThreaded: withRichLogging :: Lifted IO e => LogWriter -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: withoutLogging :: Eff (Logs : (LogWriterReader : e)) a -> Eff e a
+ Control.Eff.Log: censorLogsIo :: IoLogging e => (LogMessage -> IO LogMessage) -> Eff e a -> Eff e a
+ Control.Eff.Log: type FilteredLogging e = (Member Logs e, Member LogWriterReader e)
+ Control.Eff.Log: type IoLogging e = (FilteredLogging e, Lifted IO e)
+ Control.Eff.Log: type LoggingAndIo = '[Logs, LogWriterReader, Lift IO]
+ Control.Eff.Log: withoutLogging :: Eff (Logs : (LogWriterReader : e)) a -> Eff e a
+ Control.Eff.Log.Examples: exampleLogTrace :: IO ()
+ Control.Eff.Log.Examples: exampleSetLogWriter :: HasCallStack => IO ()
+ Control.Eff.Log.Handler: censorLogsIo :: IoLogging e => (LogMessage -> IO LogMessage) -> Eff e a -> Eff e a
+ Control.Eff.Log.Handler: instance (Control.Monad.Base.MonadBase m GHC.Types.IO, Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO (Control.Eff.Internal.Eff e), Control.Eff.Internal.LiftedBase m e, Control.Eff.Internal.Lifted GHC.Types.IO e, Control.Eff.Log.Handler.IoLogging (Control.Eff.Log.Handler.Logs : e)) => Control.Monad.Trans.Control.MonadBaseControl m (Control.Eff.Internal.Eff (Control.Eff.Log.Handler.Logs : e))
+ Control.Eff.Log.Handler: instance (GHC.Base.Applicative m, Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO (Control.Eff.Internal.Eff e), Control.Eff.Internal.LiftedBase m e, Control.Monad.Catch.MonadCatch (Control.Eff.Internal.Eff e), Control.Eff.Log.Handler.IoLogging (Control.Eff.Log.Handler.Logs : e), Control.Eff.Internal.Lifted GHC.Types.IO e) => Control.Monad.Catch.MonadCatch (Control.Eff.Internal.Eff (Control.Eff.Log.Handler.Logs : e))
+ Control.Eff.Log.Handler: instance (GHC.Base.Applicative m, Control.Monad.Trans.Control.MonadBaseControl GHC.Types.IO (Control.Eff.Internal.Eff e), Control.Eff.Internal.LiftedBase m e, Control.Monad.Catch.MonadMask (Control.Eff.Internal.Eff e), Control.Eff.Log.Handler.IoLogging (Control.Eff.Log.Handler.Logs : e), Control.Eff.Internal.Lifted GHC.Types.IO e) => Control.Monad.Catch.MonadMask (Control.Eff.Internal.Eff (Control.Eff.Log.Handler.Logs : e))
+ Control.Eff.Log.Handler: runLogsWithoutLogging :: forall e b. Member LogWriterReader (Logs : e) => LogPredicate -> Eff (Logs : e) b -> Eff e b
+ Control.Eff.Log.Handler: type FilteredLogging e = (Member Logs e, Member LogWriterReader e)
+ Control.Eff.Log.Handler: type IoLogging e = (FilteredLogging e, Lifted IO e)
+ Control.Eff.Log.Handler: type LoggingAndIo = '[Logs, LogWriterReader, Lift IO]
+ Control.Eff.Log.Handler: withoutLogging :: Eff (Logs : (LogWriterReader : e)) a -> Eff e a
+ Control.Eff.Log.MessageRenderer: renderConsoleMinimalisticWide :: LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: type LogMessageTextRenderer = LogMessageRenderer Text
+ Control.Eff.Log.Writer: instance GHC.Base.Monoid Control.Eff.Log.Writer.LogWriter
+ Control.Eff.Log.Writer: instance GHC.Base.Semigroup Control.Eff.Log.Writer.LogWriter
+ Control.Eff.Log.Writer: ioHandleLogWriter :: Handle -> LogMessageRenderer Text -> LogWriter
+ Control.Eff.Log.Writer: mappingLogWriterIO :: (LogMessage -> IO LogMessage) -> LogWriter -> LogWriter
+ Control.Eff.Log.Writer: stdoutLogWriter :: LogMessageRenderer Text -> IO LogWriter
+ Control.Eff.Log.Writer: type LogWriterReader = Reader LogWriter
+ Control.Eff.LogWriter.Rich: richLogWriter :: Text -> Facility -> LogWriter -> LogWriter
+ Control.Eff.LogWriter.Rich: stdoutLogWriter :: LogMessageRenderer Text -> IO LogWriter
+ Control.Eff.LogWriter.Rich: withRichLogging :: Lifted IO e => LogWriter -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent: defaultMainWithLogWriter :: HasCallStack => LogWriter (Lift IO) -> Eff Effects () -> IO ()
+ Control.Eff.Concurrent: defaultMainWithLogWriter :: HasCallStack => LogWriter -> Eff Effects () -> IO ()
- Control.Eff.Concurrent: fromEndpoint :: forall protocol_aW1d protocol_aX9r. Iso (Endpoint protocol_aW1d) (Endpoint protocol_aX9r) ProcessId ProcessId
+ Control.Eff.Concurrent: fromEndpoint :: forall protocol_aUDz protocol_aVLX. Iso (Endpoint protocol_aUDz) (Endpoint protocol_aVLX) ProcessId ProcessId
- Control.Eff.Concurrent: receiverPid :: forall a_aIyj. Lens' (Receiver a_aIyj) ProcessId
+ Control.Eff.Concurrent: receiverPid :: forall a_aHaF. Lens' (Receiver a_aHaF) ProcessId
- Control.Eff.Concurrent.Process: receiverPid :: forall a_aIyj. Lens' (Receiver a_aIyj) ProcessId
+ Control.Eff.Concurrent.Process: receiverPid :: forall a_aHaF. Lens' (Receiver a_aHaF) ProcessId
- Control.Eff.Concurrent.Process.ForkIOScheduler: defaultMainWithLogWriter :: HasCallStack => LogWriter (Lift IO) -> Eff Effects () -> IO ()
+ Control.Eff.Concurrent.Process.ForkIOScheduler: defaultMainWithLogWriter :: HasCallStack => LogWriter -> Eff Effects () -> IO ()
- Control.Eff.Concurrent.Process.SingleThreadedScheduler: defaultMainWithLogWriter :: HasCallStack => LogWriter (Lift IO) -> Eff EffectsIo () -> IO ()
+ Control.Eff.Concurrent.Process.SingleThreadedScheduler: defaultMainWithLogWriter :: HasCallStack => LogWriter -> Eff EffectsIo () -> IO ()
- Control.Eff.Concurrent.Process.SingleThreadedScheduler: scheduleIOWithLogging :: HasCallStack => LogWriter (Lift IO) -> Eff EffectsIo a -> IO (Either (Interrupt 'NoRecovery) a)
+ Control.Eff.Concurrent.Process.SingleThreadedScheduler: scheduleIOWithLogging :: HasCallStack => LogWriter -> Eff EffectsIo a -> IO (Either (Interrupt 'NoRecovery) a)
- Control.Eff.Concurrent.Process.SingleThreadedScheduler: schedulePure :: Eff (Processes '[Logs, LogWriterReader Logs]) a -> Either (Interrupt 'NoRecovery) a
+ Control.Eff.Concurrent.Process.SingleThreadedScheduler: schedulePure :: Eff (Processes PureBaseEffects) a -> Either (Interrupt 'NoRecovery) a
- Control.Eff.Concurrent.Process.SingleThreadedScheduler: type PureBaseEffects = '[Logs, LogWriterReader Logs]
+ Control.Eff.Concurrent.Process.SingleThreadedScheduler: type PureBaseEffects = '[Logs, LogWriterReader]
- Control.Eff.Concurrent.Protocol: fromEndpoint :: forall protocol_aW1d protocol_aX9r. Iso (Endpoint protocol_aW1d) (Endpoint protocol_aX9r) ProcessId ProcessId
+ Control.Eff.Concurrent.Protocol: fromEndpoint :: forall protocol_aUDz protocol_aVLX. Iso (Endpoint protocol_aUDz) (Endpoint protocol_aVLX) ProcessId ProcessId
- Control.Eff.Concurrent.Protocol.Broker: startLink :: forall p e. (HasCallStack, LogIo (Processes e), TangibleBroker p, Server (Broker p) (Processes e)) => StartArgument (Broker p) (Processes e) -> Eff (Processes e) (Endpoint (Broker p))
+ Control.Eff.Concurrent.Protocol.Broker: startLink :: forall p e. (HasCallStack, IoLogging (Processes e), TangibleBroker p, Server (Broker p) (Processes e)) => StartArgument (Broker p) (Processes e) -> Eff (Processes e) (Endpoint (Broker p))
- Control.Eff.Concurrent.Protocol.Broker: statefulChild :: forall p e. (HasCallStack, LogIo (Processes e), TangibleBroker (Stateful p), Server (Broker (Stateful p)) (Processes e)) => Timeout -> (ChildId p -> StartArgument p (Processes e)) -> StartArgument (Broker (Stateful p)) (Processes e)
+ Control.Eff.Concurrent.Protocol.Broker: statefulChild :: forall p e. (HasCallStack, IoLogging (Processes e), TangibleBroker (Stateful p), Server (Broker (Stateful p)) (Processes e)) => Timeout -> (ChildId p -> StartArgument p (Processes e)) -> StartArgument (Broker (Stateful p)) (Processes e)
- Control.Eff.Concurrent.Protocol.CallbackServer: callbacks :: forall tag q h. (HasCallStack, TangibleCallbacks tag (Processes q) q, Server (Server tag (Processes q)) (Processes q), LogsTo h q) => (Endpoint tag -> Event tag -> Eff (Processes q) ()) -> ServerId tag -> Callbacks tag q
+ Control.Eff.Concurrent.Protocol.CallbackServer: callbacks :: forall tag q. (HasCallStack, TangibleCallbacks tag (Processes q) q, Server (Server tag (Processes q)) (Processes q), FilteredLogging q) => (Endpoint tag -> Event tag -> Eff (Processes q) ()) -> ServerId tag -> Callbacks tag q
- Control.Eff.Concurrent.Protocol.CallbackServer: callbacksEff :: forall tag eLoop q h. (HasCallStack, TangibleCallbacks tag eLoop q, Server (Server tag eLoop) (Processes q), LogsTo h q) => (forall x. Endpoint tag -> Eff eLoop x -> Eff (Processes q) x) -> (Endpoint tag -> Event tag -> Eff eLoop ()) -> ServerId tag -> CallbacksEff tag eLoop q
+ Control.Eff.Concurrent.Protocol.CallbackServer: callbacksEff :: forall tag eLoop q. (HasCallStack, TangibleCallbacks tag eLoop q, Server (Server tag eLoop) (Processes q), FilteredLogging q) => (forall x. Endpoint tag -> Eff eLoop x -> Eff (Processes q) x) -> (Endpoint tag -> Event tag -> Eff eLoop ()) -> ServerId tag -> CallbacksEff tag eLoop q
- Control.Eff.Concurrent.Protocol.CallbackServer: onEvent :: forall tag q h. (HasCallStack, TangibleCallbacks tag (Processes q) q, Server (Server tag (Processes q)) (Processes q), LogsTo h q) => (Event tag -> Eff (Processes q) ()) -> ServerId (tag :: Type) -> Callbacks tag q
+ Control.Eff.Concurrent.Protocol.CallbackServer: onEvent :: forall tag q. (HasCallStack, TangibleCallbacks tag (Processes q) q, Server (Server tag (Processes q)) (Processes q), FilteredLogging q) => (Event tag -> Eff (Processes q) ()) -> ServerId (tag :: Type) -> Callbacks tag q
- Control.Eff.Concurrent.Protocol.CallbackServer: onEventEff :: (HasCallStack, TangibleCallbacks tag eLoop q, Server (Server tag eLoop) (Processes q), LogsTo h q) => (forall a. Eff eLoop a -> Eff (Processes q) a) -> (Event tag -> Eff eLoop ()) -> ServerId (tag :: Type) -> CallbacksEff tag eLoop q
+ Control.Eff.Concurrent.Protocol.CallbackServer: onEventEff :: (HasCallStack, TangibleCallbacks tag eLoop q, Server (Server tag eLoop) (Processes q), FilteredLogging q) => (forall a. Eff eLoop a -> Eff (Processes q) a) -> (Event tag -> Eff eLoop ()) -> ServerId (tag :: Type) -> CallbacksEff tag eLoop q
- Control.Eff.Concurrent.Protocol.CallbackServer: start :: forall (tag :: Type) eLoop q h e. (HasCallStack, TangibleCallbacks tag eLoop q, Server (Server tag eLoop) (Processes q), LogsTo h (Processes q), HasProcesses e q) => CallbacksEff tag eLoop q -> Eff e (Endpoint tag)
+ Control.Eff.Concurrent.Protocol.CallbackServer: start :: forall (tag :: Type) eLoop q e. (HasCallStack, TangibleCallbacks tag eLoop q, Server (Server tag eLoop) (Processes q), FilteredLogging (Processes q), HasProcesses e q) => CallbacksEff tag eLoop q -> Eff e (Endpoint tag)
- Control.Eff.Concurrent.Protocol.CallbackServer: startLink :: forall (tag :: Type) eLoop q h e. (HasCallStack, TangibleCallbacks tag eLoop q, Server (Server tag eLoop) (Processes q), LogsTo h (Processes q), HasProcesses e q) => CallbacksEff tag eLoop q -> Eff e (Endpoint tag)
+ Control.Eff.Concurrent.Protocol.CallbackServer: startLink :: forall (tag :: Type) eLoop q e. (HasCallStack, TangibleCallbacks tag eLoop q, Server (Server tag eLoop) (Processes q), FilteredLogging (Processes q), HasProcesses e q) => CallbacksEff tag eLoop q -> Eff e (Endpoint tag)
- Control.Eff.Concurrent.Protocol.EffectfulServer: protocolServerLoop :: forall q h a. (Server a (Processes q), LogsTo h (Processes q), HasProcesses (ServerEffects a (Processes q)) q, Typeable a, Typeable (ServerPdu a)) => Init a (Processes q) -> Eff (Processes q) ()
+ Control.Eff.Concurrent.Protocol.EffectfulServer: protocolServerLoop :: forall q a. (Server a (Processes q), FilteredLogging (Processes q), HasProcesses (ServerEffects a (Processes q)) q, Typeable a, Typeable (ServerPdu a)) => Init a (Processes q) -> Eff (Processes q) ()
- Control.Eff.Concurrent.Protocol.EffectfulServer: start :: forall a r q h. (Server a (Processes q), Typeable a, Typeable (ServerPdu a), LogsTo h (Processes q), HasProcesses (ServerEffects a (Processes q)) q, HasProcesses r q, HasCallStack) => Init a (Processes q) -> Eff r (Endpoint (ServerPdu a))
+ Control.Eff.Concurrent.Protocol.EffectfulServer: start :: forall a r q. (Server a (Processes q), Typeable a, Typeable (ServerPdu a), FilteredLogging (Processes q), HasProcesses (ServerEffects a (Processes q)) q, HasProcesses r q, HasCallStack) => Init a (Processes q) -> Eff r (Endpoint (ServerPdu a))
- Control.Eff.Concurrent.Protocol.EffectfulServer: startLink :: forall a r q h. (Typeable a, Typeable (ServerPdu a), Server a (Processes q), LogsTo h (Processes q), HasProcesses (ServerEffects a (Processes q)) q, HasProcesses r q, HasCallStack) => Init a (Processes q) -> Eff r (Endpoint (ServerPdu a))
+ Control.Eff.Concurrent.Protocol.EffectfulServer: startLink :: forall a r q. (Typeable a, Typeable (ServerPdu a), Server a (Processes q), FilteredLogging (Processes q), HasProcesses (ServerEffects a (Processes q)) q, HasProcesses r q, HasCallStack) => Init a (Processes q) -> Eff r (Endpoint (ServerPdu a))
- Control.Eff.Concurrent.Protocol.Observer.Queue: observe :: forall event eventSource e q len b h. (HasCallStack, HasProcesses e q, LogsTo h e, LogsTo h q, LogsTo h (Processes q), Lifted IO e, Lifted IO q, IsObservable eventSource event, Integral len, Server (ObservationQueue event) (Processes q), Tangible (Pdu eventSource 'Asynchronous)) => len -> Endpoint eventSource -> Eff (Reader event : e) b -> Eff e b
+ Control.Eff.Concurrent.Protocol.Observer.Queue: observe :: forall event eventSource e q len b. (HasCallStack, HasProcesses e q, FilteredLogging e, FilteredLogging q, FilteredLogging (Processes q), Lifted IO e, Lifted IO q, IsObservable eventSource event, Integral len, Server (ObservationQueue event) (Processes q), Tangible (Pdu eventSource 'Asynchronous)) => len -> Endpoint eventSource -> Eff (Reader event : e) b -> Eff e b
- Control.Eff.Concurrent.Protocol.StatefulServer: start :: forall a r q h. (HasCallStack, Typeable a, Server (Stateful a) (Processes q), Server a (Processes q), HandleLogWriter h, LogsTo h (Processes q), HasProcesses r q) => StartArgument a (Processes q) -> Eff r (Endpoint (Protocol a))
+ Control.Eff.Concurrent.Protocol.StatefulServer: start :: forall a r q. (HasCallStack, Typeable a, Server (Stateful a) (Processes q), Server a (Processes q), FilteredLogging (Processes q), HasProcesses r q) => StartArgument a (Processes q) -> Eff r (Endpoint (Protocol a))
- Control.Eff.Concurrent.Protocol.StatefulServer: startLink :: forall a r q h. (HasCallStack, Typeable a, LogsTo h (Processes q), Server (Stateful a) (Processes q), Server a (Processes q), HasProcesses r q) => StartArgument a (Processes q) -> Eff r (Endpoint (Protocol a))
+ Control.Eff.Concurrent.Protocol.StatefulServer: startLink :: forall a r q. (HasCallStack, Typeable a, FilteredLogging (Processes q), Server (Stateful a) (Processes q), Server a (Processes q), HasProcesses r q) => StartArgument a (Processes q) -> Eff r (Endpoint (Protocol a))
- Control.Eff.Concurrent.Protocol.Watchdog: attachPermanent :: forall child q e h. (HasCallStack, LogsTo h e, Typeable child, HasPdu (ServerPdu child), Tangible (ChildId child), Ord (ChildId child), HasProcesses e q) => Endpoint (Watchdog child) -> Endpoint (Broker child) -> Eff e ()
+ Control.Eff.Concurrent.Protocol.Watchdog: attachPermanent :: forall child q e. (HasCallStack, FilteredLogging e, Typeable child, HasPdu (ServerPdu child), Tangible (ChildId child), Ord (ChildId child), HasProcesses e q) => Endpoint (Watchdog child) -> Endpoint (Broker child) -> Eff e ()
- Control.Eff.Concurrent.Protocol.Watchdog: attachTemporary :: forall child q e h. (HasCallStack, LogsTo h e, Typeable child, HasPdu (ServerPdu child), Tangible (ChildId child), Ord (ChildId child), HasProcesses e q) => Endpoint (Watchdog child) -> Endpoint (Broker child) -> Eff e ()
+ Control.Eff.Concurrent.Protocol.Watchdog: attachTemporary :: forall child q e. (HasCallStack, FilteredLogging e, Typeable child, HasPdu (ServerPdu child), Tangible (ChildId child), Ord (ChildId child), HasProcesses e q) => Endpoint (Watchdog child) -> Endpoint (Broker child) -> Eff e ()
- Control.Eff.Concurrent.Protocol.Watchdog: getCrashReports :: forall child q e h. (HasCallStack, LogsTo h e, Typeable child, HasPdu (ServerPdu child), Tangible (ChildId child), Ord (ChildId child), HasProcesses e q, Lifted IO q, Lifted IO e, Member Logs e) => Endpoint (Watchdog child) -> Eff e (Map (ChildId child) (ChildWatch child))
+ Control.Eff.Concurrent.Protocol.Watchdog: getCrashReports :: forall child q e. (HasCallStack, FilteredLogging e, Typeable child, HasPdu (ServerPdu child), Tangible (ChildId child), Ord (ChildId child), HasProcesses e q, Lifted IO q, Lifted IO e, Member Logs e) => Endpoint (Watchdog child) -> Eff e (Map (ChildId child) (ChildWatch child))
- Control.Eff.Concurrent.Protocol.Watchdog: startLink :: forall child e q h. (HasCallStack, Typeable child, LogsTo h (Processes q), Member Logs q, HasProcesses e q, Tangible (ChildId child), Ord (ChildId child), HasPdu (ServerPdu child), Lifted IO q) => CrashRate -> Eff e (Endpoint (Watchdog child))
+ Control.Eff.Concurrent.Protocol.Watchdog: startLink :: forall child e q. (HasCallStack, Typeable child, FilteredLogging (Processes q), Member Logs q, HasProcesses e q, Tangible (ChildId child), Ord (ChildId child), HasPdu (ServerPdu child), Lifted IO q) => CrashRate -> Eff e (Endpoint (Watchdog child))
- Control.Eff.Concurrent.Pure: MkLogWriter :: (LogMessage -> LogWriterM writerM ()) -> LogWriter writerM
+ Control.Eff.Concurrent.Pure: MkLogWriter :: (LogMessage -> IO ()) -> LogWriter
- Control.Eff.Concurrent.Pure: [runLogWriter] :: LogWriter writerM -> LogMessage -> LogWriterM writerM ()
+ Control.Eff.Concurrent.Pure: [runLogWriter] :: LogWriter -> LogMessage -> IO ()
- Control.Eff.Concurrent.Pure: addLogWriter :: forall h e a. (HasCallStack, LogsTo h e, Monad (LogWriterM h)) => LogWriter h -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.Pure: addLogWriter :: IoLogging e => LogWriter -> Eff e a -> Eff e a
- Control.Eff.Concurrent.Pure: askLogWriter :: SetMember LogWriterReader (LogWriterReader h) e => Eff e (LogWriter h)
+ Control.Eff.Concurrent.Pure: askLogWriter :: Member LogWriterReader e => Eff e LogWriter
- Control.Eff.Concurrent.Pure: censorLogs :: LogsTo h e => (LogMessage -> LogMessage) -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.Pure: censorLogs :: IoLogging e => (LogMessage -> LogMessage) -> Eff e a -> Eff e a
- Control.Eff.Concurrent.Pure: consoleLogWriter :: LogWriter (Lift IO)
+ Control.Eff.Concurrent.Pure: consoleLogWriter :: IO LogWriter
- Control.Eff.Concurrent.Pure: debugTraceLogWriter :: forall h. Monad (LogWriterM h) => LogMessageRenderer Text -> LogWriter h
+ Control.Eff.Concurrent.Pure: debugTraceLogWriter :: LogMessageTextRenderer -> LogWriter
- Control.Eff.Concurrent.Pure: filteringLogWriter :: Monad (LogWriterM e) => LogPredicate -> LogWriter e -> LogWriter e
+ Control.Eff.Concurrent.Pure: filteringLogWriter :: LogPredicate -> LogWriter -> LogWriter
- Control.Eff.Concurrent.Pure: fromEndpoint :: forall protocol_aW1d protocol_aX9r. Iso (Endpoint protocol_aW1d) (Endpoint protocol_aX9r) ProcessId ProcessId
+ Control.Eff.Concurrent.Pure: fromEndpoint :: forall protocol_aUDz protocol_aVLX. Iso (Endpoint protocol_aUDz) (Endpoint protocol_aVLX) ProcessId ProcessId
- Control.Eff.Concurrent.Pure: ioHandleLogWriter :: HasCallStack => Handle -> LogWriter (Lift IO)
+ Control.Eff.Concurrent.Pure: ioHandleLogWriter :: Handle -> LogMessageRenderer Text -> LogWriter
- Control.Eff.Concurrent.Pure: liftWriteLogMessage :: (HandleLogWriter writer, SetMember LogWriterReader (LogWriterReader writer) e, Member writer e) => LogMessage -> Eff e ()
+ Control.Eff.Concurrent.Pure: liftWriteLogMessage :: (Member LogWriterReader e, Lifted IO e) => LogMessage -> Eff e ()
- Control.Eff.Concurrent.Pure: localLogWriterReader :: forall h e a. SetMember LogWriterReader (LogWriterReader h) e => (LogWriter h -> LogWriter h) -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.Pure: localLogWriterReader :: forall e a. Member LogWriterReader e => (LogWriter -> LogWriter) -> Eff e a -> Eff e a
- Control.Eff.Concurrent.Pure: mappingLogWriter :: (LogMessage -> LogMessage) -> LogWriter e -> LogWriter e
+ Control.Eff.Concurrent.Pure: mappingLogWriter :: (LogMessage -> LogMessage) -> LogWriter -> LogWriter
- Control.Eff.Concurrent.Pure: modifyLogWriter :: forall h e a. LogsTo h e => (LogWriter h -> LogWriter h) -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.Pure: modifyLogWriter :: IoLogging e => (LogWriter -> LogWriter) -> Eff e a -> Eff e a
- Control.Eff.Concurrent.Pure: newtype LogWriter writerM
+ Control.Eff.Concurrent.Pure: newtype LogWriter
- Control.Eff.Concurrent.Pure: noOpLogWriter :: Applicative (LogWriterM m) => LogWriter m
+ Control.Eff.Concurrent.Pure: noOpLogWriter :: LogWriter
- Control.Eff.Concurrent.Pure: receiverPid :: forall a_aIyj. Lens' (Receiver a_aIyj) ProcessId
+ Control.Eff.Concurrent.Pure: receiverPid :: forall a_aHaF. Lens' (Receiver a_aHaF) ProcessId
- Control.Eff.Concurrent.Pure: renderLogMessageBody :: LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderLogMessageBody :: LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: renderLogMessageBodyFixWidth :: LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderLogMessageBodyFixWidth :: LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: renderLogMessageBodyNoLocation :: LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderLogMessageBodyNoLocation :: LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: renderLogMessageConsoleLog :: LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderLogMessageConsoleLog :: LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: renderLogMessageSyslog :: LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderLogMessageSyslog :: LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: renderMaybeLogMessageLens :: Text -> Getter LogMessage (Maybe Text) -> LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderMaybeLogMessageLens :: Text -> Getter LogMessage (Maybe Text) -> LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: renderRFC3164 :: LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderRFC3164 :: LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: renderRFC3164WithRFC5424Timestamps :: LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderRFC3164WithRFC5424Timestamps :: LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: renderRFC3164WithTimestamp :: LogMessageTimeRenderer -> LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderRFC3164WithTimestamp :: LogMessageTimeRenderer -> LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: renderRFC5424 :: LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderRFC5424 :: LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: renderRFC5424Header :: LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderRFC5424Header :: LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: renderRFC5424NoLocation :: LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderRFC5424NoLocation :: LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: renderSyslogSeverityAndFacility :: LogMessageRenderer Text
+ Control.Eff.Concurrent.Pure: renderSyslogSeverityAndFacility :: LogMessageTextRenderer
- Control.Eff.Concurrent.Pure: runLogWriterReader :: LogWriter h -> Eff (LogWriterReader h : e) a -> Eff e a
+ Control.Eff.Concurrent.Pure: runLogWriterReader :: LogWriter -> Eff (Reader LogWriter : e) a -> Eff e a
- Control.Eff.Concurrent.Pure: runLogs :: forall h e b. LogsTo h (Logs : e) => LogPredicate -> Eff (Logs : e) b -> Eff e b
+ Control.Eff.Concurrent.Pure: runLogs :: forall e b. (Member LogWriterReader (Logs : e), Lifted IO e) => LogPredicate -> Eff (Logs : e) b -> Eff e b
- Control.Eff.Concurrent.Pure: setLogWriter :: forall h e a. LogsTo h e => LogWriter h -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.Pure: setLogWriter :: IoLogging e => LogWriter -> Eff e a -> Eff e a
- Control.Eff.Concurrent.Pure: stdoutLogWriter :: LogMessageRenderer Text -> LogWriter (Lift IO)
+ Control.Eff.Concurrent.Pure: stdoutLogWriter :: LogMessageRenderer Text -> IO LogWriter
- Control.Eff.Concurrent.Pure: type LoggingAndIo = '[Logs, LogWriterReader (Lift IO), Lift IO]
+ Control.Eff.Concurrent.Pure: type LoggingAndIo = '[Logs, LogWriterReader, Lift IO]
- Control.Eff.Concurrent.Pure: withAsyncLogWriter :: (LogIo e, MonadBaseControl IO (Eff e), Integral len) => len -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.Pure: withAsyncLogWriter :: (IoLogging e, MonadBaseControl IO (Eff e), Integral len) => len -> Eff e a -> Eff e a
- Control.Eff.Concurrent.Pure: withAsyncLogging :: (Lifted IO e, MonadBaseControl IO (Eff e), Integral len) => LogWriter (Lift IO) -> len -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.Pure: withAsyncLogging :: (Lifted IO e, MonadBaseControl IO (Eff e), Integral len) => LogWriter -> len -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.Pure: withConsoleLogWriter :: LogIo e => Eff e a -> Eff e a
+ Control.Eff.Concurrent.Pure: withConsoleLogWriter :: IoLogging e => Eff e a -> Eff e a
- Control.Eff.Concurrent.Pure: withConsoleLogging :: Lifted IO e => Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.Pure: withConsoleLogging :: Lifted IO e => Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.Pure: withFileLogWriter :: (LogIo e, MonadBaseControl IO (Eff e)) => FilePath -> Eff e b -> Eff e b
+ Control.Eff.Concurrent.Pure: withFileLogWriter :: (IoLogging e, MonadBaseControl IO (Eff e), HasCallStack) => FilePath -> LogMessageTextRenderer -> Eff e b -> Eff e b
- Control.Eff.Concurrent.Pure: withFileLogging :: (Lifted IO e, MonadBaseControl IO (Eff e)) => FilePath -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.Pure: withFileLogging :: (Lifted IO e, MonadBaseControl IO (Eff e), HasCallStack) => FilePath -> Text -> Facility -> LogPredicate -> LogMessageTextRenderer -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.Pure: withLogging :: forall h e a. (Applicative (LogWriterM h), LogsTo h (Logs : (LogWriterReader h : e))) => LogWriter h -> Eff (Logs : (LogWriterReader h : e)) a -> Eff e a
+ Control.Eff.Concurrent.Pure: withLogging :: Lifted IO e => LogWriter -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.Pure: withTraceLogWriter :: forall h e a. (Monad (LogWriterM h), LogsTo h e) => Eff e a -> Eff e a
+ Control.Eff.Concurrent.Pure: withTraceLogWriter :: IoLogging e => Eff e a -> Eff e a
- Control.Eff.Concurrent.Pure: withTraceLogging :: Lifted IO e => Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.Pure: withTraceLogging :: Lifted IO e => Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.Pure: withUDPLogWriter :: (LogIo e, MonadBaseControl IO (Eff e), HasCallStack) => (LogMessage -> Text) -> String -> String -> Eff e b -> Eff e b
+ Control.Eff.Concurrent.Pure: withUDPLogWriter :: (IoLogging e, MonadBaseControl IO (Eff e), HasCallStack) => (LogMessage -> Text) -> String -> String -> Eff e b -> Eff e b
- Control.Eff.Concurrent.Pure: withUDPLogging :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e) => (LogMessage -> Text) -> String -> String -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.Pure: withUDPLogging :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e) => (LogMessage -> Text) -> String -> String -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.Pure: withUnixSocketLogWriter :: (LogIo e, MonadBaseControl IO (Eff e), HasCallStack) => LogMessageRenderer Text -> FilePath -> Eff e b -> Eff e b
+ Control.Eff.Concurrent.Pure: withUnixSocketLogWriter :: (IoLogging e, MonadBaseControl IO (Eff e), HasCallStack) => LogMessageRenderer Text -> FilePath -> Eff e b -> Eff e b
- Control.Eff.Concurrent.Pure: withUnixSocketLogging :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e) => LogMessageRenderer Text -> FilePath -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.Pure: withUnixSocketLogging :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e) => LogMessageRenderer Text -> FilePath -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: MkLogWriter :: (LogMessage -> LogWriterM writerM ()) -> LogWriter writerM
+ Control.Eff.Concurrent.SingleThreaded: MkLogWriter :: (LogMessage -> IO ()) -> LogWriter
- Control.Eff.Concurrent.SingleThreaded: [runLogWriter] :: LogWriter writerM -> LogMessage -> LogWriterM writerM ()
+ Control.Eff.Concurrent.SingleThreaded: [runLogWriter] :: LogWriter -> LogMessage -> IO ()
- Control.Eff.Concurrent.SingleThreaded: addLogWriter :: forall h e a. (HasCallStack, LogsTo h e, Monad (LogWriterM h)) => LogWriter h -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: addLogWriter :: IoLogging e => LogWriter -> Eff e a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: askLogWriter :: SetMember LogWriterReader (LogWriterReader h) e => Eff e (LogWriter h)
+ Control.Eff.Concurrent.SingleThreaded: askLogWriter :: Member LogWriterReader e => Eff e LogWriter
- Control.Eff.Concurrent.SingleThreaded: censorLogs :: LogsTo h e => (LogMessage -> LogMessage) -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: censorLogs :: IoLogging e => (LogMessage -> LogMessage) -> Eff e a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: consoleLogWriter :: LogWriter (Lift IO)
+ Control.Eff.Concurrent.SingleThreaded: consoleLogWriter :: IO LogWriter
- Control.Eff.Concurrent.SingleThreaded: debugTraceLogWriter :: forall h. Monad (LogWriterM h) => LogMessageRenderer Text -> LogWriter h
+ Control.Eff.Concurrent.SingleThreaded: debugTraceLogWriter :: LogMessageTextRenderer -> LogWriter
- Control.Eff.Concurrent.SingleThreaded: defaultMainWithLogWriter :: HasCallStack => LogWriter (Lift IO) -> Eff EffectsIo () -> IO ()
+ Control.Eff.Concurrent.SingleThreaded: defaultMainWithLogWriter :: HasCallStack => LogWriter -> Eff EffectsIo () -> IO ()
- Control.Eff.Concurrent.SingleThreaded: filteringLogWriter :: Monad (LogWriterM e) => LogPredicate -> LogWriter e -> LogWriter e
+ Control.Eff.Concurrent.SingleThreaded: filteringLogWriter :: LogPredicate -> LogWriter -> LogWriter
- Control.Eff.Concurrent.SingleThreaded: fromEndpoint :: forall protocol_aW1d protocol_aX9r. Iso (Endpoint protocol_aW1d) (Endpoint protocol_aX9r) ProcessId ProcessId
+ Control.Eff.Concurrent.SingleThreaded: fromEndpoint :: forall protocol_aUDz protocol_aVLX. Iso (Endpoint protocol_aUDz) (Endpoint protocol_aVLX) ProcessId ProcessId
- Control.Eff.Concurrent.SingleThreaded: ioHandleLogWriter :: HasCallStack => Handle -> LogWriter (Lift IO)
+ Control.Eff.Concurrent.SingleThreaded: ioHandleLogWriter :: Handle -> LogMessageRenderer Text -> LogWriter
- Control.Eff.Concurrent.SingleThreaded: liftWriteLogMessage :: (HandleLogWriter writer, SetMember LogWriterReader (LogWriterReader writer) e, Member writer e) => LogMessage -> Eff e ()
+ Control.Eff.Concurrent.SingleThreaded: liftWriteLogMessage :: (Member LogWriterReader e, Lifted IO e) => LogMessage -> Eff e ()
- Control.Eff.Concurrent.SingleThreaded: localLogWriterReader :: forall h e a. SetMember LogWriterReader (LogWriterReader h) e => (LogWriter h -> LogWriter h) -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: localLogWriterReader :: forall e a. Member LogWriterReader e => (LogWriter -> LogWriter) -> Eff e a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: mappingLogWriter :: (LogMessage -> LogMessage) -> LogWriter e -> LogWriter e
+ Control.Eff.Concurrent.SingleThreaded: mappingLogWriter :: (LogMessage -> LogMessage) -> LogWriter -> LogWriter
- Control.Eff.Concurrent.SingleThreaded: modifyLogWriter :: forall h e a. LogsTo h e => (LogWriter h -> LogWriter h) -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: modifyLogWriter :: IoLogging e => (LogWriter -> LogWriter) -> Eff e a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: newtype LogWriter writerM
+ Control.Eff.Concurrent.SingleThreaded: newtype LogWriter
- Control.Eff.Concurrent.SingleThreaded: noOpLogWriter :: Applicative (LogWriterM m) => LogWriter m
+ Control.Eff.Concurrent.SingleThreaded: noOpLogWriter :: LogWriter
- Control.Eff.Concurrent.SingleThreaded: receiverPid :: forall a_aIyj. Lens' (Receiver a_aIyj) ProcessId
+ Control.Eff.Concurrent.SingleThreaded: receiverPid :: forall a_aHaF. Lens' (Receiver a_aHaF) ProcessId
- Control.Eff.Concurrent.SingleThreaded: renderLogMessageBody :: LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderLogMessageBody :: LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: renderLogMessageBodyFixWidth :: LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderLogMessageBodyFixWidth :: LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: renderLogMessageBodyNoLocation :: LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderLogMessageBodyNoLocation :: LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: renderLogMessageConsoleLog :: LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderLogMessageConsoleLog :: LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: renderLogMessageSyslog :: LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderLogMessageSyslog :: LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: renderMaybeLogMessageLens :: Text -> Getter LogMessage (Maybe Text) -> LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderMaybeLogMessageLens :: Text -> Getter LogMessage (Maybe Text) -> LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: renderRFC3164 :: LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderRFC3164 :: LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: renderRFC3164WithRFC5424Timestamps :: LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderRFC3164WithRFC5424Timestamps :: LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: renderRFC3164WithTimestamp :: LogMessageTimeRenderer -> LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderRFC3164WithTimestamp :: LogMessageTimeRenderer -> LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: renderRFC5424 :: LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderRFC5424 :: LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: renderRFC5424Header :: LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderRFC5424Header :: LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: renderRFC5424NoLocation :: LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderRFC5424NoLocation :: LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: renderSyslogSeverityAndFacility :: LogMessageRenderer Text
+ Control.Eff.Concurrent.SingleThreaded: renderSyslogSeverityAndFacility :: LogMessageTextRenderer
- Control.Eff.Concurrent.SingleThreaded: runLogWriterReader :: LogWriter h -> Eff (LogWriterReader h : e) a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: runLogWriterReader :: LogWriter -> Eff (Reader LogWriter : e) a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: runLogs :: forall h e b. LogsTo h (Logs : e) => LogPredicate -> Eff (Logs : e) b -> Eff e b
+ Control.Eff.Concurrent.SingleThreaded: runLogs :: forall e b. (Member LogWriterReader (Logs : e), Lifted IO e) => LogPredicate -> Eff (Logs : e) b -> Eff e b
- Control.Eff.Concurrent.SingleThreaded: schedule :: HasCallStack => LogWriter (Lift IO) -> Eff Effects a -> IO (Either (Interrupt 'NoRecovery) a)
+ Control.Eff.Concurrent.SingleThreaded: schedule :: HasCallStack => LogWriter -> Eff Effects a -> IO (Either (Interrupt 'NoRecovery) a)
- Control.Eff.Concurrent.SingleThreaded: setLogWriter :: forall h e a. LogsTo h e => LogWriter h -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: setLogWriter :: IoLogging e => LogWriter -> Eff e a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: stdoutLogWriter :: LogMessageRenderer Text -> LogWriter (Lift IO)
+ Control.Eff.Concurrent.SingleThreaded: stdoutLogWriter :: LogMessageRenderer Text -> IO LogWriter
- Control.Eff.Concurrent.SingleThreaded: type LoggingAndIo = '[Logs, LogWriterReader (Lift IO), Lift IO]
+ Control.Eff.Concurrent.SingleThreaded: type LoggingAndIo = '[Logs, LogWriterReader, Lift IO]
- Control.Eff.Concurrent.SingleThreaded: withAsyncLogWriter :: (LogIo e, MonadBaseControl IO (Eff e), Integral len) => len -> Eff e a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: withAsyncLogWriter :: (IoLogging e, MonadBaseControl IO (Eff e), Integral len) => len -> Eff e a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: withAsyncLogging :: (Lifted IO e, MonadBaseControl IO (Eff e), Integral len) => LogWriter (Lift IO) -> len -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: withAsyncLogging :: (Lifted IO e, MonadBaseControl IO (Eff e), Integral len) => LogWriter -> len -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: withConsoleLogWriter :: LogIo e => Eff e a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: withConsoleLogWriter :: IoLogging e => Eff e a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: withConsoleLogging :: Lifted IO e => Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: withConsoleLogging :: Lifted IO e => Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: withFileLogWriter :: (LogIo e, MonadBaseControl IO (Eff e)) => FilePath -> Eff e b -> Eff e b
+ Control.Eff.Concurrent.SingleThreaded: withFileLogWriter :: (IoLogging e, MonadBaseControl IO (Eff e), HasCallStack) => FilePath -> LogMessageTextRenderer -> Eff e b -> Eff e b
- Control.Eff.Concurrent.SingleThreaded: withFileLogging :: (Lifted IO e, MonadBaseControl IO (Eff e)) => FilePath -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: withFileLogging :: (Lifted IO e, MonadBaseControl IO (Eff e), HasCallStack) => FilePath -> Text -> Facility -> LogPredicate -> LogMessageTextRenderer -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: withLogging :: forall h e a. (Applicative (LogWriterM h), LogsTo h (Logs : (LogWriterReader h : e))) => LogWriter h -> Eff (Logs : (LogWriterReader h : e)) a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: withLogging :: Lifted IO e => LogWriter -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: withTraceLogWriter :: forall h e a. (Monad (LogWriterM h), LogsTo h e) => Eff e a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: withTraceLogWriter :: IoLogging e => Eff e a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: withTraceLogging :: Lifted IO e => Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: withTraceLogging :: Lifted IO e => Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: withUDPLogWriter :: (LogIo e, MonadBaseControl IO (Eff e), HasCallStack) => (LogMessage -> Text) -> String -> String -> Eff e b -> Eff e b
+ Control.Eff.Concurrent.SingleThreaded: withUDPLogWriter :: (IoLogging e, MonadBaseControl IO (Eff e), HasCallStack) => (LogMessage -> Text) -> String -> String -> Eff e b -> Eff e b
- Control.Eff.Concurrent.SingleThreaded: withUDPLogging :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e) => (LogMessage -> Text) -> String -> String -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: withUDPLogging :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e) => (LogMessage -> Text) -> String -> String -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Concurrent.SingleThreaded: withUnixSocketLogWriter :: (LogIo e, MonadBaseControl IO (Eff e), HasCallStack) => LogMessageRenderer Text -> FilePath -> Eff e b -> Eff e b
+ Control.Eff.Concurrent.SingleThreaded: withUnixSocketLogWriter :: (IoLogging e, MonadBaseControl IO (Eff e), HasCallStack) => LogMessageRenderer Text -> FilePath -> Eff e b -> Eff e b
- Control.Eff.Concurrent.SingleThreaded: withUnixSocketLogging :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e) => LogMessageRenderer Text -> FilePath -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.Concurrent.SingleThreaded: withUnixSocketLogging :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e) => LogMessageRenderer Text -> FilePath -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Log: addLogWriter :: forall h e a. (HasCallStack, LogsTo h e, Monad (LogWriterM h)) => LogWriter h -> Eff e a -> Eff e a
+ Control.Eff.Log: addLogWriter :: IoLogging e => LogWriter -> Eff e a -> Eff e a
- Control.Eff.Log: censorLogs :: LogsTo h e => (LogMessage -> LogMessage) -> Eff e a -> Eff e a
+ Control.Eff.Log: censorLogs :: IoLogging e => (LogMessage -> LogMessage) -> Eff e a -> Eff e a
- Control.Eff.Log: modifyLogWriter :: forall h e a. LogsTo h e => (LogWriter h -> LogWriter h) -> Eff e a -> Eff e a
+ Control.Eff.Log: modifyLogWriter :: IoLogging e => (LogWriter -> LogWriter) -> Eff e a -> Eff e a
- Control.Eff.Log: runLogs :: forall h e b. LogsTo h (Logs : e) => LogPredicate -> Eff (Logs : e) b -> Eff e b
+ Control.Eff.Log: runLogs :: forall e b. (Member LogWriterReader (Logs : e), Lifted IO e) => LogPredicate -> Eff (Logs : e) b -> Eff e b
- Control.Eff.Log: setLogWriter :: forall h e a. LogsTo h e => LogWriter h -> Eff e a -> Eff e a
+ Control.Eff.Log: setLogWriter :: IoLogging e => LogWriter -> Eff e a -> Eff e a
- Control.Eff.Log: withLogging :: forall h e a. (Applicative (LogWriterM h), LogsTo h (Logs : (LogWriterReader h : e))) => LogWriter h -> Eff (Logs : (LogWriterReader h : e)) a -> Eff e a
+ Control.Eff.Log: withLogging :: Lifted IO e => LogWriter -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Log.Examples: logPredicatesExampleClient :: (HasCallStack, Monad (LogWriterM h), LogsTo h e) => Eff e Int
+ Control.Eff.Log.Examples: logPredicatesExampleClient :: (HasCallStack, IoLogging e) => Eff e Int
- Control.Eff.Log.Examples: loggingExampleClient :: (HasCallStack, Monad (LogWriterM h), LogsTo h e) => Eff e ()
+ Control.Eff.Log.Examples: loggingExampleClient :: (HasCallStack, IoLogging e) => Eff e ()
- Control.Eff.Log.Handler: addLogWriter :: forall h e a. (HasCallStack, LogsTo h e, Monad (LogWriterM h)) => LogWriter h -> Eff e a -> Eff e a
+ Control.Eff.Log.Handler: addLogWriter :: IoLogging e => LogWriter -> Eff e a -> Eff e a
- Control.Eff.Log.Handler: censorLogs :: LogsTo h e => (LogMessage -> LogMessage) -> Eff e a -> Eff e a
+ Control.Eff.Log.Handler: censorLogs :: IoLogging e => (LogMessage -> LogMessage) -> Eff e a -> Eff e a
- Control.Eff.Log.Handler: modifyLogWriter :: forall h e a. LogsTo h e => (LogWriter h -> LogWriter h) -> Eff e a -> Eff e a
+ Control.Eff.Log.Handler: modifyLogWriter :: IoLogging e => (LogWriter -> LogWriter) -> Eff e a -> Eff e a
- Control.Eff.Log.Handler: runLogs :: forall h e b. LogsTo h (Logs : e) => LogPredicate -> Eff (Logs : e) b -> Eff e b
+ Control.Eff.Log.Handler: runLogs :: forall e b. (Member LogWriterReader (Logs : e), Lifted IO e) => LogPredicate -> Eff (Logs : e) b -> Eff e b
- Control.Eff.Log.Handler: setLogWriter :: forall h e a. LogsTo h e => LogWriter h -> Eff e a -> Eff e a
+ Control.Eff.Log.Handler: setLogWriter :: IoLogging e => LogWriter -> Eff e a -> Eff e a
- Control.Eff.Log.Handler: withLogging :: forall h e a. (Applicative (LogWriterM h), LogsTo h (Logs : (LogWriterReader h : e))) => LogWriter h -> Eff (Logs : (LogWriterReader h : e)) a -> Eff e a
+ Control.Eff.Log.Handler: withLogging :: Lifted IO e => LogWriter -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.Log.MessageRenderer: renderLogMessageBody :: LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderLogMessageBody :: LogMessageTextRenderer
- Control.Eff.Log.MessageRenderer: renderLogMessageBodyFixWidth :: LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderLogMessageBodyFixWidth :: LogMessageTextRenderer
- Control.Eff.Log.MessageRenderer: renderLogMessageBodyNoLocation :: LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderLogMessageBodyNoLocation :: LogMessageTextRenderer
- Control.Eff.Log.MessageRenderer: renderLogMessageConsoleLog :: LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderLogMessageConsoleLog :: LogMessageTextRenderer
- Control.Eff.Log.MessageRenderer: renderLogMessageSyslog :: LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderLogMessageSyslog :: LogMessageTextRenderer
- Control.Eff.Log.MessageRenderer: renderMaybeLogMessageLens :: Text -> Getter LogMessage (Maybe Text) -> LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderMaybeLogMessageLens :: Text -> Getter LogMessage (Maybe Text) -> LogMessageTextRenderer
- Control.Eff.Log.MessageRenderer: renderRFC3164 :: LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderRFC3164 :: LogMessageTextRenderer
- Control.Eff.Log.MessageRenderer: renderRFC3164WithRFC5424Timestamps :: LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderRFC3164WithRFC5424Timestamps :: LogMessageTextRenderer
- Control.Eff.Log.MessageRenderer: renderRFC3164WithTimestamp :: LogMessageTimeRenderer -> LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderRFC3164WithTimestamp :: LogMessageTimeRenderer -> LogMessageTextRenderer
- Control.Eff.Log.MessageRenderer: renderRFC5424 :: LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderRFC5424 :: LogMessageTextRenderer
- Control.Eff.Log.MessageRenderer: renderRFC5424Header :: LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderRFC5424Header :: LogMessageTextRenderer
- Control.Eff.Log.MessageRenderer: renderRFC5424NoLocation :: LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderRFC5424NoLocation :: LogMessageTextRenderer
- Control.Eff.Log.MessageRenderer: renderSyslogSeverityAndFacility :: LogMessageRenderer Text
+ Control.Eff.Log.MessageRenderer: renderSyslogSeverityAndFacility :: LogMessageTextRenderer
- Control.Eff.Log.Writer: MkLogWriter :: (LogMessage -> LogWriterM writerM ()) -> LogWriter writerM
+ Control.Eff.Log.Writer: MkLogWriter :: (LogMessage -> IO ()) -> LogWriter
- Control.Eff.Log.Writer: [runLogWriter] :: LogWriter writerM -> LogMessage -> LogWriterM writerM ()
+ Control.Eff.Log.Writer: [runLogWriter] :: LogWriter -> LogMessage -> IO ()
- Control.Eff.Log.Writer: askLogWriter :: SetMember LogWriterReader (LogWriterReader h) e => Eff e (LogWriter h)
+ Control.Eff.Log.Writer: askLogWriter :: Member LogWriterReader e => Eff e LogWriter
- Control.Eff.Log.Writer: filteringLogWriter :: Monad (LogWriterM e) => LogPredicate -> LogWriter e -> LogWriter e
+ Control.Eff.Log.Writer: filteringLogWriter :: LogPredicate -> LogWriter -> LogWriter
- Control.Eff.Log.Writer: liftWriteLogMessage :: (HandleLogWriter writer, SetMember LogWriterReader (LogWriterReader writer) e, Member writer e) => LogMessage -> Eff e ()
+ Control.Eff.Log.Writer: liftWriteLogMessage :: (Member LogWriterReader e, Lifted IO e) => LogMessage -> Eff e ()
- Control.Eff.Log.Writer: localLogWriterReader :: forall h e a. SetMember LogWriterReader (LogWriterReader h) e => (LogWriter h -> LogWriter h) -> Eff e a -> Eff e a
+ Control.Eff.Log.Writer: localLogWriterReader :: forall e a. Member LogWriterReader e => (LogWriter -> LogWriter) -> Eff e a -> Eff e a
- Control.Eff.Log.Writer: mappingLogWriter :: (LogMessage -> LogMessage) -> LogWriter e -> LogWriter e
+ Control.Eff.Log.Writer: mappingLogWriter :: (LogMessage -> LogMessage) -> LogWriter -> LogWriter
- Control.Eff.Log.Writer: newtype LogWriter writerM
+ Control.Eff.Log.Writer: newtype LogWriter
- Control.Eff.Log.Writer: noOpLogWriter :: Applicative (LogWriterM m) => LogWriter m
+ Control.Eff.Log.Writer: noOpLogWriter :: LogWriter
- Control.Eff.Log.Writer: runLogWriterReader :: LogWriter h -> Eff (LogWriterReader h : e) a -> Eff e a
+ Control.Eff.Log.Writer: runLogWriterReader :: LogWriter -> Eff (Reader LogWriter : e) a -> Eff e a
- Control.Eff.LogWriter.Async: withAsyncLogWriter :: (LogIo e, MonadBaseControl IO (Eff e), Integral len) => len -> Eff e a -> Eff e a
+ Control.Eff.LogWriter.Async: withAsyncLogWriter :: (IoLogging e, MonadBaseControl IO (Eff e), Integral len) => len -> Eff e a -> Eff e a
- Control.Eff.LogWriter.Async: withAsyncLogging :: (Lifted IO e, MonadBaseControl IO (Eff e), Integral len) => LogWriter (Lift IO) -> len -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.LogWriter.Async: withAsyncLogging :: (Lifted IO e, MonadBaseControl IO (Eff e), Integral len) => LogWriter -> len -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.LogWriter.Console: consoleLogWriter :: LogWriter (Lift IO)
+ Control.Eff.LogWriter.Console: consoleLogWriter :: IO LogWriter
- Control.Eff.LogWriter.Console: withConsoleLogWriter :: LogIo e => Eff e a -> Eff e a
+ Control.Eff.LogWriter.Console: withConsoleLogWriter :: IoLogging e => Eff e a -> Eff e a
- Control.Eff.LogWriter.Console: withConsoleLogging :: Lifted IO e => Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.LogWriter.Console: withConsoleLogging :: Lifted IO e => Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.LogWriter.DebugTrace: debugTraceLogWriter :: forall h. Monad (LogWriterM h) => LogMessageRenderer Text -> LogWriter h
+ Control.Eff.LogWriter.DebugTrace: debugTraceLogWriter :: LogMessageTextRenderer -> LogWriter
- Control.Eff.LogWriter.DebugTrace: withTraceLogWriter :: forall h e a. (Monad (LogWriterM h), LogsTo h e) => Eff e a -> Eff e a
+ Control.Eff.LogWriter.DebugTrace: withTraceLogWriter :: IoLogging e => Eff e a -> Eff e a
- Control.Eff.LogWriter.DebugTrace: withTraceLogging :: Lifted IO e => Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.LogWriter.DebugTrace: withTraceLogging :: Lifted IO e => Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.LogWriter.File: withFileLogWriter :: (LogIo e, MonadBaseControl IO (Eff e)) => FilePath -> Eff e b -> Eff e b
+ Control.Eff.LogWriter.File: withFileLogWriter :: (IoLogging e, MonadBaseControl IO (Eff e), HasCallStack) => FilePath -> LogMessageTextRenderer -> Eff e b -> Eff e b
- Control.Eff.LogWriter.File: withFileLogging :: (Lifted IO e, MonadBaseControl IO (Eff e)) => FilePath -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.LogWriter.File: withFileLogging :: (Lifted IO e, MonadBaseControl IO (Eff e), HasCallStack) => FilePath -> Text -> Facility -> LogPredicate -> LogMessageTextRenderer -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.LogWriter.UDP: withUDPLogWriter :: (LogIo e, MonadBaseControl IO (Eff e), HasCallStack) => (LogMessage -> Text) -> String -> String -> Eff e b -> Eff e b
+ Control.Eff.LogWriter.UDP: withUDPLogWriter :: (IoLogging e, MonadBaseControl IO (Eff e), HasCallStack) => (LogMessage -> Text) -> String -> String -> Eff e b -> Eff e b
- Control.Eff.LogWriter.UDP: withUDPLogging :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e) => (LogMessage -> Text) -> String -> String -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.LogWriter.UDP: withUDPLogging :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e) => (LogMessage -> Text) -> String -> String -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
- Control.Eff.LogWriter.UnixSocket: withUnixSocketLogWriter :: (LogIo e, MonadBaseControl IO (Eff e), HasCallStack) => LogMessageRenderer Text -> FilePath -> Eff e b -> Eff e b
+ Control.Eff.LogWriter.UnixSocket: withUnixSocketLogWriter :: (IoLogging e, MonadBaseControl IO (Eff e), HasCallStack) => LogMessageRenderer Text -> FilePath -> Eff e b -> Eff e b
- Control.Eff.LogWriter.UnixSocket: withUnixSocketLogging :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e) => LogMessageRenderer Text -> FilePath -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader (Lift IO) : e)) a -> Eff e a
+ Control.Eff.LogWriter.UnixSocket: withUnixSocketLogging :: (HasCallStack, MonadBaseControl IO (Eff e), Lifted IO e) => LogMessageRenderer Text -> FilePath -> Text -> Facility -> LogPredicate -> Eff (Logs : (LogWriterReader : e)) a -> Eff e a
Files
- ChangeLog.md +15/−0
- examples/example-2/Main.hs +3/−3
- examples/example-3/Main.hs +3/−4
- extensible-effects-concurrent.cabal +11/−11
- src/Control/Eff/Concurrent.hs +3/−7
- src/Control/Eff/Concurrent/Process/ForkIOScheduler.hs +12/−11
- src/Control/Eff/Concurrent/Process/SingleThreadedScheduler.hs +15/−12
- src/Control/Eff/Concurrent/Protocol/Broker.hs +3/−3
- src/Control/Eff/Concurrent/Protocol/CallbackServer.hs +11/−11
- src/Control/Eff/Concurrent/Protocol/EffectfulServer.hs +6/−6
- src/Control/Eff/Concurrent/Protocol/Observer/Queue.hs +9/−9
- src/Control/Eff/Concurrent/Protocol/StatefulServer.hs +4/−5
- src/Control/Eff/Concurrent/Protocol/Watchdog.hs +8/−8
- src/Control/Eff/Concurrent/SingleThreaded.hs +1/−1
- src/Control/Eff/Log.hs +9/−8
- src/Control/Eff/Log/Examples.hs +60/−62
- src/Control/Eff/Log/Handler.hs +85/−80
- src/Control/Eff/Log/MessageRenderer.hs +41/−17
- src/Control/Eff/Log/Writer.hs +65/−152
- src/Control/Eff/LogWriter/Async.hs +10/−10
- src/Control/Eff/LogWriter/Capture.hs +0/−37
- src/Control/Eff/LogWriter/Console.hs +17/−21
- src/Control/Eff/LogWriter/DebugTrace.hs +8/−8
- src/Control/Eff/LogWriter/File.hs +23/−16
- src/Control/Eff/LogWriter/IO.hs +0/−89
- src/Control/Eff/LogWriter/Rich.hs +59/−0
- src/Control/Eff/LogWriter/UDP.hs +7/−7
- src/Control/Eff/LogWriter/UnixSocket.hs +7/−7
- test/Common.hs +4/−21
- test/GenServerTests.hs +2/−2
- test/LoggingTests.hs +104/−18
- test/LoopTests.hs +5/−5
- test/ObserverTests.hs +2/−2
- test/ProcessBehaviourTestCases.hs +29/−27
ChangeLog.md view
@@ -1,5 +1,20 @@ # Changelog for extensible-effects-concurrent +## 0.31.0++- **Logging**+ - Fix runtime crash caused by logging+ See: [#2](https://github.com/sheyll/extensible-effects-concurrent/issues/2) + - Replace polymorphic `LogWriter` with+ a monomorphic one based on `IO`+ - Rename type aliases:+ - `LogsTo` -> `FilteredLogging`+ - `LogIo` -> `IoLogging`+ - Remove `Capturing` log writer+ - Remove `Capturing` log writer+ - Fix ghci log buffering issue + [#1](https://github.com/sheyll/extensible-effects-concurrent/issues/1) + ## 0.30.0 - Improve inline code documentation - **Supervisor:**
examples/example-2/Main.hs view
@@ -89,7 +89,7 @@ type instance ToPretty (Counter, ObserverRegistry CounterChanged, SupiDupi) = PutStr "supi-counter" -instance (LogIo q) => Server SupiCounter (Processes q) where+instance (IoLogging q) => Server SupiCounter (Processes q) where newtype instance Model SupiCounter = SupiCounterModel ( Integer@@ -148,14 +148,14 @@ (\(SupiCounterModel (_,_,z)) -> z) (\(SupiCounterModel (x,y,_)) z -> SupiCounterModel (x,y,z)) -spawnCounter :: (LogIo q) => Eff (Processes q) ( Endpoint SupiCounter )+spawnCounter :: (IoLogging q) => Eff (Processes q) ( Endpoint SupiCounter ) spawnCounter = startLink MkEmptySupiCounter deriving instance Show (Pdu Counter x) logCounterObservations- :: (LogIo q, Typeable q)+ :: (IoLogging q, Typeable q) => Eff (Processes q) (Endpoint (Observer CounterChanged)) logCounterObservations = startLink OCCStart
examples/example-3/Main.hs view
@@ -3,17 +3,16 @@ import Control.Eff import Control.Eff.Log import Control.Eff.LogWriter.File-import Control.Eff.LogWriter.IO+import Control.Eff.LogWriter.Rich import Control.Eff.LogWriter.DebugTrace import Control.Lens main :: IO () main = runLift- $ withSomeLogging @(Lift IO)- $ withFileLogWriter "extensible-effects-concurrent-example-3.log"+ $ withFileLogging "extensible-effects-concurrent-example-3.log" "test-app" local0 allLogMessages renderConsoleMinimalisticWide $ addLogWriter (filteringLogWriter severeMessages (mappingLogWriter (lmMessage %~ ("traced: " <>)) (debugTraceLogWriter renderRFC5424)))- $ modifyLogWriter (defaultIoLogWriter "example-3" local0)+ $ modifyLogWriter (richLogWriter "example-3" local0) $ addLogWriter (filteringLogWriter severeMessages (mappingLogWriter (lmMessage %~ ("traced without timestamp: " <>)) (debugTraceLogWriter renderRFC5424))) $ do logEmergency "test emergencySeverity 1"
extensible-effects-concurrent.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.0 name: extensible-effects-concurrent-version: 0.30.0+version: 0.31.0 description: Please see the README on GitHub at <https://github.com/sheyll/extensible-effects-concurrent#readme> synopsis: Message passing concurrency as extensible-effect homepage: https://github.com/sheyll/extensible-effects-concurrent#readme@@ -71,10 +71,9 @@ Control.Eff.Log.Writer, Control.Eff.LogWriter.Async, Control.Eff.LogWriter.Console,- Control.Eff.LogWriter.Capture, Control.Eff.LogWriter.DebugTrace, Control.Eff.LogWriter.File,- Control.Eff.LogWriter.IO,+ Control.Eff.LogWriter.Rich, Control.Eff.LogWriter.UDP, Control.Eff.LogWriter.UnixSocket, Control.Eff.Concurrent,@@ -311,24 +310,25 @@ build-depends: async , base+ , containers , data-default , deepseq , extensible-effects-concurrent , extensible-effects+ , filepath+ , hostname+ , HUnit+ , lens+ , monad-control+ , pretty-types >= 0.2.3.1 && < 0.4+ , QuickCheck+ , stm , tasty , tasty-discover , tasty-hunit , text- , containers- , QuickCheck- , lens- , HUnit- , stm , text , time- , filepath- , hostname- , pretty-types >= 0.2.3.1 && < 0.4 default-language: Haskell2010 default-extensions: AllowAmbiguousTypes , BangPatterns
src/Control/Eff/Concurrent.hs view
@@ -38,7 +38,7 @@ module Control.Eff.Concurrent.Protocol.Observer , -- * Utilities- -- ** Logging Effect+ -- ** FilteredLogging Effect module Control.Eff.Log , -- ** Log Writer@@ -54,14 +54,11 @@ -- *** UDP module Control.Eff.LogWriter.UDP - , -- *** Non-IO Log Message Capturing- module Control.Eff.LogWriter.Capture- , -- *** "Debug.Trace" module Control.Eff.LogWriter.DebugTrace , -- *** Generic IO- module Control.Eff.LogWriter.IO+ module Control.Eff.LogWriter.Rich , -- *** Unix Domain Socket module Control.Eff.LogWriter.UnixSocket@@ -253,11 +250,10 @@ ) import Control.Eff.Log import Control.Eff.LogWriter.Async-import Control.Eff.LogWriter.Capture import Control.Eff.LogWriter.Console import Control.Eff.LogWriter.DebugTrace import Control.Eff.LogWriter.File-import Control.Eff.LogWriter.IO+import Control.Eff.LogWriter.Rich import Control.Eff.LogWriter.UDP import Control.Eff.LogWriter.UnixSocket import Control.Eff.Loop
src/Control/Eff/Concurrent/Process/ForkIOScheduler.hs view
@@ -31,7 +31,6 @@ ( ) import Control.Eff.Extend import Control.Eff.Log-import Control.Eff.LogWriter.IO import Control.Eff.LogWriter.Console import Control.Eff.LogWriter.Async import Control.Eff.Reader.Strict as Reader@@ -119,11 +118,11 @@ return (np, pt, pct, pm, nm) logDebug "ForkIO Scheduler info" logDebug $ "nextPid: " <> np- logDebug $ "process table:"+ logDebug "process table:" traverse_ logDebug pt- logDebug $ "process cancellation table:"+ logDebug "process cancellation table:" traverse_ logDebug pct- logDebug $ "process monitors:"+ logDebug "process monitors:" traverse_ logDebug pm logDebug $ "nextMonitorIndex: " <> nm @@ -149,7 +148,7 @@ check ( targetState == ProcessShuttingDown || targetState == ProcessBusyReceiving || targetState == ProcessIdle)- if targetState /= ProcessShuttingDown then do+ if targetState /= ProcessShuttingDown then insertMonitoringReference >> pure 1 else processAlreadyDead >> pure 2@@ -175,7 +174,7 @@ monRefs <- readTVar (schedulerState ^. processMonitors) catMaybes <$> traverse go (toList monRefs) where- go (mr, owner) = do+ go (mr, owner) = if monitoredProcess mr == downPid then do let processDownMessage = ProcessDown mr reason downPid@@ -293,12 +292,14 @@ -- | Start the message passing concurrency system then execute a 'Process' on -- top of 'BaseEffects' effect. All logging is sent to standard output. defaultMain :: HasCallStack => Eff Effects () -> IO ()-defaultMain = defaultMainWithLogWriter consoleLogWriter+defaultMain e = do+ lw <- consoleLogWriter+ defaultMainWithLogWriter lw e -- | Start the message passing concurrency system then execute a 'Process' on -- top of 'BaseEffects' effect. All logging is sent to standard output. defaultMainWithLogWriter- :: HasCallStack => LogWriter (Lift IO) -> Eff Effects () -> IO ()+ :: HasCallStack => LogWriter -> Eff Effects () -> IO () defaultMainWithLogWriter lw = runLift . withLogging lw . withAsyncLogWriter (1024 :: Int) . schedule @@ -555,7 +556,7 @@ >>= lift . atomically . enqueueMessageOtherProcess toPid msg- interpretSendShutdownOrInterrupt !toPid !msg = do+ interpretSendShutdownOrInterrupt !toPid !msg = setMyProcessState (either (const ProcessBusySendingShutdown) (const ProcessBusySendingInterrupt)@@ -682,7 +683,7 @@ let addProcessId = over lmProcessId (maybe (Just (T.pack (show title ++ show pid))) Just)- in censorLogs @(Lift IO) addProcessId+ in censorLogs addProcessId triggerProcessLinksAndMonitors :: ProcessId -> Interrupt 'NoRecovery -> TVar (Set ProcessId) -> Eff BaseEffects () triggerProcessLinksAndMonitors !pid !reason !linkSetVar = do@@ -730,7 +731,7 @@ ) ) res- when (not (null downMessageSendResults)) $+ unless (null downMessageSendResults) $ logWarning ( "failed to enqueue monitor down messages for: " <> T.pack(show downMessageSendResults)
src/Control/Eff/Concurrent/Process/SingleThreadedScheduler.hs view
@@ -24,7 +24,6 @@ import Control.Eff.Concurrent.Misc import Control.Eff.Concurrent.Process import Control.Eff.Log-import Control.Eff.LogWriter.IO import Control.Eff.LogWriter.Console import Control.Lens hiding ( (|>) , Empty@@ -112,7 +111,7 @@ toPS p = ( p ^. processInfoTitle , p ^. processInfoDetails- , case (p ^. processInfoMessageQ) -- TODO get more detailed state+ , case p ^. processInfoMessageQ -- TODO get more detailed state of _ :<| _ -> ProcessBusy _ -> ProcessIdle)@@ -220,9 +219,9 @@ -- -- @since 0.3.0.2 schedulePure- :: Eff (Processes '[Logs, LogWriterReader Logs]) a+ :: Eff (Processes PureBaseEffects) a -> Either (Interrupt 'NoRecovery) a-schedulePure e = run (scheduleM (withSomeLogging @Logs) (return ()) e)+schedulePure e = run (scheduleM withoutLogging (return ()) e) -- | Invoke 'scheduleM' with @lift 'Control.Concurrent.yield'@ as yield effect. -- @scheduleIO runEff == 'scheduleM' (runLift . runEff) (liftIO 'yield')@@@ -256,7 +255,7 @@ -- @since 0.4.0.0 scheduleIOWithLogging :: HasCallStack- => LogWriter (Lift IO)+ => LogWriter -> Eff EffectsIo a -> IO (Either (Interrupt 'NoRecovery) a) scheduleIOWithLogging h = scheduleIO (withLogging h)@@ -600,17 +599,21 @@ -- -- To use another 'LogWriter' use 'defaultMainWithLogWriter' instead. defaultMain :: HasCallStack => Eff EffectsIo () -> IO ()-defaultMain =- void- . runLift- . withLogging consoleLogWriter- . scheduleMonadIOEff+defaultMain e =+ consoleLogWriter >>=+ (\lw ->+ void+ . runLift+ . withLogging lw+ . scheduleMonadIOEff+ $ e) + -- | Execute a 'Process' using 'scheduleM' on top of 'Lift' @IO@. -- All logging is written using the given 'LogWriter'. -- -- @since 0.25.0-defaultMainWithLogWriter :: HasCallStack => LogWriter (Lift IO) -> Eff EffectsIo () -> IO ()+defaultMainWithLogWriter :: HasCallStack => LogWriter -> Eff EffectsIo () -> IO () defaultMainWithLogWriter lw = void . runLift@@ -637,7 +640,7 @@ -- 'Logs' and the 'LogWriterReader' for 'PureLogWriter'. -- -- @since 0.25.0-type PureBaseEffects = '[Logs, LogWriterReader Logs]+type PureBaseEffects = '[Logs, LogWriterReader] -- | Constraint for the existence of the underlying scheduler effects. --
src/Control/Eff/Concurrent/Protocol/Broker.hs view
@@ -108,7 +108,7 @@ startLink :: forall p e . ( HasCallStack- , LogIo (Processes e)+ , IoLogging (Processes e) , TangibleBroker p , Stateful.Server (Broker p) (Processes e) )@@ -124,7 +124,7 @@ statefulChild :: forall p e . ( HasCallStack- , LogIo (Processes e)+ , IoLogging (Processes e) , TangibleBroker (Stateful.Stateful p) , Stateful.Server (Broker (Stateful.Stateful p)) (Processes e) )@@ -436,7 +436,7 @@ instance- ( LogIo q+ ( IoLogging q , TangibleBroker p , Tangible (ChildId p) , Typeable (Effectful.ServerPdu p)
src/Control/Eff/Concurrent/Protocol/CallbackServer.hs view
@@ -41,11 +41,11 @@ -- -- @since 0.29.1 start- :: forall (tag :: Type) eLoop q h e.+ :: forall (tag :: Type) eLoop q e. ( HasCallStack , TangibleCallbacks tag eLoop q , E.Server (Server tag eLoop) (Processes q)- , LogsTo h (Processes q)+ , FilteredLogging (Processes q) , HasProcesses e q ) => CallbacksEff tag eLoop q@@ -57,11 +57,11 @@ -- -- @since 0.29.1 startLink- :: forall (tag :: Type) eLoop q h e.+ :: forall (tag :: Type) eLoop q e. ( HasCallStack , TangibleCallbacks tag eLoop q , E.Server (Server tag eLoop) (Processes q)- , LogsTo h (Processes q)+ , FilteredLogging (Processes q) , HasProcesses e q ) => CallbacksEff tag eLoop q@@ -136,11 +136,11 @@ -- -- @since 0.29.1 callbacks- :: forall tag q h.+ :: forall tag q. ( HasCallStack , TangibleCallbacks tag (Processes q) q , E.Server (Server tag (Processes q)) (Processes q)- , LogsTo h q+ , FilteredLogging q ) => (Endpoint tag -> Event tag -> Eff (Processes q) ()) -> ServerId tag@@ -151,11 +151,11 @@ -- -- @since 0.29.1 onEvent- :: forall tag q h.+ :: forall tag q . ( HasCallStack , TangibleCallbacks tag (Processes q) q , E.Server (Server tag (Processes q)) (Processes q)- , LogsTo h q+ , FilteredLogging q ) => (Event tag -> Eff (Processes q) ()) -> ServerId (tag :: Type)@@ -175,11 +175,11 @@ -- -- @since 0.29.1 callbacksEff- :: forall tag eLoop q h.+ :: forall tag eLoop q. ( HasCallStack , TangibleCallbacks tag eLoop q , E.Server (Server tag eLoop) (Processes q)- , LogsTo h q+ , FilteredLogging q ) => (forall x . Endpoint tag -> Eff eLoop x -> Eff (Processes q) x) -> (Endpoint tag -> Event tag -> Eff eLoop ())@@ -195,7 +195,7 @@ ( HasCallStack , TangibleCallbacks tag eLoop q , E.Server (Server tag eLoop) (Processes q)- , LogsTo h q+ , FilteredLogging q ) => (forall a. Eff eLoop a -> Eff (Processes q) a) -> (Event tag -> Eff eLoop ())
src/Control/Eff/Concurrent/Protocol/EffectfulServer.hs view
@@ -83,11 +83,11 @@ -- -- @since 0.24.0 start- :: forall a r q h+ :: forall a r q . ( Server a (Processes q) , Typeable a , Typeable (ServerPdu a)- , LogsTo h (Processes q)+ , FilteredLogging (Processes q) , HasProcesses (ServerEffects a (Processes q)) q , HasProcesses r q , HasCallStack)@@ -99,11 +99,11 @@ -- -- @since 0.24.0 startLink- :: forall a r q h+ :: forall a r q . ( Typeable a , Typeable (ServerPdu a) , Server a (Processes q)- , LogsTo h (Processes q)+ , FilteredLogging (Processes q) , HasProcesses (ServerEffects a (Processes q)) q , HasProcesses r q , HasCallStack)@@ -115,9 +115,9 @@ -- -- @since 0.24.0 protocolServerLoop- :: forall q h a+ :: forall q a . ( Server a (Processes q)- , LogsTo h (Processes q)+ , FilteredLogging (Processes q) , HasProcesses (ServerEffects a (Processes q)) q , Typeable a , Typeable (ServerPdu a)
src/Control/Eff/Concurrent/Protocol/Observer/Queue.hs view
@@ -125,12 +125,12 @@ -- -- @since 0.28.0 observe- :: forall event eventSource e q len b h+ :: forall event eventSource e q len b . ( HasCallStack , HasProcesses e q- , LogsTo h e- , LogsTo h q- , LogsTo h (Processes q)+ , FilteredLogging e+ , FilteredLogging q+ , FilteredLogging (Processes q) , Lifted IO e , Lifted IO q , IsObservable eventSource event@@ -178,10 +178,10 @@ -- -- @since 0.28.0 spawnWriter- :: forall event r q h+ :: forall event r q . ( Member Logs q , Lifted IO q- , LogsTo h (Processes q)+ , FilteredLogging (Processes q) , HasProcesses r q , Typeable event , HasCallStack@@ -190,7 +190,7 @@ => ObservationQueue event -> Eff r (Endpoint (Observer event)) spawnWriter q =- startLink @_ @r @q @h (MkObservationQueue q)+ startLink @_ @r @q (MkObservationQueue q) -- | Spawn a process that can be used as an 'Observer' that enqueues the observations into an -- 'ObservationQueue'. See 'withObservationQueue'.@@ -201,11 +201,11 @@ -- -- @since 0.28.0 withWriter- :: forall event eventSource e q b h+ :: forall event eventSource e q b . ( HasCallStack , HasProcesses e q , Lifted IO q- , LogsTo h (Processes q)+ , FilteredLogging (Processes q) , Member Logs q , IsObservable eventSource event , Member (Reader event) e
src/Control/Eff/Concurrent/Protocol/StatefulServer.hs view
@@ -137,10 +137,10 @@ -- -- @since 0.24.0 startLink- :: forall a r q h+ :: forall a r q . ( HasCallStack , Typeable a- , LogsTo h (Processes q)+ , FilteredLogging (Processes q) , Effectful.Server (Stateful a) (Processes q) , Server a (Processes q) , HasProcesses r q@@ -152,13 +152,12 @@ -- -- @since 0.24.0 start- :: forall a r q h+ :: forall a r q . ( HasCallStack , Typeable a , Effectful.Server (Stateful a) (Processes q) , Server a (Processes q)- , HandleLogWriter h- , LogsTo h (Processes q)+ , FilteredLogging (Processes q) , HasProcesses r q ) => StartArgument a (Processes q) -> Eff r (Endpoint (Protocol a))
src/Control/Eff/Concurrent/Protocol/Watchdog.hs view
@@ -84,10 +84,10 @@ -- -- @since 0.30.0 startLink- :: forall child e q h+ :: forall child e q . ( HasCallStack , Typeable child- , LogsTo h (Processes q)+ , FilteredLogging (Processes q) , Member Logs q , HasProcesses e q , Tangible (Broker.ChildId child)@@ -104,9 +104,9 @@ -- -- @since 0.30.0 attachTemporary- :: forall child q e h+ :: forall child q e . ( HasCallStack- , LogsTo h e+ , FilteredLogging e , Typeable child , HasPdu (Effectful.ServerPdu child) , Tangible (Broker.ChildId child)@@ -123,9 +123,9 @@ -- -- @since 0.30.0 attachPermanent- :: forall child q e h+ :: forall child q e . ( HasCallStack- , LogsTo h e+ , FilteredLogging e , Typeable child , HasPdu (Effectful.ServerPdu child) , Tangible (Broker.ChildId child)@@ -142,9 +142,9 @@ -- -- @since 0.30.0 getCrashReports- :: forall child q e h+ :: forall child q e . ( HasCallStack- , LogsTo h e+ , FilteredLogging e , Typeable child , HasPdu (Effectful.ServerPdu child) , Tangible (Broker.ChildId child)
src/Control/Eff/Concurrent/SingleThreaded.hs view
@@ -48,7 +48,7 @@ -- @since 0.25.0 schedule :: HasCallStack- => LogWriter (Lift IO)+ => LogWriter -> Eff Effects a -> IO (Either (Interrupt 'NoRecovery) a) schedule = scheduleIOWithLogging
src/Control/Eff/Log.hs view
@@ -1,6 +1,6 @@--- | Logging via @extensible-effects@+-- | FilteredLogging via @extensible-effects@ ----- Logging consist of __two__ effects:+-- FilteredLogging consist of __two__ effects: -- -- * __Receiving__ log messages sent by the code using e.g. 'logInfo'; this also include deep evaluation and -- dropping messages not satisfying the current 'LogPredicate'.@@ -64,10 +64,10 @@ -- -- === 'LogWriter's ----- * Logging in a 'Control.Concurrent.Async.withAsync' spawned thread is done using 'withAsyncLogging'.+-- * FilteredLogging in a 'Control.Concurrent.Async.withAsync' spawned thread is done using 'withAsyncLogging'. module Control.Eff.Log- ( -- * Logging API+ ( -- * FilteredLogging API -- ** Sending Log Messages #SendingLogs# logMsg , logWithSeverity@@ -109,14 +109,15 @@ -- *** Log Message Modification , censorLogs- , censorLogsM+ , censorLogsIo -- ** 'Logs' Effect Handling , Logs()- , LogsTo- , LogIo+ , FilteredLogging+ , IoLogging+ , LoggingAndIo , withLogging- , withSomeLogging+ , withoutLogging -- ** Low-Level API for Custom Extensions -- *** Log Message Interception
src/Control/Eff/Log/Examples.hs view
@@ -1,11 +1,11 @@--- | Examples for Logging.+-- | Examples for FilteredLogging. module Control.Eff.Log.Examples- ( -- * Example Code for Logging+ ( -- * Example Code for FilteredLogging exampleLogging , exampleWithLogging , exampleWithSomeLogging- , exampleLogPredicate- , exampleLogCapture+ , exampleSetLogWriter+ , exampleLogTrace , exampleAsyncLogging , exampleRFC5424Logging , exampleRFC3164WithRFC5424TimestampsLogging@@ -23,8 +23,7 @@ import Control.Eff.LogWriter.Async import Control.Eff.LogWriter.Console import Control.Eff.LogWriter.DebugTrace-import Control.Eff.LogWriter.Capture-import Control.Eff.LogWriter.IO+import Control.Eff.LogWriter.Rich import Control.Eff.LogWriter.UnixSocket import Control.Eff.LogWriter.UDP import Control.Eff@@ -32,16 +31,14 @@ , (%~) , to )-import Data.Text as T-import Data.Text.IO as T import GHC.Stack --- * Logging examples+-- * FilteredLogging examples -- | Example code for: -- -- * 'withConsoleLogging'--- * 'mkLogWriterIO'+-- * 'MkLogWriter' -- See 'loggingExampleClient' exampleLogging :: HasCallStack => IO () exampleLogging = runLift@@ -52,73 +49,74 @@ -- * 'withLogging' -- * 'consoleLogWriter' exampleWithLogging :: HasCallStack => IO ()-exampleWithLogging =- runLift $ withLogging consoleLogWriter $ logDebug "Oh, hi there"+exampleWithLogging = do+ lw <- consoleLogWriter+ runLift $ withLogging lw $ logDebug "Oh, hi there" -- | Example code for: ----- * 'withSomeLogging'+-- * 'withoutLogging' -- * 'logDebug' exampleWithSomeLogging :: HasCallStack => () exampleWithSomeLogging =- run $ withSomeLogging @Logs $ logDebug "Oh, hi there"+ run $ withoutLogging $ logDebug "Oh, hi there" --- | Example code for:+-- | Example code for: 'setLogWriter' ----- * 'setLogPredicate'--- * 'modifyLogPredicate'--- * 'lmMessageStartsWith'--- * 'lmSeverityIs'--- * 'lmSeverityIsAtLeast'--- * 'includeLogMessages'--- * 'excludeLogMessages'-exampleLogPredicate :: HasCallStack => IO Int-exampleLogPredicate =+-- Also used:+-- * 'stdoutLogWriter'+-- * 'renderConsoleMinimalisticWide'+-- * 'consoleLogWriter'+-- * 'logAlert'+-- * 'withLogging'+exampleSetLogWriter :: HasCallStack => IO ()+exampleSetLogWriter = do+ lw1 <- stdoutLogWriter renderConsoleMinimalisticWide+ lw2 <- consoleLogWriter runLift- $ withSomeLogging @(Lift IO)- $ setLogWriter consoleLogWriter- $ logPredicatesExampleClient+ $ withLogging lw1+ $ do logAlert "test with log writer 1"+ setLogWriter lw2 (logAlert "test with log writer 2")+ logAlert "test with log writer 1 again" + -- | Example code for: -- -- * 'runCaptureLogWriter' -- * 'captureLogWriter' -- * 'mappingLogWriter' -- * 'filteringLogWriter'-exampleLogCapture :: IO ()-exampleLogCapture = go >>= T.putStrLn- where- go =- fmap (T.unlines . Prelude.map renderLogMessageConsoleLog . snd)- $ runLift- $ runCaptureLogWriter- $ withLogging captureLogWriter- $ addLogWriter- (mappingLogWriter (lmMessage %~ ("CAPTURED " <>)) captureLogWriter)- $ addLogWriter- (filteringLogWriter- severeMessages- (mappingLogWriter (lmMessage %~ ("TRACED " <>))- (debugTraceLogWriter renderRFC5424)- )+exampleLogTrace :: IO ()+exampleLogTrace = do+ lw <- consoleLogWriter+ runLift+ $ withRichLogging lw "test-app" local7 allLogMessages+ $ addLogWriter+ (filteringLogWriter+ severeMessages+ (mappingLogWriter (lmMessage %~ ("TRACED " <>))+ (debugTraceLogWriter renderRFC5424) )- $ do- logEmergency "test emergencySeverity 1"- logCritical "test criticalSeverity 2"- logAlert "test alertSeverity 3"- logError "test errorSeverity 4"- logWarning "test warningSeverity 5"- logInfo "test informationalSeverity 6"- logDebug "test debugSeverity 7"- severeMessages = view (lmSeverity . to (<= errorSeverity))+ )+ $ do+ logEmergency "test emergencySeverity 1"+ logCritical "test criticalSeverity 2"+ logAlert "test alertSeverity 3"+ logError "test errorSeverity 4"+ logWarning "test warningSeverity 5"+ logInfo "test informationalSeverity 6"+ logDebug "test debugSeverity 7"+ where+ severeMessages = view (lmSeverity . to (<= errorSeverity)) -- | Example code for: -- -- * 'withAsyncLogging' exampleAsyncLogging :: IO ()-exampleAsyncLogging =- runLift $ withLogging consoleLogWriter $ withAsyncLogWriter (1000 :: Int) $ do+exampleAsyncLogging = do+ lw <- stdoutLogWriter renderConsoleMinimalisticWide+ runLift $ withLogging lw $ withAsyncLogWriter (1000 :: Int) $ do logInfo "test 1" logInfo "test 2" logInfo "test 3"@@ -128,19 +126,19 @@ exampleRFC5424Logging :: IO Int exampleRFC5424Logging = runLift- $ withSomeLogging @(Lift IO)+ $ withoutLogging $ setLogWriter- (defaultIoLogWriter "myapp" local2 (debugTraceLogWriter renderRFC5424))- $ logPredicatesExampleClient+ (richLogWriter "myapp" local2 (debugTraceLogWriter renderRFC5424))+ logPredicatesExampleClient -- | Example code for RFC3164 with RFC5424 time stamp formatted logs. exampleRFC3164WithRFC5424TimestampsLogging :: IO Int exampleRFC3164WithRFC5424TimestampsLogging = runLift- $ withSomeLogging @(Lift IO)+ $ withoutLogging $ setLogWriter- (defaultIoLogWriter "myapp" local2 (debugTraceLogWriter renderRFC3164WithRFC5424Timestamps))- $ logPredicatesExampleClient+ (richLogWriter "myapp" local2 (debugTraceLogWriter renderRFC3164WithRFC5424Timestamps))+ logPredicatesExampleClient -- | Example code logging via a unix domain socket to @/dev/log@. exampleDevLogSyslogLogging :: IO Int@@ -186,7 +184,7 @@ -- * 'logWarning' -- * 'logCritical' -- * 'lmMessage'-loggingExampleClient :: (HasCallStack, Monad (LogWriterM h), LogsTo h e) => Eff e ()+loggingExampleClient :: (HasCallStack, IoLogging e) => Eff e () loggingExampleClient = do logDebug "test 1.1" logError "test 1.2"@@ -209,7 +207,7 @@ -- * 'lmSeverityIsAtLeast' -- * 'includeLogMessages' -- * 'excludeLogMessages'-logPredicatesExampleClient :: (HasCallStack, Monad (LogWriterM h), LogsTo h e) => Eff e Int+logPredicatesExampleClient :: (HasCallStack, IoLogging e) => Eff e Int logPredicatesExampleClient = do logInfo "test" setLogPredicate
src/Control/Eff/Log/Handler.hs view
@@ -5,7 +5,7 @@ -- Good support for logging to a file or to the network, -- as well as asynchronous logging in another thread. module Control.Eff.Log.Handler- ( -- * Logging API+ ( -- * FilteredLogging API -- ** Sending Log Messages logMsg , logWithSeverity@@ -46,18 +46,20 @@ -- *** Log Message Modification , censorLogs- , censorLogsM+ , censorLogsIo -- ** 'Logs' Effect Handling , Logs()- , LogsTo- , LogIo+ , FilteredLogging+ , IoLogging+ , LoggingAndIo , withLogging- , withSomeLogging+ , withoutLogging -- ** Low-Level API for Custom Extensions -- *** Log Message Interception , runLogs+ , runLogsWithoutLogging , respondToLogMessage , interceptLogMessages @@ -111,34 +113,34 @@ -- | This instance allows lifting the 'Logs' effect into a base monad, e.g. 'IO'. -- This instance needs a 'LogWriterReader' in the base monad, -- that is capable to handle 'logMsg' invocations.-instance forall m e. (MonadBase m m, LiftedBase m e, LogsTo (Lift m) (Logs ': e))+instance forall m e. (MonadBase m IO, MonadBaseControl IO (Eff e), LiftedBase m e, Lifted IO e, IoLogging (Logs ': e)) => MonadBaseControl m (Eff (Logs ': e)) where type StM (Eff (Logs ': e)) a = StM (Eff e) a liftBaseWith f = do lf <- askLogPredicate- raise (liftBaseWith (\runInBase -> f (runInBase . runLogs @(Lift m) lf)))+ raise (liftBaseWith (\runInBase -> f (runInBase . runLogs lf))) restoreM = raise . restoreM instance (LiftedBase m e, Catch.MonadThrow (Eff e)) => Catch.MonadThrow (Eff (Logs ': e)) where throwM exception = raise (Catch.throwM exception) -instance (Applicative m, LiftedBase m e, Catch.MonadCatch (Eff e), LogsTo (Lift m) (Logs ': e))+instance (Applicative m, MonadBaseControl IO (Eff e), LiftedBase m e, Catch.MonadCatch (Eff e), IoLogging (Logs ': e), Lifted IO e) => Catch.MonadCatch (Eff (Logs ': e)) where catch effect handler = do lf <- askLogPredicate- let lower = runLogs @(Lift m) lf+ let lower = runLogs lf nestedEffects = lower effect nestedHandler exception = lower (handler exception) raise (Catch.catch nestedEffects nestedHandler) -instance (Applicative m, LiftedBase m e, Catch.MonadMask (Eff e), LogsTo (Lift m) (Logs ': e))+instance (Applicative m, MonadBaseControl IO (Eff e), LiftedBase m e, Catch.MonadMask (Eff e), IoLogging (Logs ': e), Lifted IO e) => Catch.MonadMask (Eff (Logs ': e)) where mask maskedEffect = do lf <- askLogPredicate let lower :: Eff (Logs ': e) a -> Eff e a- lower = runLogs @(Lift m) lf+ lower = runLogs lf raise (Catch.mask (\nestedUnmask -> lower@@ -151,7 +153,7 @@ lf <- askLogPredicate let lower :: Eff (Logs ': e) a -> Eff e a- lower = runLogs @(Lift m) lf+ lower = runLogs lf raise (Catch.uninterruptibleMask (\nestedUnmask -> lower@@ -164,7 +166,7 @@ lf <- askLogPredicate let lower :: Eff (Logs ': e) a -> Eff e a- lower = runLogs @(Lift m) lf+ lower = runLogs lf raise (Catch.generalBracket (lower acquire)@@ -172,42 +174,42 @@ (lower . useIt) ) ---- | A constraint alias for effects that requires a 'LogWriterReader', as well as that the--- contained 'LogWriterReader' has a 'HandleLogWriter' instance.+-- | A constraint that requires @'Logs' e@ and @'Lifted' 'IO' e@. ----- The requirements of this constraint are provided by:+-- Provided by 'withLogging' and 'runLogs'. ----- * 'withIoLogging'--- * 'withLogging'--- * 'withSomeLogging'+-- It contains 'FilteredLogging' and allows in addition: ---type LogsTo h e =- ( Member Logs e- , HandleLogWriter h- , Member h e- , SetMember LogWriterReader (LogWriterReader h) e- )---- | This instance is for pure logging - i.e. discarding all messages.+-- * censorLogsIo ----- @since 0.29.1-instance HandleLogWriter Logs where- data LogWriterM Logs a = MkPureLogging deriving (Functor)- handleLogWriterEffect = const (pure ())--instance Applicative (LogWriterM Logs) where- pure = const MkPureLogging- MkPureLogging <*> MkPureLogging = MkPureLogging+-- Don't infect everything with 'IO', if you can fall back to+-- 'FilteredLogging'.+--+-- @since 0.24.0+type IoLogging e = (FilteredLogging e, Lifted IO e) -instance Monad (LogWriterM Logs) where- MkPureLogging >>= _ = MkPureLogging+-- | A constraint that requires 'Logs' and 'LogWriterReader',+-- and hence supports the functions to filter and modify+-- logs:+--+-- * setLogWriter+-- * addLogWriter+-- * modifyLogWriter+-- * censorLogs+--+-- Provided by 'withLogging', 'runLogs', and also+-- 'withoutLogging' and 'runLogsWithoutLogging'.+--+-- @since 0.31.0+type FilteredLogging e = (Member Logs e, Member LogWriterReader e) --- | A constraint that required @'LogsTo' 'IO' e@ and @'Lifted' 'IO' e@.+-- | The concrete list of 'Eff'ects for logging with a+-- 'LogWriter', and a 'LogWriterReader'. ----- @since 0.24.0-type LogIo e = (LogsTo (Lift IO) e, Lifted IO e)+-- This also provides both 'IoLogging' and 'FilteredLogging'.+type LoggingAndIo = '[Logs, LogWriterReader, Lift IO] + -- | Handle the 'Logs' and 'LogWriterReader' effects. -- -- It installs the given 'LogWriter', which determines the underlying@@ -221,44 +223,57 @@ -- > $ withLogging consoleLogWriter -- > $ logDebug "Oh, hi there" ---withLogging ::- forall h e a. (Applicative (LogWriterM h), LogsTo h (Logs ': LogWriterReader h ': e))- => LogWriter h -> Eff (Logs ': LogWriterReader h ': e) a -> Eff e a+-- This provides the 'IoLogging' and 'FilteredLogging' effects.+--+-- See also 'runLogs'.+--+withLogging :: Lifted IO e => LogWriter -> Eff (Logs ': LogWriterReader ': e) a -> Eff e a withLogging lw = runLogWriterReader lw . runLogs allLogMessages --- | Handles the 'Logs' and 'LogWriterReader' effects.------ By default it uses the 'noOpLogWriter', but using 'setLogWriter' the--- 'LogWriter' can be replaced.+-- | Handles the 'Logs' and 'LogWriterReader' effects, while not invoking the 'LogWriter' at all. ----- This is like 'withLogging' applied to 'noOpLogWriter'+-- There is no way to get log output when this logger is used. -- -- Example: -- -- > exampleWithSomeLogging :: () -- > exampleWithSomeLogging = -- > run--- > $ withSomeLogging @PureLogWriter--- > $ logDebug "Oh, hi there"+-- > $ withoutLogging+-- > $ logDebug "Oh, hi there" -- Nothing written ---withSomeLogging ::- forall h e a.- (Applicative (LogWriterM h), LogsTo h (Logs ': LogWriterReader h ': e))- => Eff (Logs ': LogWriterReader h ': e) a- -> Eff e a-withSomeLogging = withLogging (noOpLogWriter @h)+-- This provides the 'FilteredLogging' effect.+--+-- See also 'runLogsWithoutLogging'.+--+withoutLogging :: Eff (Logs ': LogWriterReader ': e) a -> Eff e a+withoutLogging = runLogWriterReader mempty . runLogsWithoutLogging noLogMessages -- | Raw handling of the 'Logs' effect. -- Exposed for custom extensions, if in doubt use 'withLogging'. runLogs- :: forall h e b .- (LogsTo h (Logs ': e))+ :: forall e b .+ ( Member LogWriterReader (Logs ': e)+ , Lifted IO e+ ) => LogPredicate -> Eff (Logs ': e) b -> Eff e b runLogs p m = fix (handle_relay (\a _ -> return a)) (sendLogMessageToLogWriter m) p +-- | Raw handling of the 'Logs' effect.+-- Exposed for custom extensions, if in doubt use 'withoutLogging'.+runLogsWithoutLogging+ :: forall e b .+ ( Member LogWriterReader (Logs ': e)+ )+ => LogPredicate+ -> Eff (Logs ': e) b+ -> Eff e b+runLogsWithoutLogging p m =+ fix (handle_relay (\a _ -> return a)) m p+ -- | Log a message. -- -- All logging goes through this function.@@ -475,7 +490,7 @@ -- | Issue a log statement for each item in the list prefixed with a line number and a message hash. ----- When several concurrent processes issue log statements, multiline log statements are often+-- When several concurrent processes issue log statements, multi line log statements are often -- interleaved. -- -- In order to make the logs easier to read, this function will count the items and calculate a unique@@ -539,8 +554,8 @@ -- -- E.g. to keep only messages which begin with @"OMG"@: ----- > exampleLogPredicate :: IO Int--- > exampleLogPredicate =+-- > exampleSetLogWriter :: IO Int+-- > exampleSetLogWriter = -- > runLift -- > $ withLogging consoleLogWriter -- > $ do logMsg "test"@@ -678,38 +693,30 @@ interceptLogMessages f = respondToLogMessage (f >=> logMsg) -- | Internal function.-sendLogMessageToLogWriter- :: forall h e b . (LogsTo h e) => Eff e b -> Eff e b+sendLogMessageToLogWriter :: IoLogging e => Eff e b -> Eff e b sendLogMessageToLogWriter = respondToLogMessage liftWriteLogMessage -- | Change the current 'LogWriter'.-modifyLogWriter- :: forall h e a- . (LogsTo h e)- => (LogWriter h -> LogWriter h)- -> Eff e a- -> Eff e a+modifyLogWriter :: IoLogging e => (LogWriter -> LogWriter) -> Eff e a -> Eff e a modifyLogWriter f = localLogWriterReader f . sendLogMessageToLogWriter -- | Replace the current 'LogWriter'. -- To add an additional log message consumer use 'addLogWriter'-setLogWriter :: forall h e a. (LogsTo h e) => LogWriter h -> Eff e a -> Eff e a+setLogWriter :: IoLogging e => LogWriter -> Eff e a -> Eff e a setLogWriter = modifyLogWriter . const -- | Modify the the 'LogMessage's written in the given sub-expression. -- -- Note: This is equivalent to @'modifyLogWriter' . 'mappingLogWriter'@-censorLogs :: (LogsTo h e) => (LogMessage -> LogMessage) -> Eff e a -> Eff e a+censorLogs :: IoLogging e => (LogMessage -> LogMessage) -> Eff e a -> Eff e a censorLogs = modifyLogWriter . mappingLogWriter -- | Modify the the 'LogMessage's written in the given sub-expression, as in 'censorLogs' -- but with a effectful function. ----- Note: This is equivalent to @'modifyLogWriter' . 'mappingLogWriterM'@-censorLogsM- :: (LogsTo h e, Monad (LogWriterM h))- => (LogMessage -> LogWriterM h LogMessage) -> Eff e a -> Eff e a-censorLogsM = modifyLogWriter . mappingLogWriterM+-- Note: This is equivalent to @'modifyLogWriter' . 'mappingLogWriterIO'@+censorLogsIo :: IoLogging e => (LogMessage -> IO LogMessage) -> Eff e a -> Eff e a+censorLogsIo = modifyLogWriter . mappingLogWriterIO -- | Combine the effects of a given 'LogWriter' and the existing one. --@@ -735,7 +742,5 @@ -- > severeMessages = view (lmSeverity . to (<= errorSeverity)) -- > ---addLogWriter :: forall h e a .- (HasCallStack, LogsTo h e, Monad (LogWriterM h))- => LogWriter h -> Eff e a -> Eff e a+addLogWriter :: IoLogging e => LogWriter -> Eff e a -> Eff e a addLogWriter lw2 = modifyLogWriter (\lw1 -> MkLogWriter (\m -> runLogWriter lw1 m >> runLogWriter lw2 m))
src/Control/Eff/Log/MessageRenderer.hs view
@@ -5,8 +5,10 @@ -- * Log Message Text Rendering LogMessageRenderer+ , LogMessageTextRenderer , renderLogMessageSyslog , renderLogMessageConsoleLog+ , renderConsoleMinimalisticWide , renderRFC3164 , renderRFC3164WithRFC5424Timestamps , renderRFC3164WithTimestamp@@ -46,6 +48,11 @@ -- | 'LogMessage' rendering function type LogMessageRenderer a = LogMessage -> a +-- | 'LogMessage' to 'T.Text' rendering function.+--+-- @since 0.31.0+type LogMessageTextRenderer = LogMessageRenderer T.Text+ -- | A rendering function for the 'lmTimestamp' field. newtype LogMessageTimeRenderer = MkLogMessageTimeRenderer { renderLogMessageTime :: UTCTime -> T.Text }@@ -76,14 +83,14 @@ mkLogMessageTimeRenderer (iso8601DateFormat (Just "%H:%M:%S%6Q")) -- | Print the thread id, the message and the source file location, seperated by simple white space.-renderLogMessageBody :: LogMessageRenderer T.Text+renderLogMessageBody :: LogMessageTextRenderer renderLogMessageBody = T.unwords . filter (not . T.null) <$> sequence [ renderLogMessageBodyNoLocation , fromMaybe "" <$> renderLogMessageSrcLoc ] -- | Print the thread id, the message and the source file location, seperated by simple white space.-renderLogMessageBodyNoLocation :: LogMessageRenderer T.Text+renderLogMessageBodyNoLocation :: LogMessageTextRenderer renderLogMessageBodyNoLocation = T.unwords . filter (not . T.null) <$> sequence [ renderShowMaybeLogMessageLens "" lmThreadId , view lmMessage@@ -91,7 +98,7 @@ -- | Print the /body/ of a 'LogMessage' with fix size fields (60) for the message itself -- and 30 characters for the location-renderLogMessageBodyFixWidth :: LogMessageRenderer T.Text+renderLogMessageBodyFixWidth :: LogMessageTextRenderer renderLogMessageBodyFixWidth l@(MkLogMessage _f _s _ts _hn _an _pid _mi _sd ti _ msg) = T.unwords $ filter (not . T.null)@@ -102,7 +109,7 @@ -- | Render a field of a 'LogMessage' using the corresponsing lens. renderMaybeLogMessageLens- :: T.Text -> Getter LogMessage (Maybe T.Text) -> LogMessageRenderer T.Text+ :: T.Text -> Getter LogMessage (Maybe T.Text) -> LogMessageTextRenderer renderMaybeLogMessageLens x l = fromMaybe x . view l -- | Render a field of a 'LogMessage' using the corresponsing lens.@@ -110,7 +117,7 @@ :: Show a => T.Text -> Getter LogMessage (Maybe a)- -> LogMessageRenderer T.Text+ -> LogMessageTextRenderer renderShowMaybeLogMessageLens x l = renderMaybeLogMessageLens x (l . to (fmap (T.pack . show))) @@ -133,7 +140,7 @@ -- Render e.g. as @\<192\>@. -- -- Useful as header for syslog compatible log output.-renderSyslogSeverityAndFacility :: LogMessageRenderer T.Text+renderSyslogSeverityAndFacility :: LogMessageTextRenderer renderSyslogSeverityAndFacility (MkLogMessage !f !s _ _ _ _ _ _ _ _ _) = "<" <> T.pack (show (fromSeverity s + fromFacility f * 8)) <> ">" @@ -144,7 +151,7 @@ -- Render the header using 'renderSyslogSeverity' -- -- Useful for logging to @/dev/log@-renderLogMessageSyslog :: LogMessageRenderer T.Text+renderLogMessageSyslog :: LogMessageTextRenderer renderLogMessageSyslog l@(MkLogMessage _ _ _ _ an _ mi _ _ _ _) = renderSyslogSeverityAndFacility l <> (T.unwords . filter (not . T.null)@@ -154,30 +161,47 @@ ]) -- | Render a 'LogMessage' human readable, for console logging-renderLogMessageConsoleLog :: LogMessageRenderer T.Text-renderLogMessageConsoleLog l@(MkLogMessage _ _ ts _ _ pd _ sd _ _ _) =+renderLogMessageConsoleLog :: LogMessageTextRenderer+renderLogMessageConsoleLog l@(MkLogMessage _ _ ts _ _ _ _ sd _ _ _) = T.unwords $ filter (not . T.null)- [ view (lmSeverity . to (T.pack . show)) l- , fromMaybe " no proc " pd+ [ T.pack (show (view lmSeverity l))+ , let p = fromMaybe "no process" (l ^. lmProcessId)+ in p <> T.replicate (max 0 (55 - T.length p)) " " , maybe "" (renderLogMessageTime rfc5424Timestamp) ts , renderLogMessageBodyFixWidth l , if null sd then "" else T.concat (renderSdElement <$> sd) ] +-- | Render a 'LogMessage' human readable, for console logging+--+-- @since 0.31.0+renderConsoleMinimalisticWide :: LogMessageRenderer T.Text+renderConsoleMinimalisticWide l =+ T.unwords $ filter+ (not . T.null)+ [ let s = T.pack (show (view lmSeverity l))+ in s <> T.replicate (max 0 (15 - T.length s)) " "+ , let p = fromMaybe "no process" (l ^. lmProcessId)+ in p <> T.replicate (max 0 (55 - T.length p)) " "+ , let msg = l^.lmMessage+ in msg <> T.replicate (max 0 (100 - T.length msg)) " "+ -- , fromMaybe "" (renderLogMessageSrcLoc l)+ ]+ -- | Render a 'LogMessage' according to the rules in the RFC-3164.-renderRFC3164 :: LogMessageRenderer T.Text+renderRFC3164 :: LogMessageTextRenderer renderRFC3164 = renderRFC3164WithTimestamp rfc3164Timestamp -- | Render a 'LogMessage' according to the rules in the RFC-3164 but use -- RFC5424 time stamps.-renderRFC3164WithRFC5424Timestamps :: LogMessageRenderer T.Text+renderRFC3164WithRFC5424Timestamps :: LogMessageTextRenderer renderRFC3164WithRFC5424Timestamps = renderRFC3164WithTimestamp rfc5424Timestamp -- | Render a 'LogMessage' according to the rules in the RFC-3164 but use the custom -- 'LogMessageTimeRenderer'.-renderRFC3164WithTimestamp :: LogMessageTimeRenderer -> LogMessageRenderer T.Text+renderRFC3164WithTimestamp :: LogMessageTimeRenderer -> LogMessageTextRenderer renderRFC3164WithTimestamp renderTime l@(MkLogMessage _ _ ts hn an pid mi _ _ _ _) = T.unwords . filter (not . T.null)@@ -196,7 +220,7 @@ -- Equivalent to @'renderRFC5424Header' <> const " " <> 'renderLogMessageBody'@. -- -- @since 0.21.0-renderRFC5424 :: LogMessageRenderer T.Text+renderRFC5424 :: LogMessageTextRenderer renderRFC5424 = renderRFC5424Header <> const " " <> renderLogMessageBody -- | Render a 'LogMessage' according to the rules in the RFC-5424, like 'renderRFC5424' but@@ -205,14 +229,14 @@ -- Equivalent to @'renderRFC5424Header' <> const " " <> 'renderLogMessageBodyNoLocation'@. -- -- @since 0.21.0-renderRFC5424NoLocation :: LogMessageRenderer T.Text+renderRFC5424NoLocation :: LogMessageTextRenderer renderRFC5424NoLocation = renderRFC5424Header <> const " " <> renderLogMessageBodyNoLocation -- | Render the header and strucuted data of a 'LogMessage' according to the rules in the RFC-5424, but do not -- render the 'lmMessage'. -- -- @since 0.22.0-renderRFC5424Header :: LogMessageRenderer T.Text+renderRFC5424Header :: LogMessageTextRenderer renderRFC5424Header l@(MkLogMessage _ _ ts hn an pid mi sd _ _ _) = T.unwords . filter (not . T.null)
src/Control/Eff/Log/Writer.hs view
@@ -1,9 +1,5 @@ {-# LANGUAGE UndecidableInstances #-}--- | The 'LogWriter' type encapsulates an effectful function to write 'LogMessage's.------ Used in conjunction with the 'HandleLogWriter' class, it--- can be used to write messages from within an effectful--- computation.+-- | The 'LogWriter' type encapsulates an 'IO' action to write 'LogMessage's. module Control.Eff.Log.Writer ( -- * 'LogWriter' Definition@@ -13,192 +9,109 @@ , localLogWriterReader , askLogWriter , runLogWriterReader- -- * LogWriter Handler Class- , HandleLogWriter(..)- , LogWriterM(..)+ -- * LogWriter utilities+ , liftWriteLogMessage , noOpLogWriter- -- ** Writer Combinator- -- *** Pure Writer Combinator , filteringLogWriter , mappingLogWriter- -- *** Impure Writer Combinator- , mappingLogWriterM+ , mappingLogWriterIO+ , ioHandleLogWriter+ , stdoutLogWriter ) where import Control.Eff-import Control.Eff.Extend+import Control.Eff.Reader.Strict import Control.Eff.Log.Message-import Data.Default-import Data.Function ( fix )+import Control.Eff.Log.MessageRenderer import Control.Monad ( (>=>) , when )-import Control.Monad.Base ( MonadBase() )-import qualified Control.Monad.Catch as Catch-import Control.Monad.Trans.Control ( MonadBaseControl- ( restoreM- , liftBaseWith- , StM- )- )-import Control.Eff.Writer.Strict ( Writer, tell, runListWriter )-import Data.Kind-import Data.Foldable (traverse_)+import qualified Data.Text.IO as Text+import Data.Text (Text)+import qualified System.IO as IO -- | A function that takes a log message and returns an effect that -- /logs/ the message.-newtype LogWriter writerM = MkLogWriter- { runLogWriter :: LogMessage -> LogWriterM writerM ()+newtype LogWriter = MkLogWriter+ { runLogWriter :: LogMessage -> IO () } -instance Applicative (LogWriterM w) => Default (LogWriter w) where- def = MkLogWriter (const (pure ()))+instance Semigroup LogWriter where+ (MkLogWriter l) <> (MkLogWriter r) = MkLogWriter (l >> r) +instance Monoid LogWriter where+ mempty = MkLogWriter (const (pure ()))++-- | A 'Reader' effect for 'LogWriter's.+--+-- @since 0.31.0+type LogWriterReader = Reader LogWriter+ -- | Provide the 'LogWriter' -- -- Exposed for custom extensions, if in doubt use 'withLogging'.-runLogWriterReader :: LogWriter h -> Eff (LogWriterReader h ': e) a -> Eff e a-runLogWriterReader e m = fix (handle_relay (\x _ -> return x)) m e+runLogWriterReader :: LogWriter -> Eff (Reader LogWriter ': e) a -> Eff e a+runLogWriterReader = runReader -- | Get the current 'LogWriter'.-askLogWriter- :: SetMember LogWriterReader (LogWriterReader h) e => Eff e (LogWriter h)-askLogWriter = send AskLogWriter+askLogWriter :: Member LogWriterReader e => Eff e LogWriter+askLogWriter = ask -- | Modify the current 'LogWriter'. localLogWriterReader- :: forall h e a- . SetMember LogWriterReader (LogWriterReader h) e- => (LogWriter h -> LogWriter h)+ :: forall e a+ . Member LogWriterReader e+ => (LogWriter -> LogWriter) -> Eff e a -> Eff e a-localLogWriterReader f m =- f- <$> askLogWriter- >>= fix (respond_relay @(LogWriterReader h) (\x _ -> return x)) m---- | A Reader specialized for 'LogWriter's------ The existing @Reader@ couldn't be used together with 'SetMember', so this--- lazy reader was written, specialized to reading 'LogWriter'.-data LogWriterReader h v where- AskLogWriter :: LogWriterReader h (LogWriter h)--instance Handle (LogWriterReader h) e a (LogWriter h -> k) where- handle k q AskLogWriter lw = k (q ^$ lw) lw--instance forall h m r. (MonadBase m m, LiftedBase m r)- => MonadBaseControl m (Eff (LogWriterReader h ': r)) where- type StM (Eff (LogWriterReader h ': r)) a = StM (Eff r) a- liftBaseWith f = do- lf <- askLogWriter- raise (liftBaseWith (\runInBase -> f (runInBase . runLogWriterReader lf)))- restoreM = raise . restoreM--instance (LiftedBase m e, Catch.MonadThrow (Eff e))- => Catch.MonadThrow (Eff (LogWriterReader h ': e)) where- throwM exception = raise (Catch.throwM exception)--instance (Applicative m, LiftedBase m e, Catch.MonadCatch (Eff e))- => Catch.MonadCatch (Eff (LogWriterReader h ': e)) where- catch effect handler = do- lf <- askLogWriter- let lower = runLogWriterReader lf- nestedEffects = lower effect- nestedHandler exception = lower (handler exception)- raise (Catch.catch nestedEffects nestedHandler)--instance (Applicative m, LiftedBase m e, Catch.MonadMask (Eff e))- => Catch.MonadMask (Eff (LogWriterReader h ': e)) where- mask maskedEffect = do- lf <- askLogWriter- let lower :: Eff (LogWriterReader h ': e) a -> Eff e a- lower = runLogWriterReader lf- raise- (Catch.mask- (\nestedUnmask -> lower (maskedEffect (raise . nestedUnmask . lower)))- )- uninterruptibleMask maskedEffect = do- lf <- askLogWriter- let lower :: Eff (LogWriterReader h ': e) a -> Eff e a- lower = runLogWriterReader lf- raise- (Catch.uninterruptibleMask- (\nestedUnmask -> lower (maskedEffect (raise . nestedUnmask . lower)))- )- generalBracket acquire release useIt = do- lf <- askLogWriter- let lower :: Eff (LogWriterReader h ': e) a -> Eff e a- lower = runLogWriterReader lf- raise- (Catch.generalBracket (lower acquire)- (((.) . (.)) lower release)- (lower . useIt)- )---- * 'LogWriter' Zoo---- | The instances of this class are the monads that define (side-) effect(s) of writting logs.-class HandleLogWriter (writer :: Type -> Type) where- -- | The 'Eff'ects required by the 'handleLogWriterEffect' method.- --- -- @since 0.29.1- data family LogWriterM writer a-- -- | Run the side effect of a 'LogWriter' in a compatible 'Eff'.- handleLogWriterEffect :: (Member writer e) => LogWriterM writer () -> Eff e ()-- -- | Write a message using the 'LogWriter' found in the environment.- --- -- The semantics of this function are a combination of 'runLogWriter' and 'handleLogWriterEffect',- -- with the 'LogWriter' read from a 'LogWriterReader'.- liftWriteLogMessage :: ( SetMember LogWriterReader (LogWriterReader writer) e- , Member writer e- )- => LogMessage- -> Eff e ()- liftWriteLogMessage m = do- w <- askLogWriter- handleLogWriterEffect (runLogWriter w m)---- | Embed 'IO' actions consuming all 'LogMessage's------ @since 0.29.1-instance HandleLogWriter (Lift IO) where- newtype instance LogWriterM (Lift IO) a = IOLogWriter { runIOLogWriter :: IO a }- deriving (Applicative, Functor, Monad)- handleLogWriterEffect = send . Lift . runIOLogWriter-+localLogWriterReader = local --- | A 'LogWriter' monad for capturing messages using a 'Writer'.------ The 'HandleLogWriter' instance for this type assumes a 'Writer' effect.-instance HandleLogWriter (Writer LogMessage) where- -- | A 'LogWriter' monad that provides pure logging by capturing via the 'Writer' effect.- newtype LogWriterM (Writer LogMessage) a = MkCaptureLogs { unCaptureLogs :: Eff '[Writer LogMessage] a }- deriving (Functor, Applicative, Monad)- handleLogWriterEffect =- traverse_ (tell @LogMessage) . snd . run . runListWriter . unCaptureLogs+-- | Write a message using the 'LogWriter' found in the environment.+liftWriteLogMessage+ :: ( Member LogWriterReader e, Lifted IO e)+ => LogMessage+ -> Eff e ()+liftWriteLogMessage m = do+ w <- askLogWriter+ lift (runLogWriter w m) -- | This 'LogWriter' will discard all messages. ----- NOTE: This is just an alias for 'def'-noOpLogWriter :: Applicative (LogWriterM m) => LogWriter m-noOpLogWriter = def+-- NOTE: This is just an alias for 'mempty'+noOpLogWriter :: LogWriter+noOpLogWriter = mempty -- | A 'LogWriter' that applies a predicate to the 'LogMessage' and delegates to -- to the given writer of the predicate is satisfied.-filteringLogWriter :: Monad (LogWriterM e) => LogPredicate -> LogWriter e -> LogWriter e+filteringLogWriter :: LogPredicate -> LogWriter -> LogWriter filteringLogWriter p lw = MkLogWriter (\msg -> when (p msg) (runLogWriter lw msg)) -- | A 'LogWriter' that applies a function to the 'LogMessage' and delegates the result to -- to the given writer.-mappingLogWriter :: (LogMessage -> LogMessage) -> LogWriter e -> LogWriter e+mappingLogWriter :: (LogMessage -> LogMessage) -> LogWriter -> LogWriter mappingLogWriter f lw = MkLogWriter (runLogWriter lw . f) -- | Like 'mappingLogWriter' allow the function that changes the 'LogMessage' to have effects.-mappingLogWriterM- :: Monad (LogWriterM e) => (LogMessage -> LogWriterM e LogMessage) -> LogWriter e -> LogWriter e-mappingLogWriterM f lw = MkLogWriter (f >=> runLogWriter lw)+mappingLogWriterIO+ :: (LogMessage -> IO LogMessage) -> LogWriter -> LogWriter+mappingLogWriterIO f lw = MkLogWriter (f >=> runLogWriter lw)++-- | Append the 'LogMessage' to an 'IO.Handle' after rendering it.+--+-- @since 0.31.0+ioHandleLogWriter :: IO.Handle -> LogMessageRenderer Text -> LogWriter+ioHandleLogWriter outH r = MkLogWriter (Text.hPutStrLn outH . r)++-- | Render a 'LogMessage' to 'IO.stdout'.+--+-- This function will also set the 'IO.BufferMode' of 'IO.stdout' to 'IO.LineBuffering'.+--+-- See 'ioHandleLogWriter'.+--+-- @since 0.31.0+stdoutLogWriter :: LogMessageRenderer Text -> IO LogWriter+stdoutLogWriter render = do+ IO.hSetBuffering IO.stdout IO.LineBuffering+ return (ioHandleLogWriter IO.stdout render)
src/Control/Eff/LogWriter/Async.hs view
@@ -10,7 +10,7 @@ import Control.DeepSeq import Control.Eff as Eff import Control.Eff.Log-import Control.Eff.LogWriter.IO+import Control.Eff.LogWriter.Rich import Control.Exception ( evaluate ) import Control.Monad ( unless ) import Control.Monad.Trans.Control ( MonadBaseControl@@ -21,7 +21,7 @@ import Data.Text as T --- | This is a wrapper around 'withAsyncLogWriter' and 'withIoLogging'.+-- | This is a wrapper around 'withAsyncLogWriter' and 'withRichLogging'. -- -- Example: --@@ -36,17 +36,17 @@ -- withAsyncLogging :: (Lifted IO e, MonadBaseControl IO (Eff e), Integral len)- => LogWriter (Lift IO)+ => LogWriter -> len -- ^ Size of the log message input queue. If the queue is full, message -- are dropped silently. -> Text -- ^ The default application name to put into the 'lmAppName' field. -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field. -> LogPredicate -- ^ The inital predicate for log messages, there are some pre-defined in "Control.Eff.Log.Message#PredefinedPredicates"- -> Eff (Logs : LogWriterReader (Lift IO) : e) a+ -> Eff (Logs : LogWriterReader : e) a -> Eff e a withAsyncLogging lw queueLength a f p e = liftBaseOp- (withAsyncLogChannel queueLength (runIOLogWriter . runLogWriter lw . force))- (\lc -> withIoLogging (makeLogChannelWriter lc) a f p e)+ (withAsyncLogChannel queueLength (runLogWriter lw . force))+ (\lc -> withRichLogging (makeLogChannelWriter lc) a f p e) -- | /Move/ the current 'LogWriter' into its own thread.@@ -72,14 +72,14 @@ -- > -- withAsyncLogWriter- :: (LogIo e, MonadBaseControl IO (Eff e), Integral len)+ :: (IoLogging e, MonadBaseControl IO (Eff e), Integral len) => len -- ^ Size of the log message input queue. If the queue is full, message -- are dropped silently. -> Eff e a -> Eff e a withAsyncLogWriter queueLength e = do lw <- askLogWriter- liftBaseOp (withAsyncLogChannel queueLength (runIOLogWriter . runLogWriter lw . force))+ liftBaseOp (withAsyncLogChannel queueLength (runLogWriter lw . force)) (\lc -> setLogWriter (makeLogChannelWriter lc) e) withAsyncLogChannel@@ -101,8 +101,8 @@ traverse_ ioWriter ms logLoop tq -makeLogChannelWriter :: LogChannel -> LogWriter (Lift IO)-makeLogChannelWriter lc = mkLogWriterIO logChannelPutIO+makeLogChannelWriter :: LogChannel -> LogWriter+makeLogChannelWriter lc = MkLogWriter logChannelPutIO where logChannelPutIO (force -> me) = do !m <- evaluate me
− src/Control/Eff/LogWriter/Capture.hs
@@ -1,37 +0,0 @@-{-# LANGUAGE UndecidableInstances #-}--- | Capture 'LogMessage's to a 'Writer'.------ See 'Control.Eff.Log.Examples.exampleLogCapture'-module Control.Eff.LogWriter.Capture- ( captureLogWriter- , CaptureLogs- , CaptureLogWriter- , runCaptureLogWriter- )-where--import Control.Eff as Eff-import Control.Eff.Log-import Control.Eff.Writer.Strict ( Writer- , tell- , runListWriter- )---- | A 'LogWriter' monad that provides pure logging by capturing via the 'Writer' effect.------ See 'Control.Eff.Log.Examples.exampleLogCapture'-captureLogWriter :: LogWriter CaptureLogWriter-captureLogWriter = MkLogWriter (MkCaptureLogs . tell)---- | A 'LogWriter' monad that provides pure logging by capturing via the 'Writer' effect.-type CaptureLogs a = LogWriterM CaptureLogWriter a---- | Run a 'Writer' for 'LogMessage's.------ Such a 'Writer' is needed to handle 'CaptureLogWriter'-runCaptureLogWriter- :: Eff (CaptureLogWriter ': e) a -> Eff e (a, [LogMessage])-runCaptureLogWriter = runListWriter---- | Alias for the 'Writer' that contains the captured 'LogMessage's from 'CaptureLogs'.-type CaptureLogWriter = Writer LogMessage
src/Control/Eff/LogWriter/Console.hs view
@@ -3,18 +3,15 @@ ( withConsoleLogWriter , withConsoleLogging , consoleLogWriter- , stdoutLogWriter ) where import Control.Eff as Eff import Control.Eff.Log-import Control.Eff.LogWriter.IO+import Control.Eff.LogWriter.Rich import Data.Text-import qualified Data.Text.IO as T-import qualified System.IO as IO -- | Enable logging to @standard output@ using the 'consoleLogWriter', with some 'LogMessage' fields preset--- as in 'withIoLogging'.+-- as in 'withRichLogging'. -- -- Log messages are rendered using 'renderLogMessageConsoleLog'. --@@ -26,17 +23,17 @@ -- > $ withConsoleLogging "my-app" local7 allLogMessages -- > $ logInfo "Oh, hi there" ----- To vary the 'LogWriter' use 'withIoLogging'.+-- To vary the 'LogWriter' use 'withRichLogging'. withConsoleLogging :: Lifted IO e => Text -- ^ The default application name to put into the 'lmAppName' field. -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field. -> LogPredicate -- ^ The inital predicate for log messages, there are some pre-defined in "Control.Eff.Log.Message#PredefinedPredicates"- -> Eff (Logs : LogWriterReader (Lift IO) : e) a+ -> Eff (Logs : LogWriterReader : e) a -> Eff e a withConsoleLogging a b c d = do- lift (IO.hSetBuffering IO.stdout IO.LineBuffering)- withIoLogging consoleLogWriter a b c d+ lw <- lift consoleLogWriter+ withRichLogging lw a b c d -- | Enable logging to @standard output@ using the 'consoleLogWriter'.@@ -48,22 +45,21 @@ -- > exampleWithConsoleLogWriter :: IO () -- > exampleWithConsoleLogWriter = -- > runLift--- > $ withSomeLogging @IO+-- > $ withoutLogging @IO -- > $ withConsoleLogWriter -- > $ logInfo "Oh, hi there" withConsoleLogWriter- :: (LogIo e)+ :: (IoLogging e) => Eff e a -> Eff e a withConsoleLogWriter e = do- lift (IO.hSetBuffering IO.stdout IO.LineBuffering)- addLogWriter consoleLogWriter e+ lw <- lift consoleLogWriter+ addLogWriter lw e --- | Write 'LogMessage's to standard output, formatted with 'printLogMessage'.------ It uses 'stdoutLogWriter' with 'renderLogMessageConsoleLog'.-consoleLogWriter :: LogWriter (Lift IO)-consoleLogWriter = mkLogWriterIO (T.putStrLn . renderLogMessageConsoleLog) --- | A 'LogWriter' that uses a 'LogMessageRenderer' to render, and 'T.putStrLn' to print it.-stdoutLogWriter :: LogMessageRenderer Text -> LogWriter (Lift IO)-stdoutLogWriter render = mkLogWriterIO (T.putStrLn . render)+-- | Render a 'LogMessage' to 'IO.stdout' using 'renderLogMessageConsoleLog'.+--+-- See 'stdoutLogWriter'.+--+-- @since 0.31.0+consoleLogWriter :: IO LogWriter+consoleLogWriter = stdoutLogWriter renderLogMessageConsoleLog
src/Control/Eff/LogWriter/DebugTrace.hs view
@@ -9,11 +9,11 @@ import Debug.Trace import Control.Eff as Eff import Control.Eff.Log-import Control.Eff.LogWriter.IO+import Control.Eff.LogWriter.Rich import Data.Text as T -- | Enable logging via 'traceM' using the 'debugTraceLogWriter', with some 'LogMessage' fields preset--- as in 'withIoLogging'.+-- as in 'withRichLogging'. -- -- Log messages are rendered using 'renderLogMessageConsoleLog'. --@@ -29,9 +29,9 @@ => Text -- ^ The default application name to put into the 'lmAppName' field. -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field. -> LogPredicate -- ^ The inital predicate for log messages, there are some pre-defined in "Control.Eff.Log.Message#PredefinedPredicates"- -> Eff (Logs : LogWriterReader (Lift IO) : e) a+ -> Eff (Logs : LogWriterReader : e) a -> Eff e a-withTraceLogging = withIoLogging (debugTraceLogWriter renderLogMessageConsoleLog)+withTraceLogging = withRichLogging (debugTraceLogWriter renderLogMessageConsoleLog) -- | Enable logging via 'traceM' using the 'debugTraceLogWriter'. The@@ -44,12 +44,12 @@ -- > exampleWithTraceLogWriter :: IO () -- > exampleWithTraceLogWriter = -- > runLift--- > $ withSomeLogging @IO+-- > $ withoutLogging @IO -- > $ withTraceLogWriter -- > $ logInfo "Oh, hi there"-withTraceLogWriter :: forall h e a . (Monad (LogWriterM h), LogsTo h e) => Eff e a -> Eff e a-withTraceLogWriter = addLogWriter @h (debugTraceLogWriter renderLogMessageConsoleLog)+withTraceLogWriter :: IoLogging e => Eff e a -> Eff e a+withTraceLogWriter = addLogWriter (debugTraceLogWriter renderLogMessageConsoleLog) -- | Write 'LogMessage's via 'traceM'.-debugTraceLogWriter :: forall h . (Monad (LogWriterM h)) => LogMessageRenderer Text -> LogWriter h+debugTraceLogWriter :: LogMessageTextRenderer -> LogWriter debugTraceLogWriter render = MkLogWriter (traceM . T.unpack . render)
src/Control/Eff/LogWriter/File.hs view
@@ -7,7 +7,7 @@ import Control.Eff as Eff import Control.Eff.Log-import Control.Eff.LogWriter.IO+import Control.Eff.LogWriter.Rich import GHC.Stack import Data.Text as T import qualified System.IO as IO@@ -22,7 +22,7 @@ ) -- | Enable logging to a file, with some 'LogMessage' fields preset--- as described in 'withIoLogging'.+-- as described in 'withRichLogging'. -- -- If the file or its directory does not exist, it will be created. --@@ -31,20 +31,21 @@ -- > exampleWithFileLogging :: IO () -- > exampleWithFileLogging = -- > runLift--- > $ withFileLogging "/var/log/my-app.log" "my-app" local7 allLogMessages+-- > $ withFileLogging "/var/log/my-app.log" "my-app" local7 allLogMessages renderLogMessageConsoleLog -- > $ logInfo "Oh, hi there" ----- To vary the 'LogWriter' use 'withIoLogging'.+-- To vary the 'LogWriter' use 'withRichLogging'. withFileLogging- :: (Lifted IO e, MonadBaseControl IO (Eff e))+ :: (Lifted IO e, MonadBaseControl IO (Eff e), HasCallStack) => FilePath -- ^ Path to the log-file. -> Text -- ^ The default application name to put into the 'lmAppName' field. -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field. -> LogPredicate -- ^ The inital predicate for log messages, there are some pre-defined in "Control.Eff.Log.Message#PredefinedPredicates"- -> Eff (Logs : LogWriterReader (Lift IO) : e) a+ -> LogMessageTextRenderer -- ^ The 'LogMessage' render function+ -> Eff (Logs : LogWriterReader : e) a -> Eff e a-withFileLogging fnIn a f p e = do- liftBaseOp (withOpenedLogFile fnIn) (\lw -> withIoLogging lw a f p e)+withFileLogging fnIn a f p render e = do+ liftBaseOp (withOpenedLogFile fnIn render) (\lw -> withRichLogging lw a f p e) -- | Enable logging to a file.@@ -55,19 +56,25 @@ -- > exampleWithFileLogWriter :: IO () -- > exampleWithFileLogWriter = -- > runLift--- > $ withSomeLogging @IO--- > $ withFileLogWriter "test.log"+-- > $ withoutLogging+-- > $ withFileLogWriter "test.log" renderLogMessageConsoleLog -- > $ logInfo "Oh, hi there" withFileLogWriter- :: (LogIo e, MonadBaseControl IO (Eff e))+ :: (IoLogging e, MonadBaseControl IO (Eff e), HasCallStack) => FilePath -- ^ Path to the log-file.+ -> LogMessageTextRenderer -> Eff e b -> Eff e b-withFileLogWriter fnIn e =- liftBaseOp (withOpenedLogFile fnIn) (`addLogWriter` e)+withFileLogWriter fnIn render e =+ liftBaseOp (withOpenedLogFile fnIn render) (`addLogWriter` e) -withOpenedLogFile :: HasCallStack => FilePath -> (LogWriter (Lift IO) -> IO a) -> IO a-withOpenedLogFile fnIn ioE = Safe.bracket+withOpenedLogFile+ :: HasCallStack+ => FilePath+ -> LogMessageTextRenderer+ -> (LogWriter -> IO a)+ -> IO a+withOpenedLogFile fnIn render ioE = Safe.bracket (do fnCanon <- canonicalizePath fnIn createDirectoryIfMissing True (takeDirectory fnCanon)@@ -76,4 +83,4 @@ return h ) (\h -> Safe.try @IO @Catch.SomeException (IO.hFlush h) >> IO.hClose h)- (\h -> ioE (ioHandleLogWriter h))+ (\h -> ioE (ioHandleLogWriter h render))
− src/Control/Eff/LogWriter/IO.hs
@@ -1,89 +0,0 @@--- | Functions for generic, IO-based 'LogWriter's.------ This module is more low-level than the others in this directory.-module Control.Eff.LogWriter.IO- ( mkLogWriterIO- , ioHandleLogWriter- , defaultIoLogWriter- , withIoLogging- , LoggingAndIo- , printLogMessage- )-where--import Control.Eff as Eff-import Control.Eff.Log-import Control.Monad ( (>=>) )-import Control.Lens (set)-import Data.Text-import qualified System.IO as IO-import GHC.Stack-import qualified Data.Text.IO as T---- | A 'LogWriter' that uses an 'IO' action to write the message.------ This is just an alias for 'MkLogWriter' but with @IO@ as parameter. This reduces the need to--- apply something to the extra type argument @\@IO@.------ Example use cases for this function are the 'consoleLogWriter' and the 'ioHandleLogWriter'.-mkLogWriterIO :: HasCallStack => (LogMessage -> IO ()) -> LogWriter (Lift IO)-mkLogWriterIO f = MkLogWriter (IOLogWriter . f)---- | A 'LogWriter' that renders 'LogMessage's to strings via 'renderLogMessageConsoleLog'--- and prints them to an 'IO.Handle' using 'hPutStrLn'.-ioHandleLogWriter :: HasCallStack => IO.Handle -> LogWriter (Lift IO)-ioHandleLogWriter h =- mkLogWriterIO (T.hPutStrLn h . renderLogMessageConsoleLog)---- | Enable logging to IO using the 'defaultIoLogWriter'.------ Example:------ > exampleWithIoLogging :: IO ()--- > exampleWithIoLogging =--- > runLift--- > $ withIoLogging debugTraceLogWriter--- > "my-app"--- > local7--- > (lmSeverityIsAtLeast informationalSeverity)--- > $ logInfo "Oh, hi there"----withIoLogging- :: Lifted IO e- => LogWriter (Lift IO) -- ^ The 'LogWriter' that will be used to write log messages.- -> Text -- ^ The default application name to put into the 'lmAppName' field.- -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field.- -> LogPredicate -- ^ The inital predicate for log messages, there are some pre-defined in "Control.Eff.Log.Message#PredefinedPredicates"- -> Eff (Logs : LogWriterReader (Lift IO) : e) a- -> Eff e a-withIoLogging lw appName facility defaultPredicate =- withLogging (defaultIoLogWriter appName facility lw)- . setLogPredicate defaultPredicate---- | Decorate an IO based 'LogWriter' to fill out these fields in 'LogMessage's:------ * The messages will carry the given application name in the 'lmAppName' field.--- * The 'lmTimestamp' field contains the UTC time of the log event--- * The 'lmHostname' field contains the FQDN of the current host--- * The 'lmFacility' field contains the given 'Facility'------ It works by using 'mappingLogWriterM'.-defaultIoLogWriter- :: Text -- ^ The default application name to put into the 'lmAppName' field.- -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field.- -> LogWriter (Lift IO )-- ^ The IO based writer to decorate- -> LogWriter (Lift IO)-defaultIoLogWriter appName facility = mappingLogWriterM- ( (IOLogWriter . setLogMessageTimestamp)- >=> (IOLogWriter . setLogMessageHostname)- >=> pure- . set lmFacility facility- . set lmAppName (Just appName)- )---- | The concrete list of 'Eff'ects for logging with an IO based 'LogWriter', and a 'LogWriterReader'.-type LoggingAndIo = '[Logs, LogWriterReader (Lift IO), Lift IO]---- | Render a 'LogMessage' but set the timestamp and thread id fields.-printLogMessage :: LogMessage -> IO ()-printLogMessage = T.putStrLn . renderLogMessageConsoleLog
+ src/Control/Eff/LogWriter/Rich.hs view
@@ -0,0 +1,59 @@+-- | Enrich 'LogMessage's with timestamps and OS dependent information.+module Control.Eff.LogWriter.Rich+ ( richLogWriter+ , withRichLogging+ , stdoutLogWriter+ )+where++import Control.Eff as Eff+import Control.Eff.Log+import Control.Monad ( (>=>) )+import Control.Lens (set)+import Data.Text++-- | Enable logging to IO using the 'richLogWriter'.+--+-- Example:+--+-- > exampleWithIoLogging :: IO ()+-- > exampleWithIoLogging =+-- > runLift+-- > $ withRichLogging debugTraceLogWriter+-- > "my-app"+-- > local7+-- > (lmSeverityIsAtLeast informationalSeverity)+-- > $ logInfo "Oh, hi there"+--+withRichLogging+ :: Lifted IO e+ => LogWriter -- ^ The 'LogWriter' that will be used to write log messages.+ -> Text -- ^ The default application name to put into the 'lmAppName' field.+ -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field.+ -> LogPredicate -- ^ The inital predicate for log messages, there are some pre-defined in "Control.Eff.Log.Message#PredefinedPredicates"+ -> Eff (Logs : LogWriterReader : e) a+ -> Eff e a+withRichLogging lw appName facility defaultPredicate =+ withLogging (richLogWriter appName facility lw)+ . setLogPredicate defaultPredicate++-- | Decorate an IO based 'LogWriter' to fill out these fields in 'LogMessage's:+--+-- * The messages will carry the given application name in the 'lmAppName' field.+-- * The 'lmTimestamp' field contains the UTC time of the log event+-- * The 'lmHostname' field contains the FQDN of the current host+-- * The 'lmFacility' field contains the given 'Facility'+--+-- It works by using 'mappingLogWriterIO'.+richLogWriter+ :: Text -- ^ The default application name to put into the 'lmAppName' field.+ -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field.+ -> LogWriter -- ^ The IO based writer to decorate+ -> LogWriter+richLogWriter appName facility = mappingLogWriterIO+ ( setLogMessageTimestamp+ >=> setLogMessageHostname+ >=> pure+ . set lmFacility facility+ . set lmAppName (Just appName)+ )
src/Control/Eff/LogWriter/UDP.hs view
@@ -7,7 +7,7 @@ import Control.Eff as Eff import Control.Eff.Log-import Control.Eff.LogWriter.IO+import Control.Eff.LogWriter.Rich import Data.Text as T import Data.Text.Encoding as T import qualified Control.Exception.Safe as Safe@@ -21,7 +21,7 @@ import Network.Socket.ByteString -- | Enable logging to a remote host via __UDP__, with some 'LogMessage' fields preset--- as in 'withIoLogging'.+-- as in 'withRichLogging'. -- -- See 'Control.Eff.Log.Examples.exampleUdpRFC3164Logging' withUDPLogging@@ -32,18 +32,18 @@ -> Text -- ^ The default application name to put into the 'lmAppName' field. -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field. -> LogPredicate -- ^ The inital predicate for log messages, there are some pre-defined in "Control.Eff.Log.Message#PredefinedPredicates"- -> Eff (Logs : LogWriterReader (Lift IO) : e) a+ -> Eff (Logs : LogWriterReader : e) a -> Eff e a withUDPLogging render hostname port a f p e = liftBaseOp (withUDPSocket render hostname port)- (\lw -> withIoLogging lw a f p e)+ (\lw -> withRichLogging lw a f p e) -- | Enable logging to a (remote-) host via UDP. -- -- See 'Control.Eff.Log.Examples.exampleUdpRFC3164Logging' withUDPLogWriter- :: (LogIo e, MonadBaseControl IO (Eff e), HasCallStack)+ :: (IoLogging e, MonadBaseControl IO (Eff e), HasCallStack) => (LogMessage -> Text) -- ^ 'LogMessage' rendering function -> String -- ^ Hostname or IP -> String -- ^ Port e.g. @"514"@@@ -58,7 +58,7 @@ => (LogMessage -> Text) -- ^ 'LogMessage' rendering function -> String -- ^ Hostname or IP -> String -- ^ Port e.g. @"514"@- -> (LogWriter (Lift IO) -> IO a)+ -> (LogWriter -> IO a) -> IO a withUDPSocket render hostname port ioE = Safe.bracket (do@@ -72,7 +72,7 @@ let addr = addrAddress a in ioE- (mkLogWriterIO+ (MkLogWriter (\lmStr -> void $ sendTo s (T.encodeUtf8 (render lmStr)) addr )
src/Control/Eff/LogWriter/UnixSocket.hs view
@@ -7,7 +7,7 @@ import Control.Eff as Eff import Control.Eff.Log-import Control.Eff.LogWriter.IO+import Control.Eff.LogWriter.Rich import Data.Text as T import Data.Text.Encoding as T import qualified Control.Exception.Safe as Safe@@ -21,7 +21,7 @@ import Network.Socket.ByteString -- | Enable logging to a /unix domain socket/, with some 'LogMessage' fields preset--- as in 'withIoLogging'.+-- as in 'withRichLogging'. -- -- See 'Control.Eff.Log.Examples.exampleDevLogSyslogLogging' withUnixSocketLogging@@ -31,17 +31,17 @@ -> Text -- ^ The default application name to put into the 'lmAppName' field. -> Facility -- ^ The default RFC-5424 facility to put into the 'lmFacility' field. -> LogPredicate -- ^ The inital predicate for log messages, there are some pre-defined in "Control.Eff.Log.Message#PredefinedPredicates"- -> Eff (Logs : LogWriterReader (Lift IO) : e) a+ -> Eff (Logs : LogWriterReader : e) a -> Eff e a withUnixSocketLogging render socketPath a f p e = liftBaseOp (withUnixSocketSocket render socketPath)- (\lw -> withIoLogging lw a f p e)+ (\lw -> withRichLogging lw a f p e) -- | Enable logging to a (remote-) host via UnixSocket. -- -- See 'Control.Eff.Log.Examples.exampleDevLogSyslogLogging' withUnixSocketLogWriter- :: (LogIo e, MonadBaseControl IO (Eff e), HasCallStack)+ :: (IoLogging e, MonadBaseControl IO (Eff e), HasCallStack) => LogMessageRenderer Text -- ^ 'LogMessage' rendering function -> FilePath -- ^ Path to the socket file -> Eff e b@@ -53,7 +53,7 @@ :: HasCallStack => LogMessageRenderer Text -- ^ 'LogMessage' rendering function -> FilePath -- ^ Path to the socket file- -> (LogWriter (Lift IO) -> IO a)+ -> (LogWriter -> IO a) -> IO a withUnixSocketSocket render socketPath ioE = Safe.bracket (socket AF_UNIX Datagram defaultProtocol)@@ -62,7 +62,7 @@ let addr = SockAddrUnix socketPath in ioE- (mkLogWriterIO+ (MkLogWriter (\lmStr -> void $ sendTo s (T.encodeUtf8 (render lmStr)) addr )
test/Common.hs view
@@ -33,13 +33,11 @@ as Scheduler import Control.Eff.Extend import Control.Monad-import Control.Lens import Data.Default import Data.Foldable import Data.Text ( Text , pack )-import qualified Data.Text as T import Data.Typeable hiding ( cast ) import GHC.Stack import Test.Tasty hiding ( Timeout@@ -67,29 +65,14 @@ runTestCase :: TestName -> Eff Effects () -> TestTree runTestCase msg et = testCase msg $ do- IO.hSetBuffering IO.stdout IO.LineBuffering+ lw <- stdoutLogWriter renderConsoleMinimalisticWide runLift- $ withIoLogging (stdoutLogWriter renderMinimalisticWide) "unit-tests" local0 allLogMessages+ $ withRichLogging lw "unit-tests" local0 allLogMessages $ Scheduler.schedule $ handleInterrupts onInt et where onInt = lift . assertFailure . show --- | Render a 'LogMessage' human readable, for console logging-renderMinimalisticWide :: LogMessageRenderer T.Text-renderMinimalisticWide l =- T.unwords $ filter- (not . T.null)- [ let s = l ^. lmSeverity . to (T.pack . show)- in s <> T.replicate (max 0 (15 - T.length s)) " "- , let p = fromMaybe " no proc " (l ^. lmProcessId)- in p <> T.replicate (max 0 (55 - T.length p)) " "- , let msg = l^.lmMessage- in msg <> T.replicate (max 0 (100 - T.length msg)) " "- -- , fromMaybe "" (renderLogMessageSrcLoc l)- ]-- withTestLogC :: (e -> IO ()) -> (IO (e -> IO ()) -> TestTree) -> TestTree withTestLogC doSchedule k = k (return doSchedule) @@ -102,7 +85,7 @@ scheduleAndAssert :: forall r- . (LogIo r)+ . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> ((String -> Bool -> Eff (Processes r) ()) -> Eff (Processes r) ()) -> IO ()@@ -121,7 +104,7 @@ applySchedulerFactory :: forall r- . (LogIo r)+ . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> Eff (Processes r) () -> IO ()
test/GenServerTests.hs view
@@ -32,7 +32,7 @@ -- ---------------------------------------------------------------------------- -instance LogIo e => S.Server Small (Processes e) where+instance IoLogging e => S.Server Small (Processes e) where data StartArgument Small (Processes e) = MkSmall newtype instance Model Small = SmallModel String deriving Default update _me MkSmall x =@@ -76,7 +76,7 @@ -- ---------------------------------------------------------------------------- -instance LogIo e => S.Server Big (Processes e) where+instance IoLogging e => S.Server Big (Processes e) where data instance StartArgument Big (Processes e) = MkBig newtype Model Big = BigModel String deriving Default update me MkBig = \case
test/LoggingTests.hs view
@@ -1,44 +1,130 @@ module LoggingTests where import Control.Eff+import qualified Control.Eff.LogWriter.UDP as UDP+import qualified Control.Eff.LogWriter.Async as Async import Control.Eff.Concurrent import Test.Tasty import Test.Tasty.HUnit import Common-import Control.Lens ((.~))+import Control.Lens+import Control.Monad.Trans.Control (liftBaseOp) test_Logging :: TestTree-test_Logging = setTravisTestOptions $ testGroup "Logging"- [ basics+test_Logging = setTravisTestOptions $ testGroup "logging"+ [ cencoredLogging , strictness+ , testGroup "IO"+ [ liftedIoLogging+ , udpLogging+ , udpNestedLogging+ , asyncLogging+ , asyncNestedLogging+ ] ] --basics :: HasCallStack => TestTree-basics =- testCase "basic logging works" $- pureLogs demo @?= (lmSrcLoc .~ Nothing) <$> [infoMessage "jo", debugMessage "oh"]+cencoredLogging :: HasCallStack => TestTree+cencoredLogging =+ testCase "log cencorship works" $ do+ res <- fmap (view lmMessage) <$> censoredLoggingTestImpl demo+ res @?=+ view lmMessage <$>+ [ infoMessage "1"+ , debugMessage "2"+ , infoMessage "x 1"+ , debugMessage "x 2"+ , infoMessage "x y 1"+ , debugMessage "x y 2"+ , infoMessage "x 1"+ , debugMessage "x 2"+ , infoMessage "1"+ , debugMessage "2"+ ] where demo :: ('[Logs] <:: e) => Eff e () demo = do- logInfo "jo"- logDebug "oh"+ logDebug "2"+ logInfo "1" - pureLogs :: Eff '[Logs, LogWriterReader CaptureLogWriter, CaptureLogWriter] a -> [LogMessage]- pureLogs =- snd- . run- . runCaptureLogWriter- . withLogging captureLogWriter- . censorLogs @CaptureLogWriter (lmSrcLoc .~ Nothing)+ censoredLoggingTestImpl :: Eff '[Logs, LogWriterReader, Lift IO] () -> IO [LogMessage]+ censoredLoggingTestImpl e = do+ logs <- newMVar []+ runLift+ $ withLogging (MkLogWriter (\lm -> modifyMVar_ logs (\lms -> return (lm : lms))))+ $ do+ e+ censorLogs (lmMessage %~ ("x " <>)) $ do+ e+ censorLogs (lmMessage %~ ("y " <>)) e+ e+ e+ takeMVar logs strictness :: HasCallStack => TestTree strictness = testCase "messages failing the predicate are not deeply evaluated" $ runLift- $ withLogging consoleLogWriter+ $ withConsoleLogging "test-app" local0 allLogMessages $ excludeLogMessages (lmSeverityIs errorSeverity) $ do logDebug "test" logError' ("test" <> error "TEST FAILED: this log statement should not have been evaluated deeply")+++liftedIoLogging :: HasCallStack => TestTree+liftedIoLogging =+ testCase "logging vs. MonadBaseControl"+ $ do outVar <- newEmptyMVar+ runLift+ $ withConsoleLogging "test-app" local0 allLogMessages+ $ (\ e -> liftBaseOp+ (testWriter outVar)+ (\doWrite ->+ addLogWriter (MkLogWriter doWrite) e))+ $ logDebug "test"+ actual <- takeMVar outVar+ assertEqual "wrong log message" "test" actual+ where+ testWriter :: MVar String -> ((LogMessage -> IO ()) -> IO ()) -> IO ()+ testWriter outVar withWriter =+ withWriter (putMVar outVar . show)++test1234 :: Member Logs e => Eff e ()+test1234 = do+ logNotice "~~~~~~~~~~~~~~~~~~~~~~~~~~test 1~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"+ logNotice "~~~~~~~~~~~~~~~~~~~~~~~~~~test 2~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"+ logNotice "~~~~~~~~~~~~~~~~~~~~~~~~~~test 3~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"+ logNotice "~~~~~~~~~~~~~~~~~~~~~~~~~~test 4~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"++udpLogging :: HasCallStack => TestTree+udpLogging =+ testCase "udp logging"+ $ runLift+ $ UDP.withUDPLogging renderRFC5424NoLocation "localhost" "9999" "test-app" local0 allLogMessages+ test1234++udpNestedLogging :: HasCallStack => TestTree+udpNestedLogging =+ testCase "udp nested filteredlogging"+ $ runLift+ $ withConsoleLogging "test-app" local0 allLogMessages+ $ UDP.withUDPLogWriter renderRFC5424 "localhost" "9999"+ test1234++asyncLogging :: HasCallStack => TestTree+asyncLogging =+ testCase "async filteredlogging"+ $ do lw <- consoleLogWriter+ runLift+ $ Async.withAsyncLogging lw (1000::Int) "app-name" local0 allLogMessages+ test1234++asyncNestedLogging :: HasCallStack => TestTree+asyncNestedLogging =+ testCase "async nested filteredlogging"+ $ do lw <- consoleLogWriter+ runLift+ $ withLogging lw+ $ Async.withAsyncLogWriter (1000::Int)+ test1234
test/LoopTests.hs view
@@ -18,9 +18,9 @@ "Loops without space leaks" [ testCase "scheduleMonadIOEff with many yields from replicateCheapM_"- $ do+ $ do lw <- consoleLogWriter res <-- Scheduler.scheduleIOWithLogging consoleLogWriter+ Scheduler.scheduleIOWithLogging lw $ replicateCheapM_ soMany yieldProcess res @=? Right () , testCase@@ -38,7 +38,7 @@ , testCase "'foreverCheap' inside a child process and 'replicateCheapM_' in the main process" $ do- res <- Scheduler.scheduleIOWithLogging (mkLogWriterIO (T.putStrLn . (">>> " <>) . renderLogMessageConsoleLog))+ res <- Scheduler.scheduleIOWithLogging (MkLogWriter (T.putStrLn . (">>> " <>) . renderLogMessageConsoleLog)) $ do me <- self spawn_ "test" (foreverCheap $ sendMessage me ())@@ -59,7 +59,7 @@ [ testCase "scheduleMonadIOEff with many yields from replicateM_" $ do res <-- Scheduler.scheduleIOWithLogging (mkLogWriterIO (T.putStrLn . (">>> " <>) . renderLogMessageConsoleLog))+ Scheduler.scheduleIOWithLogging (MkLogWriter (T.putStrLn . (">>> " <>) . renderLogMessageConsoleLog)) $ replicateM_ soMany yieldProcess res @=? Right () , testCase@@ -79,7 +79,7 @@ "'forever' inside a child process and 'replicateM_' in the main process" $ do res <-- Scheduler.scheduleIOWithLogging (mkLogWriterIO (T.putStrLn . (">>> " <>) . renderLogMessageConsoleLog))+ Scheduler.scheduleIOWithLogging (MkLogWriter (T.putStrLn . (">>> " <>) . renderLogMessageConsoleLog)) $ do me <- self spawn_ "test" (forever $ sendMessage me ())
test/ObserverTests.hs view
@@ -297,7 +297,7 @@ show StopTestObservable = "StopTestObservable" show (TestObsReg x) = "TestObsReg " ++ show x -instance (LogIo r, HasProcesses r q) => S.Server TestObservable r where+instance (IoLogging r, HasProcesses r q) => S.Server TestObservable r where data Init TestObservable r = TestObservableServerInit type ServerEffects TestObservable r = ObserverRegistryState String ': r runEffects _ _ = evalObserverRegistryState@@ -341,7 +341,7 @@ fromPdu _ = Nothing -instance (LogIo r, HasProcesses r q) => M.Server TestObserver r where+instance (IoLogging r, HasProcesses r q) => M.Server TestObserver r where data StartArgument TestObserver r = MkTestObserver newtype instance Model TestObserver = TestObserverModel {fromTestObserverModel :: [String]} deriving Default update _ MkTestObserver e =
test/ProcessBehaviourTestCases.hs view
@@ -10,7 +10,6 @@ import qualified Control.Eff.Concurrent.Process.SingleThreadedScheduler as SingleThreaded import Control.Applicative-import Control.Lens ( view ) import Data.List ( sort ) import Data.Foldable ( traverse_ ) import Data.Maybe@@ -24,14 +23,15 @@ test_forkIo :: TestTree test_forkIo = setTravisTestOptions $ withTestLogC- (\c ->- runLift- $ withLogging- (filteringLogWriter (lmSeverityIsAtLeast errorSeverity)- consoleLogWriter- )- $ withAsyncLogWriter (100 :: Int)- $ ForkIO.schedule c+ (\c -> do+ lw <- stdoutLogWriter renderConsoleMinimalisticWide+ runLift+ $ withLogging+ (filteringLogWriter (lmSeverityIsAtLeast errorSeverity)+ lw+ )+ $ withAsyncLogWriter (100 :: Int)+ $ ForkIO.schedule c ) (\factory -> testGroup "ForkIOScheduler" [allTests factory]) @@ -40,17 +40,19 @@ test_singleThreaded = setTravisTestOptions $ withTestLogC (\e -> let runEff :: Eff LoggingAndIo a -> IO a- runEff = runLift . withLogging- (mkLogWriterIO- (\m -> when (view lmSeverity m < errorSeverity) (printLogMessage m))- )+ runEff e' = do+ lw <- stdoutLogWriter renderConsoleMinimalisticWide+ runLift+ $ withLogging+ (filteringLogWriter (lmSeverityIsAtLeast errorSeverity) lw)+ e' in void $ SingleThreaded.scheduleM runEff yield e ) (\factory -> testGroup "SingleThreadedScheduler" [allTests factory]) allTests :: forall r- . (LogIo r, Typeable r)+ . (IoLogging r, Typeable r) => IO (Eff (Processes r) () -> IO ()) -> TestTree allTests schedulerFactory = localOption@@ -111,7 +113,7 @@ returnToSenderServer :: forall q- . (HasCallStack, LogIo q, Typeable q)+ . (HasCallStack, IoLogging q, Typeable q) => Eff (Processes q) (Endpoint ReturnToSender) returnToSenderServer = Callback.startLink @ReturnToSender $ Callback.onEvent (\evt -> case evt of@@ -128,7 +130,7 @@ selectiveReceiveTests :: forall r- . (LogIo r, Typeable r)+ . (IoLogging r, Typeable r) => IO (Eff (Processes r) () -> IO ()) -> TestTree selectiveReceiveTests schedulerFactory = setTravisTestOptions@@ -208,7 +210,7 @@ delayTests- :: forall r . (LogIo r) => IO (Eff (Processes r) () -> IO ()) -> TestTree+ :: forall r . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> TestTree delayTests schedulerFactory = let maxN = 100000 in setTravisTestOptions@@ -262,7 +264,7 @@ ) yieldLoopTests- :: forall r . (LogIo r) => IO (Eff (Processes r) () -> IO ()) -> TestTree+ :: forall r . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> TestTree yieldLoopTests schedulerFactory = let maxN = 100000 in setTravisTestOptions@@ -301,7 +303,7 @@ instance NFData Pong pingPongTests- :: forall r . (LogIo r) => IO (Eff (Processes r) () -> IO ()) -> TestTree+ :: forall r . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> TestTree pingPongTests schedulerFactory = testGroup "Yield Tests" [ testCase "ping pong a message between two processes, both don't yield"@@ -373,7 +375,7 @@ ] errorTests- :: forall r . (LogIo r) => IO (Eff (Processes r) () -> IO ()) -> TestTree+ :: forall r . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> TestTree errorTests schedulerFactory = testGroup "causing and handling errors" [ testGroup@@ -416,7 +418,7 @@ ] concurrencyTests- :: forall r . (LogIo r) => IO (Eff (Processes r) () -> IO ()) -> TestTree+ :: forall r . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> TestTree concurrencyTests schedulerFactory = let n = 100 in@@ -533,7 +535,7 @@ ] exitTests- :: forall r . (LogIo r) => IO (Eff (Processes r) () -> IO ()) -> TestTree+ :: forall r . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> TestTree exitTests schedulerFactory = testGroup "process exit tests" $ [ testGroup@@ -705,7 +707,7 @@ sendShutdownTests- :: forall r . (LogIo r) => IO (Eff (Processes r) () -> IO ()) -> TestTree+ :: forall r . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> TestTree sendShutdownTests schedulerFactory = testGroup "sendShutdown" [ testCase "... self" $ applySchedulerFactory schedulerFactory $ do@@ -801,7 +803,7 @@ ] linkingTests- :: forall r . (LogIo r) => IO (Eff (Processes r) () -> IO ()) -> TestTree+ :: forall r . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> TestTree linkingTests schedulerFactory = setTravisTestOptions (testGroup "process linking tests"@@ -1021,7 +1023,7 @@ ) monitoringTests- :: forall r . (LogIo r) => IO (Eff (Processes r) () -> IO ()) -> TestTree+ :: forall r . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> TestTree monitoringTests schedulerFactory = setTravisTestOptions (testGroup "process monitoring tests"@@ -1123,7 +1125,7 @@ ) timerTests- :: forall r . (LogIo r) => IO (Eff (Processes r) () -> IO ()) -> TestTree+ :: forall r . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> TestTree timerTests schedulerFactory = setTravisTestOptions (testGroup "process timer tests"@@ -1179,7 +1181,7 @@ ) processDetailsTests- :: forall r . (LogIo r) => IO (Eff (Processes r) () -> IO ()) -> TestTree+ :: forall r . (IoLogging r) => IO (Eff (Processes r) () -> IO ()) -> TestTree processDetailsTests schedulerFactory = setTravisTestOptions (testGroup "process info tests"