module Polysemy.Log.Colog.Atomic where
import qualified Colog.Polysemy as Colog
import Polysemy.Internal (InterpretersFor)
interpretCologAtomic' ::
∀ a r .
Member (AtomicState [a]) r =>
InterpreterFor (Colog.Log a) r
interpretCologAtomic' :: InterpreterFor (Log a) r
interpretCologAtomic' =
(forall x (rInitial :: EffectRow).
Log a (Sem rInitial) x -> Sem r x)
-> Sem (Log a : r) a -> Sem r a
forall (e :: Effect) (r :: EffectRow) a.
FirstOrder e "interpret" =>
(forall x (rInitial :: EffectRow). e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \case
Colog.Log msg -> ([a] -> [a]) -> Sem r ()
forall s (r :: EffectRow).
Member (AtomicState s) r =>
(s -> s) -> Sem r ()
atomicModify' (a
msg a -> [a] -> [a]
forall a. a -> [a] -> [a]
:)
{-# INLINE interpretCologAtomic' #-}
interpretCologAtomic ::
∀ a r .
Member (Embed IO) r =>
InterpretersFor [Colog.Log a, AtomicState [a]] r
interpretCologAtomic :: InterpretersFor '[Log a, AtomicState [a]] r
interpretCologAtomic Sem (Append '[Log a, AtomicState [a]] r) a
sem = do
TVar [a]
tv <- [a] -> Sem r (TVar [a])
forall (m :: * -> *) a. MonadIO m => a -> m (TVar a)
newTVarIO []
TVar [a] -> Sem (AtomicState [a] : r) a -> Sem r a
forall (r :: EffectRow) s a.
Member (Embed IO) r =>
TVar s -> Sem (AtomicState s : r) a -> Sem r a
runAtomicStateTVar TVar [a]
tv (Sem (Log a : AtomicState [a] : r) a -> Sem (AtomicState [a] : r) a
forall a (r :: EffectRow).
Member (AtomicState [a]) r =>
InterpreterFor (Log a) r
interpretCologAtomic' Sem (Log a : AtomicState [a] : r) a
Sem (Append '[Log a, AtomicState [a]] r) a
sem)
{-# INLINE interpretCologAtomic #-}