polysemy-conc-0.3.0.0: lib/Polysemy/Conc/Effect/Race.hs
{-# options_haddock prune #-}
-- |Description: Race effect
module Polysemy.Conc.Effect.Race where
import Polysemy (makeSem_)
import Polysemy.Time (TimeUnit)
-- |Abstract the concept of running two programs concurrently, aborting the other when one terminates.
-- 'Timeout' is a simpler variant, where one thread just sleeps for a given interval.
data Race :: Effect where
-- |Run both programs concurrently, returning the result of the faster one.
Race :: m a -> m b -> Race m (Either a b)
-- |Run the fallback action if the given program doesn't finish within the specified interval.
Timeout :: TimeUnit u => m a -> u -> m b -> Race m (Either a b)
makeSem_ ''Race
-- |Run both programs concurrently, returning the result of the faster one.
race ::
∀ a b r .
Member Race r =>
Sem r a ->
Sem r b ->
Sem r (Either a b)
-- |Run the fallback action if the given program doesn't finish within the specified interval.
timeout ::
∀ a b u r .
TimeUnit u =>
Member Race r =>
Sem r a ->
u ->
Sem r b ->
Sem r (Either a b)