diff --git a/src/Quasar/Resources.hs b/src/Quasar/Resources.hs index 32c1ef1c90d165162e198afd7b84f3ba89221df9..f6d777dfb7971739704066bf26951e87a37c5478 100644 --- a/src/Quasar/Resources.hs +++ b/src/Quasar/Resources.hs @@ -12,6 +12,8 @@ module Quasar.Resources ( registerDisposeTransaction, disposeEventually, disposeEventually_, + captureResources, + captureResources_, -- * STM disposeEventuallySTM, @@ -96,3 +98,14 @@ disposeEventually res = ensureSTM $ disposeEventuallySTM res disposeEventually_ :: (Resource r, MonadQuasar m) => r -> m () disposeEventually_ res = ensureSTM $ disposeEventuallySTM_ res + + +captureResources :: MonadQuasar m => m a -> m (a, Disposer) +captureResources fn = do + quasar <- newQuasar + localQuasar quasar do + result <- fn + pure (result, getDisposer (quasarResourceManager quasar)) + +captureResources_ :: MonadQuasar m => m () -> m Disposer +captureResources_ fn = snd <$> captureResources fn