From ca5e548e7c0eb51c3ef8ac8299396afc346bd4f6 Mon Sep 17 00:00:00 2001
From: Jens Nolte <git@queezle.net>
Date: Wed, 1 Sep 2021 00:14:55 +0200
Subject: [PATCH] Add captureDisposable

---
 src/Quasar/Disposable.hs | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/src/Quasar/Disposable.hs b/src/Quasar/Disposable.hs
index 9cb1777..a8b0e41 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,
-- 
GitLab