module Game.GoreAndAsh.Logging.State(
LoggingState(..)
, LoggingLevel(..)
, LoggingSink(..)
, emptyLoggingState
, filterLogMessage
) where
import Control.DeepSeq
import Data.Hashable
import Data.Text
import GHC.Generics (Generic)
import qualified Data.HashMap.Strict as H
import qualified Data.HashSet as HS
import qualified Data.Sequence as S
import System.IO
data LoggingSink =
LoggingConsole
| LoggingFile
deriving (Eq, Ord, Bounded, Show, Read, Generic)
instance NFData LoggingSink
instance Hashable LoggingSink
data LoggingLevel =
LogDebug
| LogInfo
| LogWarn
| LogError
| LogMuted
deriving (Eq, Ord, Bounded, Show, Read, Generic)
instance NFData LoggingLevel
instance Hashable LoggingLevel
type LoggingFilter = H.HashMap LoggingLevel (HS.HashSet LoggingSink)
data LoggingState s = LoggingState {
loggingMsgs :: !(S.Seq (LoggingLevel, Text))
, loggingNextState :: !s
, loggingFile :: !(Maybe Handle)
, loggingFilter :: !(LoggingFilter)
, loggignDebug :: !Bool
} deriving (Generic)
instance NFData s => NFData (LoggingState s) where
rnf LoggingState{..} =
loggingMsgs `deepseq`
loggingNextState `deepseq`
loggingFile `seq`
loggingFilter `deepseq`
loggignDebug `seq` ()
emptyLoggingState :: s -> LoggingState s
emptyLoggingState s = LoggingState {
loggingMsgs = S.empty
, loggingNextState = s
, loggingFile = Nothing
, loggingFilter = H.empty
, loggignDebug = False
}
filterLogMessage :: LoggingState s -> LoggingLevel -> LoggingSink -> Bool
filterLogMessage LoggingState{..} ll ls = case H.lookup ll loggingFilter of
Nothing -> True
Just ss -> HS.member ls ss