-- | Utilities for logging.
module Data.MediaBus.Basics.LoggingExtra
  ( withLogMessagePrefix
  ) where

import Control.Monad.Logger


-- | Prefix every log message done from inside the given monad action with the
-- given prefix. This runs a 'LoggingT' action inside a 'MonadLoggerIO' base
-- monad with a log function that wraps around the log function returned by
-- 'askLoggerIO' and prefixes each message with the given prefix.
withLogMessagePrefix
  :: (ToLogStr prefix, MonadLoggerIO m)
  => prefix -> LoggingT m a -> m a
withLogMessagePrefix prefix ml = do
  originalLogger <- askLoggerIO
  let logger loc lvl src msg =
        originalLogger loc lvl src (prefixL `mappend` msg)
      prefixL = toLogStr prefix
  runLoggingT ml logger