packages feed

polysemy-log-di-0.4.0.0: lib/Polysemy/Log/Di/Atomic.hs

-- |Description: Internal
module Polysemy.Log.Di.Atomic where

import qualified DiPolysemy as Di
import Polysemy (interpretH, runTSimple)
import Polysemy.Internal (InterpretersFor)
import Polysemy.Internal.Tactics (liftT)

-- |Interpret 'Di.Di' by prepending each message to a list in an 'AtomicState'.
interpretDiAtomic' ::
  ∀ level path msg r .
  Member (AtomicState [msg]) r =>
  InterpreterFor (Di.Di level path msg) r
interpretDiAtomic' =
  interpretH \case
    Di.Log _ msg -> liftT (atomicModify' (msg :))
    Di.Flush -> pureT ()
    Di.Local _ ma -> runTSimple ma
    Di.Fetch -> pureT Nothing
{-# inline interpretDiAtomic' #-}

-- |Interpret 'Di.Di' by prepending each message to a list in an 'AtomicState', then interpret the
-- 'AtomicState' in a 'TVar'.
interpretDiAtomic ::
  ∀ level path msg r .
  Member (Embed IO) r =>
  InterpretersFor [Di.Di level path msg, AtomicState [msg]] r
interpretDiAtomic sem = do
  tv <- newTVarIO []
  runAtomicStateTVar tv (interpretDiAtomic' sem)
{-# inline interpretDiAtomic #-}