@@ -5,52 +5,51 @@ module Effectful.Async
55 , runAsyncE
66
77 -- * Asynchronous actions
8− , A.Async
9− -- ** Spawning
10− , async, asyncBound, asyncOn
11− , asyncWithUnmask, asyncOnWithUnmask
8+ , Async
9+
10+ -- * High-level API
1211
1312 -- ** Spawning with automatic 'cancel'ation
14− , withAsync, withAsyncBound, withAsyncOn
15− , withAsyncWithUnmask, withAsyncOnWithUnmask
16−
17− -- ** Quering 'Async's
18− , wait, poll, waitCatch
19− , cancel
20− , uninterruptibleCancel
21− , cancelWith
22− , A.asyncThreadId
23− , A.AsyncCancelled(..)
24−
25− -- ** STM operations
13+ , withAsync, withAsyncBound, withAsyncOn, withAsyncWithUnmask
14+ , withAsyncOnWithUnmask
15+
16+ -- ** Querying 'Async's
17+ , wait, poll, waitCatch, A.asyncThreadId
18+ , cancel, uninterruptibleCancel, cancelWith, A.AsyncCancelled(..)
19+
20+ -- ** #high-level-utilities# High-level utilities
21+ , race, race_
22+ , concurrently, concurrently_
23+ , mapConcurrently, forConcurrently
24+ , mapConcurrently_, forConcurrently_
25+ , replicateConcurrently, replicateConcurrently_
26+ , Concurrently(..)
27+ , A.compareAsyncs
28+
29+ -- ** Specialised operations
30+
31+ -- *** STM operations
2632 , A.waitSTM, A.pollSTM, A.waitCatchSTM
2733
28− -- ** Waiting for multiple 'Async's
34+ -- *** Waiting for multiple 'Async's
2935 , waitAny, waitAnyCatch, waitAnyCancel, waitAnyCatchCancel
3036 , waitEither, waitEitherCatch, waitEitherCancel, waitEitherCatchCancel
3137 , waitEither_
3238 , waitBoth
3339
34− -- ** Waiting for multiple 'Async's in STM
35− , A.waitAnySTM
36− , A.waitAnyCatchSTM
37− , A.waitEitherSTM
38− , A.waitEitherCatchSTM
40+ -- *** Waiting for multiple 'Async's in STM
41+ , A.waitAnySTM, A.waitAnyCatchSTM
42+ , A.waitEitherSTM, A.waitEitherCatchSTM
3943 , A.waitEitherSTM_
4044 , A.waitBothSTM
4145
42− -- ** Linking
43− , link, link2
44− , A.ExceptionInLinkedThread(..)
46+ -- * Low-level API
4547
46− -- * Convenient utilities
47− , race, race_, concurrently, concurrently_
48− , mapConcurrently, mapConcurrently_
49− , forConcurrently, forConcurrently_
50− , replicateConcurrently, replicateConcurrently_
51− , Concurrently(..)
48+ -- ** Spawning (low-level API)
49+ , async, asyncBound, asyncOn, asyncWithUnmask, asyncOnWithUnmask
5250
53− , A.compareAsyncs
51+ -- ** Linking
52+ , link, linkOnly, link2, link2Only, A.ExceptionInLinkedThread(..)
5453 ) where
5554
5655import Control.Applicative
@@ -240,10 +239,18 @@ waitBoth a b = unsafeEff_ $ A.waitBoth a b
240239link :: AsyncE :> es => Async a -> Eff es ()
241240link = unsafeEff_ . A.link
242241
242+-- | Generalized version of 'A.linkOnly'.
243+linkOnly :: AsyncE :> es => (SomeException -> Bool) -> Async a -> Eff es ()
244+linkOnly f = unsafeEff_ . A.linkOnly f
245+
243246-- | Generalized version of 'A.link2'.
244247link2 :: AsyncE :> es => Async a -> Async b -> Eff es ()
245248link2 a b = unsafeEff_ $ A.link2 a b
246249
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
253+
247254-- | Generalized version of 'A.race'.
248255race :: AsyncE :> es => Eff es a -> Eff es b -> Eff es (Either a b)
249256race ma mb = withAsync ma $ \a -> withAsync mb $ \b -> waitEither a b