{-# options_haddock prune #-}
module Polysemy.Conc.Sync (
module Polysemy.Conc.Sync,
module Polysemy.Conc.Effect.Sync
) where
import qualified Polysemy.Time as Time
import Polysemy.Time (Time, TimeUnit)
import Polysemy.Conc.Effect.Scoped (scoped)
import qualified Polysemy.Conc.Effect.Sync as Sync
import Polysemy.Conc.Effect.Sync (
ScopedSync,
Sync,
SyncResources,
block,
empty,
putBlock,
putTry,
putWait,
readBlock,
readTry,
readWait,
takeBlock,
takeTry,
takeWait,
try,
wait,
)
whileEmpty ::
∀ a r .
Member (Sync a) r =>
Sem r () ->
Sem r ()
whileEmpty :: forall a (r :: [(* -> *) -> * -> *]).
Member (Sync a) r =>
Sem r () -> Sem r ()
whileEmpty Sem r ()
action =
Sem r ()
spin
where
spin :: Sem r ()
spin = do
Sem r ()
action
Sem r Bool -> Sem r () -> Sem r ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Bool -> Bool
not (Bool -> Bool) -> Sem r Bool -> Sem r Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall d (r :: [(* -> *) -> * -> *]).
MemberWithError (Sync d) r =>
Sem r Bool
Sync.empty @a) Sem r ()
spin
whileEmptyInterval ::
∀ a u t d r .
TimeUnit u =>
Members [Time t d, Sync a] r =>
u ->
Sem r () ->
Sem r ()
whileEmptyInterval :: forall a u t d (r :: [(* -> *) -> * -> *]).
(TimeUnit u, Members '[Time t d, Sync a] r) =>
u -> Sem r () -> Sem r ()
whileEmptyInterval u
interval Sem r ()
action =
Sem r ()
spin
where
spin :: Sem r ()
spin = do
Sem r ()
action
Sem r Bool -> Sem r () -> Sem r ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (Bool -> Bool
not (Bool -> Bool) -> Sem r Bool -> Sem r Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall d (r :: [(* -> *) -> * -> *]).
MemberWithError (Sync d) r =>
Sem r Bool
Sync.empty @a) (forall t d u (r :: [(* -> *) -> * -> *]).
(TimeUnit u, Member (Time t d) r) =>
u -> Sem r ()
Time.sleep @t @d u
interval Sem r () -> Sem r () -> Sem r ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Sem r ()
spin)
withSync ::
∀ d res r .
Member (ScopedSync res d) r =>
InterpreterFor (Sync d) r
withSync :: forall d res (r :: [(* -> *) -> * -> *]).
Member (ScopedSync res d) r =>
InterpreterFor (Sync d) r
withSync =
forall resource (effect :: (* -> *) -> * -> *)
(r :: [(* -> *) -> * -> *]).
Member (Scoped resource effect) r =>
InterpreterFor effect r
scoped @(SyncResources res)
lock ::
∀ l r a .
Members [Sync l, Resource] r =>
l ->
Sem r a ->
Sem r a
lock :: forall l (r :: [(* -> *) -> * -> *]) a.
Members '[Sync l, Resource] r =>
l -> Sem r a -> Sem r a
lock l
l Sem r a
ma =
Sem r a -> Sem r Bool -> Sem r a
forall (r :: [(* -> *) -> * -> *]) a b.
Member Resource r =>
Sem r a -> Sem r b -> Sem r a
finally (forall d (r :: [(* -> *) -> * -> *]).
MemberWithError (Sync d) r =>
Sem r d
takeBlock @l Sem r l -> Sem r a -> Sem r a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Sem r a
ma) (l -> Sem r Bool
forall d (r :: [(* -> *) -> * -> *]).
MemberWithError (Sync d) r =>
d -> Sem r Bool
putTry l
l)