module Colog.Pure
( PureLoggerT (..)
, runPureLogT
, PureLogger
, runPureLog
, logMessagePure
) where
import Control.Monad.State (MonadState, StateT (..), modify')
import Control.Monad.Trans.Class (MonadTrans)
import Data.Bifunctor (second)
import Data.Foldable (toList)
import Data.Functor.Identity (Identity (..))
import Data.Sequence (Seq, (|>))
import Colog.Core.Action (LogAction (..))
newtype PureLoggerT msg m a = PureLoggerT
{ runPureLoggerT :: StateT (Seq msg) m a
} deriving (Functor, Applicative, Monad, MonadTrans, MonadState (Seq msg))
runPureLogT :: Functor m => PureLoggerT msg m a -> m (a, [msg])
runPureLogT = fmap (second toList) . flip runStateT mempty . runPureLoggerT
type PureLogger msg = PureLoggerT msg Identity
runPureLog :: PureLogger msg a -> (a, [msg])
runPureLog = runIdentity . runPureLogT
{-# INLINE runPureLog #-}
logMessagePure :: Monad m => LogAction (PureLoggerT msg m) msg
logMessagePure = LogAction $ \msg -> modify' (|> msg)
{-# INLINE logMessagePure #-}