From 4bc077d211611148713a1d18e68c06846eb2d498 Mon Sep 17 00:00:00 2001 From: Jens Nolte <git@queezle.net> Date: Mon, 30 Aug 2021 00:14:49 +0200 Subject: [PATCH] Generalize ObservableVar functions to MonadIO Co-authored-by: Jan Beinke <git@janbeinke.com> --- src/Quasar/Observable.hs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/Quasar/Observable.hs b/src/Quasar/Observable.hs index b686664..aeda1d4 100644 --- a/src/Quasar/Observable.hs +++ b/src/Quasar/Observable.hs @@ -105,7 +105,7 @@ class IsRetrievable v o => IsObservable v o | o -> v where unsafeAsyncObserveIO observable callback = do resourceManager <- unsafeNewResourceManager onResourceManager resourceManager do - asyncObserve observable (liftIO . callback) + asyncObserve_ observable (liftIO . callback) pure (toDisposable resourceManager) @@ -126,7 +126,7 @@ asyncObserve_ observable callback = async_ (observe observable callback) data ObserveWhileCompleted = ObserveWhileCompleted - deriving (Eq, Show) + deriving stock (Eq, Show) instance Exception ObserveWhileCompleted @@ -362,28 +362,31 @@ newObservableVar :: v -> IO (ObservableVar v) newObservableVar initialValue = do ObservableVar <$> newMVar (initialValue, HM.empty) -setObservableVar :: ObservableVar v -> v -> IO () -setObservableVar (ObservableVar mvar) value = modifyMVar_ mvar $ \(_, subscribers) -> do +setObservableVar :: MonadIO m => ObservableVar v -> v -> m () +setObservableVar (ObservableVar mvar) value = liftIO $ modifyMVar_ mvar $ \(_, subscribers) -> do mapM_ (\callback -> callback (pure value)) subscribers pure (value, subscribers) -modifyObservableVar :: ObservableVar v -> (v -> IO (v, a)) -> IO a +-- TODO change inner monad to `m` after reimplementing ObservableVar +modifyObservableVar :: MonadIO m => ObservableVar v -> (v -> IO (v, a)) -> m a modifyObservableVar (ObservableVar mvar) f = - modifyMVar mvar $ \(oldState, subscribers) -> do + liftIO $ modifyMVar mvar $ \(oldState, subscribers) -> do (newState, result) <- f oldState mapM_ (\callback -> callback (pure newState)) subscribers pure ((newState, subscribers), result) -modifyObservableVar_ :: ObservableVar v -> (v -> IO v) -> IO () +-- TODO change inner monad to `m` after reimplementing ObservableVar +modifyObservableVar_ :: MonadIO m => ObservableVar v -> (v -> IO v) -> m () modifyObservableVar_ (ObservableVar mvar) f = - modifyMVar_ mvar $ \(oldState, subscribers) -> do + liftIO $ modifyMVar_ mvar $ \(oldState, subscribers) -> do newState <- f oldState mapM_ (\callback -> callback (pure newState)) subscribers pure (newState, subscribers) -withObservableVar :: ObservableVar v -> (v -> IO a) -> IO a -withObservableVar (ObservableVar mvar) f = withMVar mvar (f . fst) +-- TODO change inner monad to `m` after reimplementing ObservableVar +withObservableVar :: MonadIO m => ObservableVar v -> (v -> IO a) -> m a +withObservableVar (ObservableVar mvar) f = liftIO $ withMVar mvar (f . fst) -- GitLab