packages feed

polysemy-log-co-0.5.0.0: lib/Polysemy/Log/Colog/Atomic.hs

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

import qualified Colog.Polysemy as Colog
import Control.Concurrent.STM (newTVarIO)

-- |Interpret 'Colog.Log' by prepending each message to a list in an 'AtomicState'.
interpretCologAtomic' ::
  ∀ a r .
  Member (AtomicState [a]) r =>
  InterpreterFor (Colog.Log a) r
interpretCologAtomic' =
  interpret \case
    Colog.Log msg -> atomicModify' (msg :)
{-# inline interpretCologAtomic' #-}

-- |Interpret 'Colog.Log' by prepending each message to a list in an 'AtomicState', then interpret the 'AtomicState' in
-- a 'Control.Concurrent.STM.TVar'.
interpretCologAtomic ::
  ∀ a r .
  Member (Embed IO) r =>
  InterpretersFor [Colog.Log a, AtomicState [a]] r
interpretCologAtomic sem = do
  tv <- embed (newTVarIO [])
  runAtomicStateTVar tv (interpretCologAtomic' sem)
{-# inline interpretCologAtomic #-}