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 +7/−0
- lib/Control/Monad/Trans/Resource/Extra.hs +39/−5
- resourcet-extra.cabal +1/−1
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