polysemy-conc-0.1.0.0: lib/Polysemy/Conc/Data/Race.hs
{-# options_haddock prune #-}
-- |Description: Race effect
module Polysemy.Conc.Data.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)
-- |Return the fallback value if the given program doesn't finish within the specified interval.
Timeout :: TimeUnit u => 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)
-- |Return the fallback value if the given program doesn't finish within the specified interval.
timeout ::
∀ a b u r .
TimeUnit u =>
Member Race r =>
a ->
u ->
Sem r b ->
Sem r (Either a b)