packages feed

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)