diff --git a/src/lib/Qd/Observable.hs b/src/lib/Qd/Observable.hs index 41c3103ad17ede70cab062be0e97344baaef4c0e..947ea32f5aafd96c93fc14ca147a8f57eb0bc076 100644 --- a/src/lib/Qd/Observable.hs +++ b/src/lib/Qd/Observable.hs @@ -5,13 +5,13 @@ module Qd.Observable ( Observable(..), subscribe', SubscriptionHandle(..), - Callback, RegistrationHandle(..), + ObservableCallback, ObservableState, ObservableMessage, MessageReason(..), BasicObservable, - mkBasicObservable, + createBasicObservable, setBasicObservable, updateBasicObservable, joinObservable, @@ -52,7 +52,7 @@ class Observable v o | o -> v where subscribe' :: Observable v o => o -> (SubscriptionHandle -> ObservableMessage v -> IO ()) -> IO SubscriptionHandle subscribe' observable callback = mfix $ \subscription -> subscribe observable (callback subscription) -type Callback v = ObservableMessage v -> IO () +type ObservableCallback v = ObservableMessage v -> IO () -- | Existential quantification wrapper for the Observable type class. @@ -74,7 +74,7 @@ instance Observable v (MappedObservable v) where mapObservable f1 (MappedObservable f2 upstream) = SomeObservable $ MappedObservable (f1 <=< f2) upstream -newtype BasicObservable v = BasicObservable (MVar (ObservableState v, HM.HashMap Unique (Callback v))) +newtype BasicObservable v = BasicObservable (MVar (ObservableState v, HM.HashMap Unique (ObservableCallback v))) instance Observable v (BasicObservable v) where getValue (BasicObservable mvar) = fst <$> readMVar mvar subscribe (BasicObservable mvar) callback = do @@ -88,16 +88,15 @@ instance Observable v (BasicObservable v) where unsubscribe' :: Unique -> IO () unsubscribe' key = modifyMVar_ mvar $ \(state, subscribers) -> return (state, HM.delete key subscribers) -mkBasicObservable :: Maybe v -> IO (BasicObservable v) -mkBasicObservable defaultValue = do +createBasicObservable :: Maybe v -> IO (BasicObservable v) +createBasicObservable defaultValue = do BasicObservable <$> newMVar (defaultValue, HM.empty) -setBasicObservable :: BasicObservable v -> v -> IO () +setBasicObservable :: BasicObservable v -> ObservableState v -> IO () setBasicObservable (BasicObservable mvar) value = do modifyMVar_ mvar $ \(_, subscribers) -> do - let newState = Just value - mapM_ (\callback -> callback (Update, newState)) subscribers - return (newState, subscribers) + mapM_ (\callback -> callback (Update, value)) subscribers + return (value, subscribers) updateBasicObservable :: BasicObservable v -> (v -> v) -> IO () updateBasicObservable (BasicObservable mvar) f =