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 :: forall (r :: [Effect]) i a. (r <: IOE) => UnliftStrategy -> (CallStack -> Severity -> i -> Eff r ()) -> Eff (Log i : r) a -> Eff r a runLog UnliftStrategy s CallStack -> Severity -> i -> Eff r () run = (Eff (Log i : r) a -> Eff r a) -> (forall {a} {localEs :: [Effect]}. (HasCallStack, Log i :> localEs) => LocalEnv localEs (Log i : r) -> Log i (Eff localEs) a -> Eff (Log i : r) a) -> Eff (Log i : r) a -> Eff r a forall (e :: Effect) (handlerEs :: [Effect]) a (es :: [Effect]) b. (HasCallStack, DispatchOf e ~ 'Dynamic) => (Eff handlerEs a -> Eff es b) -> EffectHandler e handlerEs -> Eff (e : es) a -> Eff es b reinterpret (UnliftStrategy -> (CallStack -> Severity -> i -> Eff r ()) -> Eff (Log i : r) a -> Eff r a forall (r :: [Effect]) i a. (r <: IOE, HasCallStack) => UnliftStrategy -> (CallStack -> Severity -> i -> Eff r ()) -> Eff (Log i : r) a -> Eff r a S.runLog UnliftStrategy s CallStack -> Severity -> i -> Eff r () run) ((forall {a} {localEs :: [Effect]}. (HasCallStack, Log i :> localEs) => LocalEnv localEs (Log i : r) -> Log i (Eff localEs) a -> Eff (Log i : r) a) -> Eff (Log i : r) a -> Eff r a) -> (forall {a} {localEs :: [Effect]}. (HasCallStack, Log i :> localEs) => LocalEnv localEs (Log i : r) -> Log i (Eff localEs) a -> Eff (Log i : r) a) -> Eff (Log i : r) a -> Eff r a forall a b. (a -> b) -> a -> b $ \LocalEnv localEs (Log i : r) env -> \case Log Severity severity i i -> Severity -> i -> Eff (Log i : r) () forall (r :: [Effect]) i. (HasCallStack, r <: Log i, r <: IOE) => Severity -> i -> Eff r () S.log Severity severity i i Local i -> i f Eff localEs a m -> LocalEnv localEs (Log i : r) -> ((forall {r}. Eff localEs r -> Eff (Log i : r) r) -> Eff (Log i : r) a) -> Eff (Log i : r) a forall (es :: [Effect]) (handlerEs :: [Effect]) (localEs :: [Effect]) a. (HasCallStack, SharedSuffix es handlerEs) => LocalEnv localEs handlerEs -> ((forall r. Eff localEs r -> Eff es r) -> Eff es a) -> Eff es a localSeqUnlift LocalEnv localEs (Log i : r) env (((forall {r}. Eff localEs r -> Eff (Log i : r) r) -> Eff (Log i : r) a) -> Eff (Log i : r) a) -> ((forall {r}. Eff localEs r -> Eff (Log i : r) r) -> Eff (Log i : r) a) -> Eff (Log i : r) a forall a b. (a -> b) -> a -> b $ \forall {r}. Eff localEs r -> Eff (Log i : r) r unlift -> (i -> i) -> Eff (Log i : r) a -> Eff (Log i : r) a forall (r :: [Effect]) i a. (HasCallStack, r <: Log i) => (i -> i) -> Eff r a -> Eff r a S.local i -> i f (Eff localEs a -> Eff (Log i : r) a forall {r}. Eff localEs r -> Eff (Log i : r) r unlift Eff localEs a m)