packages feed

effectful-zoo-0.0.0.1: components/log/Effectful/Zoo/Log/Dynamic.hs

module Effectful.Zoo.Log.Dynamic
  ( Log (..),
    runLog,
  ) where

import Effectful
import Effectful.Dispatch.Dynamic
import Effectful.Zoo.Core
import Effectful.Zoo.Log.Data.Severity
import Effectful.Zoo.Log.Static qualified as S
import HaskellWorks.Prelude

data Log i :: Effect where
  Log
    :: HasCallStack
    => Severity
    -> i
    -> Log i m ()

  Local
    :: (i -> i)
    -> m a
    -> Log i m a

type instance DispatchOf (Log a) = Dynamic

runLog :: ()
  => r <: IOE
  => UnliftStrategy
  -> (CallStack -> Severity -> i -> Eff r ())
  -> Eff (Log i : r) a
  -> Eff r a
runLog s run =
  reinterpret (S.runLog s run) $ \env -> \case
    Log severity i -> S.log severity i
    Local f m -> localSeqUnlift env $ \unlift -> S.local f (unlift m)