diff --git a/src/Quasar/ResourceManager.hs b/src/Quasar/ResourceManager.hs index 694399bbda6e83931a6272ec2e8aa2c5b7ac0b14..ed2a251a5e64e56b77717eb3190c2356096eb158 100644 --- a/src/Quasar/ResourceManager.hs +++ b/src/Quasar/ResourceManager.hs @@ -7,6 +7,7 @@ module Quasar.ResourceManager ( withSubResourceManagerM, onResourceManager, captureDisposable, + captureDisposable_, captureTask, -- ** ResourceManager @@ -148,19 +149,20 @@ onResourceManager :: (IsResourceManager a) => a -> ReaderT ResourceManager m r - onResourceManager target action = runReaderT action (toResourceManager target) -captureTask :: MonadResourceManager m => m (Awaitable a) -> m (Task a) -captureTask 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 :: MonadResourceManager m => m a -> m (a, 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 + result <- localResourceManager resourceManager action + pure $ (result, toDisposable resourceManager) + +captureDisposable_ :: MonadResourceManager m => m () -> m Disposable +captureDisposable_ = snd <<$>> captureDisposable + +captureTask :: MonadResourceManager m => m (Awaitable a) -> m (Task a) +captureTask action = do + (awaitable, disposable) <- captureDisposable action + pure $ Task disposable awaitable -- * ExceptionHandler