module Polysemy.Log.Di.Atomic where
import Control.Concurrent.STM (newTVarIO)
import qualified DiPolysemy as Di
import Polysemy.Internal.Tactics (liftT)
interpretDiAtomic' ::
∀ level path msg r .
Member (AtomicState [msg]) r =>
InterpreterFor (Di.Di level path msg) r
interpretDiAtomic' :: forall level path msg (r :: EffectRow).
Member (AtomicState [msg]) r =>
InterpreterFor (Di level path msg) r
interpretDiAtomic' =
(forall (rInitial :: EffectRow) x.
Di level path msg (Sem rInitial) x
-> Tactical (Di level path msg) (Sem rInitial) r x)
-> Sem (Di level path msg : r) a -> Sem r a
forall (e :: Effect) (r :: EffectRow) a.
(forall (rInitial :: EffectRow) x.
e (Sem rInitial) x -> Tactical e (Sem rInitial) r x)
-> Sem (e : r) a -> Sem r a
interpretH \case
Di.Log level
_ msg
msg -> Sem r x
-> Sem (WithTactics (Di level path msg) f (Sem rInitial) r) (f x)
forall (m :: * -> *) (f :: * -> *) (r :: EffectRow) (e :: Effect)
a.
Functor f =>
Sem r a -> Sem (WithTactics e f m r) (f a)
liftT (([msg] -> [msg]) -> Sem r ()
forall s (r :: EffectRow).
Member (AtomicState s) r =>
(s -> s) -> Sem r ()
atomicModify' (msg
msg :))
Di level path msg (Sem rInitial) x
Di.Flush -> x -> Sem (WithTactics (Di level path msg) f (Sem rInitial) r) (f x)
forall (f :: * -> *) a (e :: Effect) (m :: * -> *)
(r :: EffectRow).
Functor f =>
a -> Sem (WithTactics e f m r) (f a)
pureT ()
Di.Local Di level path msg -> Di level path msg
_ Sem rInitial x
ma -> Sem rInitial x
-> forall {f :: * -> *}.
Functor f =>
Sem (WithTactics (Di level path msg) f (Sem rInitial) r) (f x)
forall (m :: * -> *) a (e :: Effect) (r :: EffectRow).
m a -> Tactical e m r a
runTSimple Sem rInitial x
ma
Di level path msg (Sem rInitial) x
Di.Fetch -> x -> Sem (WithTactics (Di level path msg) f (Sem rInitial) r) (f x)
forall (f :: * -> *) a (e :: Effect) (m :: * -> *)
(r :: EffectRow).
Functor f =>
a -> Sem (WithTactics e f m r) (f a)
pureT x
Maybe (Di level path msg)
forall a. Maybe a
Nothing
{-# inline interpretDiAtomic' #-}
interpretDiAtomic ::
∀ level path msg r .
Member (Embed IO) r =>
InterpretersFor [Di.Di level path msg, AtomicState [msg]] r
interpretDiAtomic :: forall level path msg (r :: EffectRow).
Member (Embed IO) r =>
InterpretersFor '[Di level path msg, AtomicState [msg]] r
interpretDiAtomic Sem (Append '[Di level path msg, AtomicState [msg]] r) a
sem = do
TVar [msg]
tv <- IO (TVar [msg]) -> Sem r (TVar [msg])
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed ([msg] -> IO (TVar [msg])
forall a. a -> IO (TVar a)
newTVarIO [])
TVar [msg] -> Sem (AtomicState [msg] : 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 [msg]
tv (Sem (Di level path msg : AtomicState [msg] : r) a
-> Sem (AtomicState [msg] : r) a
InterpreterFor (Di level path msg) (AtomicState [msg] : r)
forall level path msg (r :: EffectRow).
Member (AtomicState [msg]) r =>
InterpreterFor (Di level path msg) r
interpretDiAtomic' Sem (Di level path msg : AtomicState [msg] : r) a
Sem (Append '[Di level path msg, AtomicState [msg]] r) a
sem)
{-# inline interpretDiAtomic #-}