From 9e5b3c2b4a4ff58738f0d5e5c8b4ee84758c8f5c Mon Sep 17 00:00:00 2001 From: Jens Nolte <git@queezle.net> Date: Sun, 22 Aug 2021 23:11:25 +0200 Subject: [PATCH] Change resource manager api (for awaitable disposables) --- src/Quasar/Core.hs | 18 +++++++++--------- src/Quasar/Observable.hs | 30 ++++++++++++++++-------------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/Quasar/Core.hs b/src/Quasar/Core.hs index 08646c8..99d0892 100644 --- a/src/Quasar/Core.hs +++ b/src/Quasar/Core.hs @@ -33,7 +33,7 @@ module Quasar.Core ( synchronousDisposable, noDisposable, disposeEventually, - boundDisposable, + attachDisposable, attachDisposeAction, attachDisposeAction_, ) where @@ -283,8 +283,8 @@ instance IsDisposable EmptyDisposable where -newDisposable :: IO (Awaitable ()) -> IO Disposable -newDisposable = fmap (toDisposable . FnDisposable) . newTMVarIO . Left +newDisposable :: MonadIO m => IO (Awaitable ()) -> m Disposable +newDisposable = liftIO . fmap (toDisposable . FnDisposable) . newTMVarIO . Left synchronousDisposable :: IO () -> IO Disposable synchronousDisposable = newDisposable . fmap pure . liftIO @@ -303,15 +303,15 @@ disposeEventually _resourceManager disposable = liftIO $ do Just (Right ()) -> pure () Nothing -> undefined -- TODO register on resourceManager --- | Creates an `Disposable` that is bound to a ResourceManager. It will automatically be disposed when the resource manager is disposed. -boundDisposable :: HasResourceManager m => IO (Awaitable ()) -> m Disposable -boundDisposable action = do - resourceManager <- askResourceManager - attachDisposeAction resourceManager action +attachDisposable :: (IsDisposable a, MonadIO m) => ResourceManager -> a -> m () +attachDisposable _resourceManager disposable = undefined -- | Creates an `Disposable` that is bound to a ResourceManager. It will automatically be disposed when the resource manager is disposed. attachDisposeAction :: MonadIO m => ResourceManager -> IO (Awaitable ()) -> m Disposable -attachDisposeAction _resourceManager _action = liftIO undefined +attachDisposeAction resourceManager action = do + disposable <- newDisposable action + attachDisposable resourceManager disposable + pure disposable -- | Attaches a dispose action to a ResourceManager. It will automatically be run when the resource manager is disposed. attachDisposeAction_ :: MonadIO m => ResourceManager -> IO (Awaitable ()) -> m () diff --git a/src/Quasar/Observable.hs b/src/Quasar/Observable.hs index bd2eb26..d4e8d81 100644 --- a/src/Quasar/Observable.hs +++ b/src/Quasar/Observable.hs @@ -81,24 +81,26 @@ class IsRetrievable v o => IsObservable v o | o -> v where -- | Observe until the callback returns `False`. The callback will also be unsubscribed when the `ResourceManager` is disposed. observeWhile :: (IsObservable v o, HasResourceManager m) => o -> (ObservableMessage v -> IO Bool) -> m Disposable observeWhile observable callback = do - disposeVar <- liftIO $ newTVarIO False + --disposeVar <- liftIO $ newTVarIO False - innerDisposable <- liftIO $ observe observable \msg -> do - disposeRequested <- readTVarIO disposeVar - unless disposeRequested do - continue <- callback msg - unless continue $ atomically $ writeTVar disposeVar True + --innerDisposable <- liftIO $ observe observable \msg -> do + -- disposeRequested <- readTVarIO disposeVar + -- unless disposeRequested do + -- continue <- callback msg + -- unless continue $ atomically $ writeTVar disposeVar True - -- Bind the disposable to the ResourceManager, to prevent leaks if the `async` is disposed - disposable <- boundDisposable $ dispose innerDisposable + ---- Bind the disposable to the ResourceManager, to prevent leaks if the `async` is disposed + --disposable <- boundDisposable $ dispose innerDisposable - task <- async do - liftIO $ atomically do - disposeRequested <- readTVar disposeVar - unless disposeRequested retry - liftIO $ dispose disposable + --task <- async do + -- liftIO $ atomically do + -- disposeRequested <- readTVar disposeVar + -- unless disposeRequested retry + -- liftIO $ dispose disposable - pure (disposable <> (toDisposable task)) + --pure (disposable <> (toDisposable task)) + + undefined -- TODO reimplement after ResouceManager API is changed -- | Observe until the callback returns `False`. The callback will also be unsubscribed when the `ResourceManager` is disposed. -- GitLab