packages feed

effectful-zoo-0.0.2.0: components/core/Effectful/Zoo/DataLog/Dynamic.hs

module Effectful.Zoo.DataLog.Dynamic
  ( DataLog (..),
    runDataLog,
  ) where

import Effectful
import Effectful.Dispatch.Dynamic
import Effectful.Zoo.DataLog.Static qualified as S
import HaskellWorks.Prelude

data DataLog a :: Effect where
  DataLog
    :: a
    -> DataLog a m ()

  Local
    :: (a -> a)
    -> m b
    -> DataLog a m b

type instance DispatchOf (DataLog a) = Dynamic

runDataLog :: ()
  => HasCallStack
  => (HasCallStack => i -> Eff r ())
  -> Eff (DataLog i : r) a
  -> Eff r a
runDataLog run =
  reinterpret (S.runDataLog run) $ \env -> \case
    DataLog i -> S.log i
    Local f m -> localSeqUnlift env $ \unlift -> S.local f (unlift m)