packages feed

effectful-zoo-0.0.2.0: components/core/Effectful/Zoo/Log/Data/Logger.hs

module Effectful.Zoo.Log.Data.Logger
  ( Logger(..),
    mkLogger,
  ) where

import Effectful
import Effectful.Zoo.Core
import Effectful.Zoo.Log.Data.Severity
import HaskellWorks.Prelude

newtype Logger i = Logger
  { run :: CallStack -> Severity -> i -> IO ()
  } deriving stock Generic

instance Contravariant Logger where
  contramap f (Logger g) = Logger \cs severity -> g cs severity . f

mkLogger :: ()
  => r <: IOE
  => UnliftStrategy
  -> (CallStack -> Severity -> i -> Eff r ())
  -> Eff r (Logger i)
mkLogger strategy run =
  withEffToIO strategy $ \effToIO ->
    pure $ Logger $ \cs severity i -> effToIO $ run cs severity i