polysemy-conc-0.1.1.0: lib/Polysemy/Conc/Sync.hs
-- |Description: Sync Combinators
module Polysemy.Conc.Sync where
import qualified Polysemy.Time as Time
import Polysemy.Time (Time, TimeUnit)
import qualified Polysemy.Conc.Effect.Sync as Sync
import Polysemy.Conc.Effect.Sync (Sync)
whileEmpty ::
∀ a r .
Member (Sync a) r =>
Sem r () ->
Sem r ()
whileEmpty action =
spin
where
spin = do
action
whenM (isJust <$> Sync.try @a) spin
whileEmptyInterval ::
∀ a u t d r .
TimeUnit u =>
Members [Time t d, Sync a] r =>
u ->
Sem r () ->
Sem r ()
whileEmptyInterval interval action =
spin
where
spin = do
action
whenM (isJust <$> Sync.try @a) (Time.sleep @t @d interval *> spin)