Guest User

Untitled

a guest
Jan 23rd, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.62 KB | None | 0 0
  1. import qualified Control.Concurrent.MVar as IO
  2. import Control.Monad.IO.Control (MonadControlIO, controlIO)
  3. import Control.Exception.Control (mask, onException)
  4. import Control.Monad.IO.Class (liftIO)
  5.  
  6. modifyMVar :: MonadControlIO m => IO.MVar a -> (a -> m (a, b)) -> m b
  7. modifyMVar m io =
  8. mask $ \restore -> do
  9. a <- liftIO $ IO.takeMVar m
  10. (a',b) <- restore (io a) `onException` liftIO (IO.putMVar m a)
  11. liftIO $ IO.putMVar m a'
  12. return b
  13.  
  14. addMVarFinalizer :: MonadControlIO m => IO.MVar a -> m () -> m ()
  15. addMVarFinalizer m io = controlIO $ \inIO ->
  16. return $ liftIO $ IO.addMVarFinalizer m (inIO io >> return ())
Add Comment
Please, Sign In to add comment