packages feed

resourcet-extra 0.1.0 → 0.1.1

raw patch · 3 files changed

+47/−6 lines, 3 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Control.Monad.Trans.Resource.Extra: acquire1 :: ((forall x. IO x -> IO x) -> IO a) -> (a -> IO ()) -> Acquire a
+ Control.Monad.Trans.Resource.Extra: acquireType1 :: ((forall x. IO x -> IO x) -> IO a) -> (a -> ReleaseType -> IO ()) -> Acquire a
+ Control.Monad.Trans.Resource.Extra: unAcquire :: MonadIO m => Acquire a -> (forall x. IO x -> IO x) -> m (a, ReleaseType -> IO ())

Files

CHANGELOG.md view
@@ -1,3 +1,10 @@+# Version 0.1.1++* Add `acquire1`, `acquireType1`, `unAcquire`.++* Safer `mkAcquire1` and `mkAcquireType1` internals.++ # Version 0.1.0  * Fix `onceK`, `once`.
lib/Control/Monad/Trans/Resource/Extra.hs view
@@ -1,8 +1,11 @@ module Control.Monad.Trans.Resource.Extra    ( -- * Acquire-    mkAcquire1+    acquire1+   , acquireType1+   , mkAcquire1    , mkAcquireType1    , acquireReleaseSelf+   , unAcquire      -- * MonadResource    , registerType@@ -43,22 +46,53 @@  -------------------------------------------------------------------------------- +-- | Like 'A.mkAcquire1', but the acquire function is provided the current+-- 'Restore'-like function.+acquire1 :: ((forall x. IO x -> IO x) -> IO a) -> (a -> IO ()) -> A.Acquire a+acquire1 acq rel = acquireType1 acq \a _ -> rel a++-- | Like 'A.mkAcquireType1', but the acquire function is provided the current+-- 'Restore'-like function.+acquireType1+   :: ((forall x. IO x -> IO x) -> IO a)+   -> (a -> A.ReleaseType -> IO ())+   -> A.Acquire a+acquireType1 acq rel = A.Acquire \res -> do+   rel1 <- onceK $ uncurry rel+   a <- acq res+   pure $ A.Allocated a $ curry rel1 a+ -- | Like 'A.mkAcquire', but the release function will be run at most once.+-- Subsequent executions of the release function will be no-ops. mkAcquire1 :: IO a -> (a -> IO ()) -> A.Acquire a-mkAcquire1 m f = fst <$> A.mkAcquire ((,) <$> m <*> onceK f) \(a, g) -> g a+mkAcquire1 acq = acquire1 \_ -> acq  -- | Like 'A.mkAcquireType', but the release function will be run at most once.+-- Subsequent executions of the release function will be no-ops. mkAcquireType1 :: IO a -> (a -> A.ReleaseType -> IO ()) -> A.Acquire a-mkAcquireType1 m f = fmap fst do-   A.mkAcquireType ((,) <$> m <*> onceK (uncurry f)) \(a, g) t -> g (a, t)+mkAcquireType1 acq = acquireType1 \_ -> acq  -- | Build an 'A.Acquire' having access to its own release function.+--+-- The release function will be run at most once. Subsequent executions of+-- the release function will be no-ops. acquireReleaseSelf :: A.Acquire ((A.ReleaseType -> IO ()) -> a) -> A.Acquire a acquireReleaseSelf (A.Acquire f) = A.Acquire \restore -> do    A.Allocated g rel0 <- f restore    rel1 <- onceK rel0    pure $ A.Allocated (g rel1) rel1 +-- | Removes the 'A.Acquire' and 'A.Allocated' wrappers.+unAcquire+   :: (MonadIO m)+   => A.Acquire a+   -> (forall x. IO x -> IO x)+   -- ^ 'Restore'-like function.+   -> m (a, A.ReleaseType -> IO ())+unAcquire (A.Acquire f) restore = liftIO do+   A.Allocated a rel <- f restore+   pure (a, rel)+ --------------------------------------------------------------------------------  -- | Like 'R.runResourceT', but requires only 'Ex.MonadMask'.@@ -114,7 +148,7 @@ releaseType :: (MonadIO m) => R.ReleaseKey -> A.ReleaseType -> m () releaseType rk rt = liftIO $ maybe mempty ($ rt) =<< unprotectType rk --- Like 'R.unprotect', but allows specifying the 'A.ReleaseType' too.+-- | Like 'R.unprotect', but allows specifying the 'A.ReleaseType' too. unprotectType    :: (MonadIO m) => R.ReleaseKey -> m (Maybe (A.ReleaseType -> IO ())) unprotectType (R.ReleaseKey istate key) = liftIO do
resourcet-extra.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: resourcet-extra-version: 0.1.0+version: 0.1.1 license: BSD-3-Clause license-file: LICENSE extra-source-files: README.md CHANGELOG.md