@@ -53,15 +53,19 @@ class ( MonadSTM m
53
53
, MonadThread m
54
54
) => MonadAsync m where
55
55
56
- {-# MINIMAL async, asyncThreadId, cancel, cancelWith, asyncWithUnmask ,
57
- waitCatchSTM, pollSTM #-}
56
+ {-# MINIMAL async, asyncBound, asyncOn, asyncThreadId, cancel, cancelWith,
57
+ asyncWithUnmask, asyncOnWithUnmask, waitCatchSTM, pollSTM #-}
58
58
59
59
-- | An asynchronous action
60
60
type Async m = (async :: Type -> Type ) | async -> m
61
61
62
62
async :: m a -> m (Async m a )
63
+ asyncBound :: m a -> m (Async m a )
64
+ asyncOn :: Int -> m a -> m (Async m a )
63
65
asyncThreadId :: Async m a -> ThreadId m
64
66
withAsync :: m a -> (Async m a -> m b ) -> m b
67
+ withAsyncBound :: m a -> (Async m a -> m b ) -> m b
68
+ withAsyncOn :: Int -> m a -> (Async m a -> m b ) -> m b
65
69
66
70
waitSTM :: Async m a -> STM m a
67
71
pollSTM :: Async m a -> STM m (Maybe (Either SomeException a ))
@@ -144,9 +148,23 @@ class ( MonadSTM m
144
148
concurrently_ :: m a -> m b -> m ()
145
149
146
150
asyncWithUnmask :: ((forall b . m b -> m b ) -> m a ) -> m (Async m a )
151
+ asyncOnWithUnmask :: Int -> ((forall b . m b -> m b ) -> m a ) -> m (Async m a )
152
+ withAsyncWithUnmask :: ((forall c . m c -> m c ) -> m a ) -> (Async m a -> m b ) -> m b
153
+ withAsyncOnWithUnmask :: Int -> ((forall c . m c -> m c ) -> m a ) -> (Async m a -> m b ) -> m b
154
+
155
+ compareAsyncs :: Async m a -> Async m b -> Ordering
147
156
148
157
-- default implementations
149
158
default withAsync :: MonadMask m => m a -> (Async m a -> m b ) -> m b
159
+ default withAsyncBound:: MonadMask m => m a -> (Async m a -> m b ) -> m b
160
+ default withAsyncOn :: MonadMask m => Int -> m a -> (Async m a -> m b ) -> m b
161
+ default withAsyncWithUnmask
162
+ :: MonadMask m => ((forall c . m c -> m c ) -> m a )
163
+ -> (Async m a -> m b ) -> m b
164
+ default withAsyncOnWithUnmask
165
+ :: MonadMask m => Int
166
+ -> ((forall c . m c -> m c ) -> m a )
167
+ -> (Async m a -> m b ) -> m b
150
168
default uninterruptibleCancel
151
169
:: MonadMask m => Async m a -> m ()
152
170
default waitAnyCancel :: MonadThrow m => [Async m a ] -> m (Async m a , a )
@@ -157,12 +175,35 @@ class ( MonadSTM m
157
175
default waitEitherCatchCancel :: MonadThrow m => Async m a -> Async m b
158
176
-> m (Either (Either SomeException a)
159
177
(Either SomeException b))
178
+ default compareAsyncs :: Ord (ThreadId m )
179
+ => Async m a -> Async m b -> Ordering
160
180
161
181
withAsync action inner = mask $ \ restore -> do
162
182
a <- async (restore action)
163
183
restore (inner a)
164
184
`finally` uninterruptibleCancel a
165
185
186
+ withAsyncBound action inner = mask $ \ restore -> do
187
+ a <- asyncBound (restore action)
188
+ restore (inner a)
189
+ `finally` uninterruptibleCancel a
190
+
191
+ withAsyncOn n action inner = mask $ \ restore -> do
192
+ a <- asyncOn n (restore action)
193
+ restore (inner a)
194
+ `finally` uninterruptibleCancel a
195
+
196
+
197
+ withAsyncWithUnmask action inner = mask $ \ restore -> do
198
+ a <- asyncWithUnmask action
199
+ restore (inner a)
200
+ `finally` uninterruptibleCancel a
201
+
202
+ withAsyncOnWithUnmask n action inner = mask $ \ restore -> do
203
+ a <- asyncOnWithUnmask n action
204
+ restore (inner a)
205
+ `finally` uninterruptibleCancel a
206
+
166
207
wait = atomically . waitSTM
167
208
poll = atomically . pollSTM
168
209
waitCatch = atomically . waitCatchSTM
@@ -202,6 +243,8 @@ class ( MonadSTM m
202
243
203
244
concurrently_ left right = void $ concurrently left right
204
245
246
+ compareAsyncs a b = asyncThreadId a `compare` asyncThreadId b
247
+
205
248
-- | Similar to 'Async.Concurrently' but which works for any 'MonadAsync'
206
249
-- instance.
207
250
--
@@ -265,8 +308,12 @@ instance MonadAsync IO where
265
308
type Async IO = Async. Async
266
309
267
310
async = Async. async
311
+ asyncBound = Async. asyncBound
312
+ asyncOn = Async. asyncOn
268
313
asyncThreadId = Async. asyncThreadId
269
314
withAsync = Async. withAsync
315
+ withAsyncBound = Async. withAsyncBound
316
+ withAsyncOn = Async. withAsyncOn
270
317
271
318
waitSTM = Async. waitSTM
272
319
pollSTM = Async. pollSTM
@@ -303,6 +350,11 @@ instance MonadAsync IO where
303
350
concurrently_ = Async. concurrently_
304
351
305
352
asyncWithUnmask = Async. asyncWithUnmask
353
+ asyncOnWithUnmask = Async. asyncOnWithUnmask
354
+ withAsyncWithUnmask = Async. withAsyncWithUnmask
355
+ withAsyncOnWithUnmask = Async. withAsyncOnWithUnmask
356
+
357
+ compareAsyncs = Async. compareAsyncs
306
358
307
359
308
360
--
@@ -410,15 +462,45 @@ instance ( MonadAsync m
410
462
asyncThreadId (WrappedAsync a) = asyncThreadId a
411
463
412
464
async (ReaderT ma) = ReaderT $ \ r -> WrappedAsync <$> async (ma r)
465
+ asyncBound (ReaderT ma) = ReaderT $ \ r -> WrappedAsync <$> asyncBound (ma r)
466
+ asyncOn n (ReaderT ma) = ReaderT $ \ r -> WrappedAsync <$> asyncOn n (ma r)
413
467
withAsync (ReaderT ma) f = ReaderT $ \ r -> withAsync (ma r)
414
468
$ \ a -> runReaderT (f (WrappedAsync a)) r
469
+ withAsyncBound (ReaderT ma) f = ReaderT $ \ r -> withAsyncBound (ma r)
470
+ $ \ a -> runReaderT (f (WrappedAsync a)) r
471
+ withAsyncOn n (ReaderT ma) f = ReaderT $ \ r -> withAsyncOn n (ma r)
472
+ $ \ a -> runReaderT (f (WrappedAsync a)) r
473
+
415
474
asyncWithUnmask f = ReaderT $ \ r -> fmap WrappedAsync
416
475
$ asyncWithUnmask
417
476
$ \ unmask -> runReaderT (f (liftF unmask)) r
418
477
where
419
478
liftF :: (m a -> m a ) -> ReaderT r m a -> ReaderT r m a
420
479
liftF g (ReaderT r) = ReaderT (g . r)
421
480
481
+ asyncOnWithUnmask n f = ReaderT $ \ r -> fmap WrappedAsync
482
+ $ asyncOnWithUnmask n
483
+ $ \ unmask -> runReaderT (f (liftF unmask)) r
484
+ where
485
+ liftF :: (m a -> m a ) -> ReaderT r m a -> ReaderT r m a
486
+ liftF g (ReaderT r) = ReaderT (g . r)
487
+
488
+ withAsyncWithUnmask action f =
489
+ ReaderT $ \ r -> withAsyncWithUnmask (\ unmask -> case action (liftF unmask) of
490
+ ReaderT ma -> ma r)
491
+ $ \ a -> runReaderT (f (WrappedAsync a)) r
492
+ where
493
+ liftF :: (m a -> m a ) -> ReaderT r m a -> ReaderT r m a
494
+ liftF g (ReaderT r) = ReaderT (g . r)
495
+
496
+ withAsyncOnWithUnmask n action f =
497
+ ReaderT $ \ r -> withAsyncOnWithUnmask n (\ unmask -> case action (liftF unmask) of
498
+ ReaderT ma -> ma r)
499
+ $ \ a -> runReaderT (f (WrappedAsync a)) r
500
+ where
501
+ liftF :: (m a -> m a ) -> ReaderT r m a -> ReaderT r m a
502
+ liftF g (ReaderT r) = ReaderT (g . r)
503
+
422
504
waitCatchSTM = WrappedSTM . waitCatchSTM . unWrapAsync
423
505
pollSTM = WrappedSTM . pollSTM . unWrapAsync
424
506
0 commit comments