diff --git a/src/Quasar/Observable.hs b/src/Quasar/Observable.hs index b686664a59d5f8ccb072807941b360be10cb3200..aeda1d4dc597a4db111e28a8bfc5e952af70ddac 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)