@@ -5,52 +5,51 @@ module Effectful.Async
5 , runAsyncE
5 , runAsyncE
7 -- * Asynchronous actions
7 -- * Asynchronous actions
10− , async, asyncBound, asyncOn
10+ -- * High-level API
11− , asyncWithUnmask, asyncOnWithUnmask
13 -- ** Spawning with automatic 'cancel'ation
12 -- ** Spawning with automatic 'cancel'ation
14− , withAsync, withAsyncBound, withAsyncOn
13+ , withAsync, withAsyncBound, withAsyncOn, withAsyncWithUnmask
15− , withAsyncWithUnmask, withAsyncOnWithUnmask
14+ , withAsyncOnWithUnmask
17− -- ** Quering 'Async's
16+ -- ** Querying 'Async's
18− , wait, poll, waitCatch
17+ , wait, poll, waitCatch, A.asyncThreadId
20− , uninterruptibleCancel
18+ , cancel, uninterruptibleCancel, cancelWith, A.AsyncCancelled(..)
22− , A.asyncThreadId
20+ -- ** #high-level-utilities# High-level utilities
23− , A.AsyncCancelled(..)
21+ , race, race_
24−
22+ , concurrently, concurrently_
23+ , mapConcurrently, forConcurrently
24+ , mapConcurrently_, forConcurrently_
25+ , replicateConcurrently, replicateConcurrently_
29+ -- ** Specialised operations
25− -- ** STM operations
31+ -- *** STM operations
26 , A.waitSTM, A.pollSTM, A.waitCatchSTM
32 , A.waitSTM, A.pollSTM, A.waitCatchSTM
28− -- ** Waiting for multiple 'Async's
34+ -- *** Waiting for multiple 'Async's
29 , waitAny, waitAnyCatch, waitAnyCancel, waitAnyCatchCancel
35 , waitAny, waitAnyCatch, waitAnyCancel, waitAnyCatchCancel
30 , waitEither, waitEitherCatch, waitEitherCancel, waitEitherCatchCancel
36 , waitEither, waitEitherCatch, waitEitherCancel, waitEitherCatchCancel
31 , waitEither_
37 , waitEither_
32 , waitBoth
38 , waitBoth
34− -- ** Waiting for multiple 'Async's in STM
40+ -- *** Waiting for multiple 'Async's in STM
36− , A.waitAnyCatchSTM
41+ , A.waitAnySTM, A.waitAnyCatchSTM
38− , A.waitEitherCatchSTM
42+ , A.waitEitherSTM, A.waitEitherCatchSTM
39 , A.waitEitherSTM_
43 , A.waitEitherSTM_
40 , A.waitBothSTM
44 , A.waitBothSTM
42− -- ** Linking
46+ -- * Low-level API
44− , A.ExceptionInLinkedThread(..)
46− -- * Convenient utilities
48+ -- ** Spawning (low-level API)
47− , race, race_, concurrently, concurrently_
49+ , async, asyncBound, asyncOn, asyncWithUnmask, asyncOnWithUnmask
48− , mapConcurrently, mapConcurrently_
49− , forConcurrently, forConcurrently_
50− , replicateConcurrently, replicateConcurrently_
53− , A.compareAsyncs
51+ -- ** Linking
52+ , link, linkOnly, link2, link2Only, A.ExceptionInLinkedThread(..)
56import Control.Applicative
55import Control.Applicative
@@ -240,10 +239,18 @@ waitBoth a b = unsafeEff_ $ A.waitBoth a b
240link :: AsyncE :> es => Async a -> Eff es ()
239link :: AsyncE :> es => Async a -> Eff es ()
241link = unsafeEff_ . A.link
240link = unsafeEff_ . A.link
242+-- | Generalized version of 'A.linkOnly'.
243+linkOnly :: AsyncE :> es => (SomeException -> Bool) -> Async a -> Eff es ()
244+linkOnly f = unsafeEff_ . A.linkOnly f
243-- | Generalized version of 'A.link2'.
246-- | Generalized version of 'A.link2'.
244link2 :: AsyncE :> es => Async a -> Async b -> Eff es ()
247link2 :: AsyncE :> es => Async a -> Async b -> Eff es ()
245link2 a b = unsafeEff_ $ A.link2 a b
248link2 a b = unsafeEff_ $ A.link2 a b
250+-- | Generalized version of 'A.link2Only'.
251+link2Only :: AsyncE :> es => (SomeException -> Bool) -> Async a -> Async b -> Eff es ()
252+link2Only f a b = unsafeEff_ $ A.link2Only f a b
247-- | Generalized version of 'A.race'.
254-- | Generalized version of 'A.race'.
248race :: AsyncE :> es => Eff es a -> Eff es b -> Eff es (Either a b)
255race :: AsyncE :> es => Eff es a -> Eff es b -> Eff es (Either a b)
249race ma mb = withAsync ma $ \a -> withAsync mb $ \b -> waitEither a b
256race ma mb = withAsync ma $ \a -> withAsync mb $ \b -> waitEither a b