GPipe-GLFW4-2.0.0: src/Graphics/GPipe/Context/GLFW/Logger.hs
{-# LANGUAGE NamedFieldPuns #-}
module Graphics.GPipe.Context.GLFW.Logger where
import System.IO (hPutStrLn, stderr)
import Text.Printf (printf)
-- | Levels of severity for log messages.
data LogLevel = DEBUG | INFO | WARNING | ERROR
deriving (Show, Eq, Ord, Enum, Bounded)
-- | An arbitrary sink into which log messages may be passed.
newtype LogSink = LogSink { runSink :: String -> IO () }
-- | Very simple logger handle.
data Logger = Logger
{ loggerLevel :: LogLevel
, loggerSink :: LogSink
}
-- | Emit a message to the sink specified by 'Logger' if the provided
-- 'Loglevel' is more severe than the configured one.
emitLog :: Logger -> LogLevel -> String -> IO ()
emitLog Logger{loggerLevel, loggerSink} messageLevel message
| loggerLevel <= messageLevel = runSink loggerSink $ printf "%s %s" (show messageLevel) message
| otherwise = return ()
-- | A 'LogSink' which writes to the @stderr@ stream.
stderrSink :: LogSink
stderrSink = LogSink $ hPutStrLn stderr