-- |
-- Module: NetSpider.Log
-- Description: Types and functions for basic logging
-- Maintainer: Toshio Ito <debug.ito@gmail.com>
--
-- This module is rather for internal use, but end-users can use it,
-- e.g. to implement the unifier.
--
-- @since 0.2.0.0
module NetSpider.Log
       ( LogLine,
         WriterLoggingM,
         runWriterLoggingM,
         logDebugW,
         logInfoW,
         logWarnW,
         logErrorW,
         spack
       ) where

import qualified Control.Monad.Logger as Log
import Data.Functor.Identity (Identity, runIdentity)
import Data.Text (Text, pack)

type LogLine = (Log.Loc, Log.LogSource, Log.LogLevel, Log.LogStr)

type WriterLoggingM = Log.WriterLoggingT Identity

runWriterLoggingM :: WriterLoggingM a -> (a, [LogLine])
runWriterLoggingM :: WriterLoggingM a -> (a, [LogLine])
runWriterLoggingM = Identity (a, [LogLine]) -> (a, [LogLine])
forall a. Identity a -> a
runIdentity (Identity (a, [LogLine]) -> (a, [LogLine]))
-> (WriterLoggingM a -> Identity (a, [LogLine]))
-> WriterLoggingM a
-> (a, [LogLine])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WriterLoggingM a -> Identity (a, [LogLine])
forall (m :: * -> *) a.
Functor m =>
WriterLoggingT m a -> m (a, [LogLine])
Log.runWriterLoggingT

logDebugW :: Text -> WriterLoggingM ()
logDebugW :: Text -> WriterLoggingM ()
logDebugW = Text -> WriterLoggingM ()
forall (m :: * -> *). MonadLogger m => Text -> m ()
Log.logDebugN

-- | @since 0.4.3.0
logInfoW :: Text -> WriterLoggingM ()
logInfoW :: Text -> WriterLoggingM ()
logInfoW = Text -> WriterLoggingM ()
forall (m :: * -> *). MonadLogger m => Text -> m ()
Log.logInfoN

-- | @since 0.4.3.0
logWarnW :: Text -> WriterLoggingM ()
logWarnW :: Text -> WriterLoggingM ()
logWarnW = Text -> WriterLoggingM ()
forall (m :: * -> *). MonadLogger m => Text -> m ()
Log.logWarnN

-- | @since 0.4.3.0
logErrorW :: Text -> WriterLoggingM ()
logErrorW :: Text -> WriterLoggingM ()
logErrorW = Text -> WriterLoggingM ()
forall (m :: * -> *). MonadLogger m => Text -> m ()
Log.logErrorN

spack :: Show a => a -> Text
spack :: a -> Text
spack = String -> Text
pack (String -> Text) -> (a -> String) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show