module Log.Internal.Logger (
Logger(..)
, execLogger
, waitForLogger
) where
import Control.Concurrent.STM
import Data.IORef
import Log.Data
data Logger = Logger {
loggerWriteMessage :: !(LogMessage -> IO ())
, loggerWaitForWrite :: !(STM ())
, loggerFinalizers :: ![IORef ()]
}
execLogger :: Logger -> LogMessage -> IO ()
execLogger Logger{..} = loggerWriteMessage
waitForLogger :: Logger -> IO ()
waitForLogger Logger{..} = atomically loggerWaitForWrite
instance Monoid Logger where
mempty = Logger (const $ return ()) (return ()) []
l1 `mappend` l2 = Logger {
loggerWriteMessage = \msg -> do
loggerWriteMessage l1 msg
loggerWriteMessage l2 msg
, loggerWaitForWrite = do
loggerWaitForWrite l1
loggerWaitForWrite l2
, loggerFinalizers = loggerFinalizers l1 ++ loggerFinalizers l2
}