diff --git a/src/Quasar/Disposable.hs b/src/Quasar/Disposable.hs index 9cb1777d4a35c6c689efd056d241566286e133b9..a8b0e41951a40da908f5f3e4ce56074c71fac84d 100644 --- a/src/Quasar/Disposable.hs +++ b/src/Quasar/Disposable.hs @@ -13,6 +13,8 @@ module Quasar.Disposable ( disposeEventually, withOnResourceManager, onResourceManager, + captureDisposable, + captureDisposable_, -- ** ResourceManager IsResourceManager(..), @@ -266,6 +268,21 @@ onResourceManager :: (IsResourceManager a) => a -> ReaderT ResourceManager m r - onResourceManager target action = runReaderT action (toResourceManager target) +captureDisposable :: MonadResourceManager m => m (Awaitable a) -> m (Task a) +captureDisposable action = do + -- TODO improve performance by only creating a new resource manager when two or more disposables are attached + resourceManager <- newResourceManager + awaitable <- localResourceManager resourceManager $ action + pure $ Task (toDisposable resourceManager) awaitable + +captureDisposable_ :: MonadResourceManager m => m () -> m Disposable +captureDisposable_ action = do + -- TODO improve performance by only creating a new resource manager when two or more disposables are attached + resourceManager <- newResourceManager + localResourceManager resourceManager action + pure $ toDisposable resourceManager + + data ResourceManager = ResourceManager { disposingVar :: TVar Bool,