module Lambdabot.Logging
    ( L.Priority(..)
    , MonadLogging(..)
    , debugM
    , infoM
    , noticeM
    , warningM
    , errorM
    , criticalM
    , alertM
    , emergencyM
    ) where

import Control.Monad
import Data.List
import qualified System.Log.Logger as L

class Monad m => MonadLogging m where
    getCurrentLogger :: m [String]
    logM :: String -> L.Priority -> String -> m ()

instance MonadLogging IO where
    getCurrentLogger :: IO [String]
getCurrentLogger = forall (m :: * -> *) a. Monad m => a -> m a
return []
    logM :: String -> Priority -> String -> IO ()
logM = String -> Priority -> String -> IO ()
L.logM

getCurrentLoggerName :: MonadLogging m => m String
getCurrentLoggerName :: forall (m :: * -> *). MonadLogging m => m String
getCurrentLoggerName = forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (forall a. [a] -> [[a]] -> [a]
intercalate String
"." forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> Bool
null)) forall (m :: * -> *). MonadLogging m => m [String]
getCurrentLogger

debugM :: MonadLogging m => String -> m ()
debugM :: forall (m :: * -> *). MonadLogging m => String -> m ()
debugM String
msg = do
    String
logger <- forall (m :: * -> *). MonadLogging m => m String
getCurrentLoggerName
    forall (m :: * -> *).
MonadLogging m =>
String -> Priority -> String -> m ()
logM String
logger Priority
L.DEBUG String
msg

infoM :: MonadLogging m => String -> m ()
infoM :: forall (m :: * -> *). MonadLogging m => String -> m ()
infoM String
msg = do
    String
logger <- forall (m :: * -> *). MonadLogging m => m String
getCurrentLoggerName
    forall (m :: * -> *).
MonadLogging m =>
String -> Priority -> String -> m ()
logM String
logger Priority
L.INFO String
msg

noticeM :: MonadLogging m => String -> m ()
noticeM :: forall (m :: * -> *). MonadLogging m => String -> m ()
noticeM String
msg = do
    String
logger <- forall (m :: * -> *). MonadLogging m => m String
getCurrentLoggerName
    forall (m :: * -> *).
MonadLogging m =>
String -> Priority -> String -> m ()
logM String
logger Priority
L.NOTICE String
msg

warningM :: MonadLogging m => String -> m ()
warningM :: forall (m :: * -> *). MonadLogging m => String -> m ()
warningM String
msg = do
    String
logger <- forall (m :: * -> *). MonadLogging m => m String
getCurrentLoggerName
    forall (m :: * -> *).
MonadLogging m =>
String -> Priority -> String -> m ()
logM String
logger Priority
L.WARNING String
msg

errorM :: MonadLogging m => String -> m ()
errorM :: forall (m :: * -> *). MonadLogging m => String -> m ()
errorM String
msg = do
    String
logger <- forall (m :: * -> *). MonadLogging m => m String
getCurrentLoggerName
    forall (m :: * -> *).
MonadLogging m =>
String -> Priority -> String -> m ()
logM String
logger Priority
L.ERROR String
msg

criticalM :: MonadLogging m => String -> m ()
criticalM :: forall (m :: * -> *). MonadLogging m => String -> m ()
criticalM String
msg = do
    String
logger <- forall (m :: * -> *). MonadLogging m => m String
getCurrentLoggerName
    forall (m :: * -> *).
MonadLogging m =>
String -> Priority -> String -> m ()
logM String
logger Priority
L.CRITICAL String
msg

alertM :: MonadLogging m => String -> m ()
alertM :: forall (m :: * -> *). MonadLogging m => String -> m ()
alertM String
msg = do
    String
logger <- forall (m :: * -> *). MonadLogging m => m String
getCurrentLoggerName
    forall (m :: * -> *).
MonadLogging m =>
String -> Priority -> String -> m ()
logM String
logger Priority
L.ALERT String
msg

emergencyM :: MonadLogging m => String -> m ()
emergencyM :: forall (m :: * -> *). MonadLogging m => String -> m ()
emergencyM String
msg = do
    String
logger <- forall (m :: * -> *). MonadLogging m => m String
getCurrentLoggerName
    forall (m :: * -> *).
MonadLogging m =>
String -> Priority -> String -> m ()
logM String
logger Priority
L.EMERGENCY String
msg