Add interruptible to Control.Monad.Conc.Class

This commit is contained in:
Michael Walker 2020-05-14 13:32:28 +01:00
parent f2a9dec759
commit bad607e9c3
2 changed files with 18 additions and 1 deletions

View File

@ -13,6 +13,7 @@ Added
~~~~~
* (:issue:`316`) ``Control.Monad.Conc.Class.unsafeUnmask``.
* ``Control.Monad.Conc.Class.interruptible``.
1.10.0.0 (2020-05-10)
---------------------

View File

@ -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.