{-# LANGUAGE UndecidableInstances #-}
module Control.Eff.LogWriter.Capture
( captureLogWriter
, CaptureLogs(..)
, CaptureLogWriter
, runCaptureLogWriter
)
where
import Control.Eff as Eff
import Control.Eff.Log
import Control.Eff.Writer.Strict ( Writer
, tell
, runListWriter
)
import Data.Foldable ( traverse_ )
captureLogWriter :: LogWriter CaptureLogs
captureLogWriter = MkLogWriter (MkCaptureLogs . tell)
newtype CaptureLogs a = MkCaptureLogs { unCaptureLogs :: Eff '[CaptureLogWriter] a }
deriving (Functor, Applicative, Monad)
instance Member CaptureLogWriter e => HandleLogWriter CaptureLogs e where
handleLogWriterEffect =
traverse_ (tell @LogMessage) . snd . run . runListWriter . unCaptureLogs
runCaptureLogWriter
:: Eff (CaptureLogWriter ': e) a -> Eff e (a, [LogMessage])
runCaptureLogWriter = runListWriter
type CaptureLogWriter = Writer LogMessage