Skip to content
Snippets Groups Projects
Commit 4bc077d2 authored by Jens Nolte's avatar Jens Nolte
Browse files

Generalize ObservableVar functions to MonadIO


Co-authored-by: default avatarJan Beinke <git@janbeinke.com>
parent ee023fe0
No related branches found
No related tags found
No related merge requests found
Pipeline #2414 passed
...@@ -105,7 +105,7 @@ class IsRetrievable v o => IsObservable v o | o -> v where ...@@ -105,7 +105,7 @@ class IsRetrievable v o => IsObservable v o | o -> v where
unsafeAsyncObserveIO observable callback = do unsafeAsyncObserveIO observable callback = do
resourceManager <- unsafeNewResourceManager resourceManager <- unsafeNewResourceManager
onResourceManager resourceManager do onResourceManager resourceManager do
asyncObserve observable (liftIO . callback) asyncObserve_ observable (liftIO . callback)
pure (toDisposable resourceManager) pure (toDisposable resourceManager)
...@@ -126,7 +126,7 @@ asyncObserve_ observable callback = async_ (observe observable callback) ...@@ -126,7 +126,7 @@ asyncObserve_ observable callback = async_ (observe observable callback)
data ObserveWhileCompleted = ObserveWhileCompleted data ObserveWhileCompleted = ObserveWhileCompleted
deriving (Eq, Show) deriving stock (Eq, Show)
instance Exception ObserveWhileCompleted instance Exception ObserveWhileCompleted
...@@ -362,28 +362,31 @@ newObservableVar :: v -> IO (ObservableVar v) ...@@ -362,28 +362,31 @@ newObservableVar :: v -> IO (ObservableVar v)
newObservableVar initialValue = do newObservableVar initialValue = do
ObservableVar <$> newMVar (initialValue, HM.empty) ObservableVar <$> newMVar (initialValue, HM.empty)
setObservableVar :: ObservableVar v -> v -> IO () setObservableVar :: MonadIO m => ObservableVar v -> v -> m ()
setObservableVar (ObservableVar mvar) value = modifyMVar_ mvar $ \(_, subscribers) -> do setObservableVar (ObservableVar mvar) value = liftIO $ modifyMVar_ mvar $ \(_, subscribers) -> do
mapM_ (\callback -> callback (pure value)) subscribers mapM_ (\callback -> callback (pure value)) subscribers
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 = modifyObservableVar (ObservableVar mvar) f =
modifyMVar mvar $ \(oldState, subscribers) -> do liftIO $ modifyMVar mvar $ \(oldState, subscribers) -> do
(newState, result) <- f oldState (newState, result) <- f oldState
mapM_ (\callback -> callback (pure newState)) subscribers mapM_ (\callback -> callback (pure newState)) subscribers
pure ((newState, subscribers), result) 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 = modifyObservableVar_ (ObservableVar mvar) f =
modifyMVar_ mvar $ \(oldState, subscribers) -> do liftIO $ modifyMVar_ mvar $ \(oldState, subscribers) -> do
newState <- f oldState newState <- f oldState
mapM_ (\callback -> callback (pure newState)) subscribers mapM_ (\callback -> callback (pure newState)) subscribers
pure (newState, subscribers) pure (newState, subscribers)
withObservableVar :: ObservableVar v -> (v -> IO a) -> IO a -- TODO change inner monad to `m` after reimplementing ObservableVar
withObservableVar (ObservableVar mvar) f = withMVar mvar (f . fst) withObservableVar :: MonadIO m => ObservableVar v -> (v -> IO a) -> m a
withObservableVar (ObservableVar mvar) f = liftIO $ withMVar mvar (f . fst)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment