{-# LANGUAGE FlexibleContexts #-}

module Package.C.Logging ( putNormal
                         , putDiagnostic
                         , putLoud
                         ) where

import           Control.Monad            (when)
import           Control.Monad.Reader
import           Package.C.Type.Verbosity

putVerbosity :: (MonadReader Verbosity m, MonadIO m) => Verbosity -> String -> m ()
putVerbosity :: forall (m :: * -> *).
(MonadReader Verbosity m, MonadIO m) =>
Verbosity -> String -> m ()
putVerbosity Verbosity
verb String
s = do
    Verbosity
v <- m Verbosity
forall r (m :: * -> *). MonadReader r m => m r
ask
    Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Verbosity
v Verbosity -> Verbosity -> Bool
forall a. Ord a => a -> a -> Bool
>= Verbosity
verb)
        (IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (String -> IO ()
putStrLn String
s))

putNormal :: (MonadReader Verbosity m, MonadIO m) => String -> m ()
putNormal :: forall (m :: * -> *).
(MonadReader Verbosity m, MonadIO m) =>
String -> m ()
putNormal = Verbosity -> String -> m ()
forall (m :: * -> *).
(MonadReader Verbosity m, MonadIO m) =>
Verbosity -> String -> m ()
putVerbosity Verbosity
Normal

putDiagnostic :: (MonadReader Verbosity m, MonadIO m) => String -> m ()
putDiagnostic :: forall (m :: * -> *).
(MonadReader Verbosity m, MonadIO m) =>
String -> m ()
putDiagnostic = Verbosity -> String -> m ()
forall (m :: * -> *).
(MonadReader Verbosity m, MonadIO m) =>
Verbosity -> String -> m ()
putVerbosity Verbosity
Diagnostic

putLoud :: (MonadReader Verbosity m, MonadIO m) => String -> m ()
putLoud :: forall (m :: * -> *).
(MonadReader Verbosity m, MonadIO m) =>
String -> m ()
putLoud = Verbosity -> String -> m ()
forall (m :: * -> *).
(MonadReader Verbosity m, MonadIO m) =>
Verbosity -> String -> m ()
putVerbosity Verbosity
Loud