packages feed

lifted-base 0.1.0.2 → 0.1.0.3

raw patch · 2 files changed

+51/−35 lines, 2 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

Control/Concurrent/MVar/Lifted.hs view
@@ -1,4 +1,9 @@-{-# LANGUAGE CPP, UnicodeSyntax, NoImplicitPrelude, FlexibleContexts #-}+{-# LANGUAGE CPP+           , UnicodeSyntax+           , NoImplicitPrelude+           , FlexibleContexts+           , TupleSections+  #-}  {- | Module      :  Control.Concurrent.MVar.Lifted@@ -35,13 +40,22 @@ --------------------------------------------------------------------------------  -- from base:-import Data.Bool     ( Bool )+import Data.Bool     ( Bool(False, True) ) import Data.Function ( ($) )+import Data.Functor  ( fmap )+import Data.IORef    ( newIORef, readIORef, writeIORef ) import Data.Maybe    ( Maybe )-import Control.Monad ( return )+import Control.Monad ( return, when ) import System.IO     ( IO ) import           Control.Concurrent.MVar  ( MVar ) import qualified Control.Concurrent.MVar as MVar+import Control.Exception ( onException+#if MIN_VERSION_base(4,3,0)+                         , mask, mask_+#else+                         , block, unblock+#endif+                         )  #if __GLASGOW_HASKELL__ < 700 import Control.Monad ( (>>=), (>>), fail )@@ -54,16 +68,11 @@ import Control.Monad.Base ( MonadBase, liftBase )  -- from monad-control:-import Control.Monad.Trans.Control ( MonadBaseControl, liftBaseOp, liftBaseDiscard )---- from lifted-base (this package):-import Control.Exception.Lifted ( onException-#if MIN_VERSION_base(4,3,0)-                                , mask-#else-                                , block, unblock-#endif-                                )+import Control.Monad.Trans.Control ( MonadBaseControl+                                   , control+                                   , liftBaseOp+                                   , liftBaseDiscard+                                   )  #include "inlinable.h" @@ -123,34 +132,41 @@  -- | Generalized version of 'MVar.modifyMVar_'. modifyMVar_ ∷ (MonadBaseControl IO m, MonadBase IO m) ⇒ MVar α → (α → m α) → m ()+modifyMVar_ mv = modifyMVar mv ∘ (fmap (, ()) ∘)+{-# INLINABLE modifyMVar_ #-}  -- | Generalized version of 'MVar.modifyMVar'. modifyMVar ∷ (MonadBaseControl IO m, MonadBase IO m) ⇒ MVar α → (α → m (α, β)) → m β  #if MIN_VERSION_base(4,3,0)-modifyMVar_ mv f = mask $ \restore → do-                     x  ← takeMVar mv-                     x' ← restore (f x) `onException` putMVar mv x-                     putMVar mv x'--modifyMVar mv f = mask $ \restore → do-                    x       ← takeMVar mv-                    (x', y) ← restore (f x) `onException` putMVar mv x-                    putMVar mv x'-                    return y+modifyMVar mv f = control $ \runInIO -> mask $ \restore → do+    aborted ← newIORef True+    let f' x = do+        (x', a) ← f x+        liftBase $ mask_ $ do+          writeIORef aborted False+          MVar.putMVar mv x'+        return a+    x ← MVar.takeMVar mv+    stM ← restore (runInIO (f' x)) `onException` MVar.putMVar mv x+    abort ← readIORef aborted+    when abort $ MVar.putMVar mv x+    return stM #else-modifyMVar_ mv f = block $ do-                     x  ← takeMVar mv-                     x' ← unblock (f x) `onException` putMVar mv x-                     putMVar mv x'--modifyMVar mv f = block $ do-                    x       ← takeMVar mv-                    (x', y) ← unblock (f x) `onException` putMVar mv x-                    putMVar mv x'-                    return y+modifyMVar mv f = control $ \runInIO -> block $ do+    aborted ← newIORef True+    let f' x = do+        (x', a) ← f x+        liftBase $ block $ do+          writeIORef aborted False+          MVar.putMVar mv x'+        return a+    x ← MVar.takeMVar mv+    stM ← unblock (runInIO (f' x)) `onException` MVar.putMVar mv x+    abort ← readIORef aborted+    when abort $ MVar.putMVar mv x+    return stM #endif-{-# INLINABLE modifyMVar_ #-} {-# INLINABLE modifyMVar #-}  -- | Generalized version of 'MVar.addMVarFinalizer'.
lifted-base.cabal view
@@ -1,5 +1,5 @@ Name:                lifted-base-Version:             0.1.0.2+Version:             0.1.0.3 Synopsis:            lifted IO operations from the base library License:             BSD3 License-file:        LICENSE