Final bikeshedding call: Fixing Control.Exception.bracket

Merijn Verstraaten merijn at inconsistent.nl
Thu Nov 13 07:47:17 UTC 2014


> On 12 Nov 2014, at 23:33, Bardur Arantsson <spam at scientician.net> wrote:
> 
> Is the code for this available for inspection somewhere? (I realize it
> might change based on the outcome of this "poll", but...)

There's no complete patch, but I believe the outline has been sketched before, anyway to repeat it. The current implementation of bracket is as follows:

bracket
        :: IO a
        -> (a -> IO b)
        -> (a -> IO c)
        -> IO c
bracket before after thing =
  mask $ \restore -> do
    a <- before
    r <- restore (thing a) `onException` after a
    _ <- after a
    return r

A new version would look like:

bracket before after thing =
  mask $ \restore -> do
    let atomicAfter = uninterruptibleMask . after
    a <- before
    r <- restore (thing a) `onException` atomicAfter a
    _ <- atomicAfter a
    return r

Slightly different versions are possible and the other relevant bracketing functions mentioned in this thread can be treated similarly.

Cheers,
Merijn


More information about the Libraries mailing list