mirror of
https://github.com/barrucadu/dejafu.git
synced 2024-10-05 18:28:30 +03:00
Add interruptible to Control.Monad.Conc.Class
This commit is contained in:
parent
f2a9dec759
commit
bad607e9c3
@ -13,6 +13,7 @@ Added
|
||||
~~~~~
|
||||
|
||||
* (:issue:`316`) ``Control.Monad.Conc.Class.unsafeUnmask``.
|
||||
* ``Control.Monad.Conc.Class.interruptible``.
|
||||
|
||||
1.10.0.0 (2020-05-10)
|
||||
---------------------
|
||||
|
@ -72,6 +72,7 @@ module Control.Monad.Conc.Class
|
||||
, Ca.mask_
|
||||
, uninterruptibleMask
|
||||
, Ca.uninterruptibleMask_
|
||||
, interruptible
|
||||
|
||||
-- * Mutable State
|
||||
, newMVar
|
||||
@ -91,7 +92,7 @@ module Control.Monad.Conc.Class
|
||||
|
||||
-- for the class and utilities
|
||||
import Control.Exception (AsyncException(ThreadKilled),
|
||||
Exception, MaskingState,
|
||||
Exception, MaskingState(..),
|
||||
SomeException)
|
||||
import Control.Monad.Catch (MonadCatch, MonadMask,
|
||||
MonadThrow)
|
||||
@ -700,6 +701,21 @@ mask = Ca.mask
|
||||
uninterruptibleMask :: MonadConc m => ((forall a. m a -> m a) -> m b) -> m b
|
||||
uninterruptibleMask = Ca.uninterruptibleMask
|
||||
|
||||
-- | Allow asynchronous exceptions to be raised even inside 'mask',
|
||||
-- making the operation interruptible.
|
||||
--
|
||||
-- When called outside 'mask', or inside 'uninterruptibleMask', this
|
||||
-- function has no effect.
|
||||
--
|
||||
-- @since unreleased
|
||||
interruptible :: MonadConc m => m a -> m a
|
||||
interruptible act = do
|
||||
st <- getMaskingState
|
||||
case st of
|
||||
Unmasked -> act
|
||||
MaskedInterruptible -> unsafeUnmask act
|
||||
MaskedUninterruptible -> act
|
||||
|
||||
-- Mutable Variables
|
||||
|
||||
-- | Create a new @MVar@ containing a value.
|
||||
|
Loading…
Reference in New Issue
Block a user