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

Remove type aliases for Disposable

parent 41cc75b2
No related branches found
No related tags found
No related merge requests found
......@@ -6,8 +6,6 @@ module Qd.Observable (
IsObservable(..),
unsafeGetValue,
subscribe',
SubscriptionHandle,
RegistrationHandle,
IsSettable(..),
Disposable(..),
IsDisposable(..),
......@@ -68,9 +66,6 @@ type ObservableMessage v = (MessageReason, v)
mapObservableMessage :: Monad m => (a -> m b) -> ObservableMessage a -> m (ObservableMessage b)
mapObservableMessage f (r, s) = (r, ) <$> f s
type SubscriptionHandle = Disposable
type RegistrationHandle = Disposable
data Disposable
= forall a. IsDisposable a => SomeDisposable a
| FunctionDisposable (IO () -> IO ())
......@@ -126,7 +121,7 @@ class IsGettable v a | a -> v where
{-# MINIMAL getValue | getValue' #-}
class IsGettable v o => IsObservable v o | o -> v where
subscribe :: o -> (ObservableMessage v -> IO ()) -> IO SubscriptionHandle
subscribe :: o -> (ObservableMessage v -> IO ()) -> IO Disposable
toObservable :: o -> Observable v
toObservable = Observable
mapObservable :: (v -> a) -> o -> Observable a
......@@ -141,8 +136,8 @@ instance IsGettable a ((a -> IO ()) -> IO ()) where
unsafeGetValue :: (Exception e, IsObservable (Either e v) o) => o -> IO v
unsafeGetValue = either throw return <=< getValue
-- | A variant of `subscribe` that passes the `SubscriptionHandle` to the callback.
subscribe' :: IsObservable v o => o -> (SubscriptionHandle -> ObservableMessage v -> IO ()) -> IO SubscriptionHandle
-- | A variant of `subscribe` that passes the `Disposable` to the callback.
subscribe' :: IsObservable v o => o -> (Disposable -> ObservableMessage v -> IO ()) -> IO Disposable
subscribe' observable callback = mfix $ \subscription -> subscribe observable (callback subscription)
type ObservableCallback v = ObservableMessage v -> IO ()
......@@ -152,7 +147,7 @@ instance IsGettable v o => IsGettable v (IO o) where
getValue :: IO o -> IO v
getValue getGettable = getValue =<< getGettable
instance IsObservable v o => IsObservable v (IO o) where
subscribe :: IO o -> (ObservableMessage v -> IO ()) -> IO SubscriptionHandle
subscribe :: IO o -> (ObservableMessage v -> IO ()) -> IO Disposable
subscribe getObservable callback = do
observable <- getObservable
subscribe observable callback
......@@ -249,7 +244,7 @@ instance forall o i v. (IsGettable i o, IsGettable v i) => IsGettable v (JoinedO
getValue :: JoinedObservable o -> IO v
getValue (JoinedObservable outer) = getValue =<< getValue outer
instance forall o i v. (IsObservable i o, IsObservable v i) => IsObservable v (JoinedObservable o) where
subscribe :: (JoinedObservable o) -> (ObservableMessage v -> IO ()) -> IO SubscriptionHandle
subscribe :: (JoinedObservable o) -> (ObservableMessage v -> IO ()) -> IO Disposable
subscribe (JoinedObservable outer) callback = do
innerSubscriptionMVar <- newMVar DummyDisposable
outerSubscription <- subscribe outer (outerCallback innerSubscriptionMVar)
......@@ -319,7 +314,7 @@ mergeObservableMaybe merge x y = Observable $ MergedObservable (liftA2 merge) x
-- | Data type that can be used as an implementation for the `IsObservable` interface that works by directly providing functions for `getValue` and `subscribe`.
data FnObservable v = FnObservable {
getValueFn :: IO v,
subscribeFn :: (ObservableMessage v -> IO ()) -> IO SubscriptionHandle
subscribeFn :: (ObservableMessage v -> IO ()) -> IO Disposable
}
instance IsGettable v (FnObservable v) where
getValue o = getValueFn o
......
......@@ -28,12 +28,12 @@ instance (Eq k, Hashable k, Binary k, Binary v) => Binary (Delta k v) where
put (Delete key) = put (2 :: Word8) >> put key
class IsObservable (HM.HashMap k v) o => IsDeltaObservable k v o | o -> k, o -> v where
subscribeDelta :: o -> (Delta k v -> IO ()) -> IO SubscriptionHandle
subscribeDelta :: o -> (Delta k v -> IO ()) -> IO Disposable
--subscribeDeltaC :: o -> ConduitT () (Delta k v) IO ()
--subscribeDeltaC = undefined
--{-# MINIMAL subscribeDelta | subscribeDeltaC #-}
observeHashMapDefaultImpl :: forall k v o. (Eq k, Hashable k) => IsDeltaObservable k v o => o -> (HM.HashMap k v -> IO ()) -> IO SubscriptionHandle
observeHashMapDefaultImpl :: forall k v o. (Eq k, Hashable k) => IsDeltaObservable k v o => o -> (HM.HashMap k v -> IO ()) -> IO Disposable
observeHashMapDefaultImpl o callback = do
hashMapRef <- newIORef HM.empty
subscribeDelta o (deltaCallback hashMapRef)
......
......@@ -43,7 +43,7 @@ instance IsGettable (HM.HashMap k v) (ObservableHashMap k v) where
instance IsObservable (HM.HashMap k v) (ObservableHashMap k v) where
subscribe ohm callback = modifyHandle update ohm
where
update :: Handle k v -> IO (Handle k v, SubscriptionHandle)
update :: Handle k v -> IO (Handle k v, Disposable)
update handle = do
callback (Current, toHashMap handle)
unique <- newUnique
......@@ -57,7 +57,7 @@ instance IsObservable (HM.HashMap k v) (ObservableHashMap k v) where
instance IsDeltaObservable k v (ObservableHashMap k v) where
subscribeDelta ohm callback = modifyHandle update ohm
where
update :: Handle k v -> IO (Handle k v, SubscriptionHandle)
update :: Handle k v -> IO (Handle k v, Disposable)
update handle = do
callback (Reset $ toHashMap handle)
unique <- newUnique
......@@ -124,7 +124,7 @@ observeKey key ohm@(ObservableHashMap mvar) = Observable FnObservable{getValueFn
where
getValueFn :: IO (Maybe v)
getValueFn = join . preview (_keyHandles . at key . _Just . _value) <$> readMVar mvar
subscribeFn :: ((ObservableMessage (Maybe v) -> IO ()) -> IO SubscriptionHandle)
subscribeFn :: ((ObservableMessage (Maybe v) -> IO ()) -> IO Disposable)
subscribeFn callback = do
subscriptionKey <- newUnique
modifyKeyHandle_ (subscribeFn' subscriptionKey) key ohm
......
......@@ -60,8 +60,8 @@ currentValue :: Internals k v -> Maybe v
currentValue Internals{current} = (\(_, _, value) -> value) <$> current
-- | Insert a value with an assigned priority into the data structure. If the priority is higher than the current highest priority the value will become the current value (and will be sent to subscribers). Otherwise the value will be stored and will only become the current value when all values with a higher priority and all values with the same priority that have been inserted earlier have been removed.
-- Returns an `RegistrationHandle` that can be used to remove the value from the data structure.
insertValue :: forall p v. (Ord p, Hashable p) => ObservablePriority p v -> p -> v -> IO RegistrationHandle
-- Returns an `Disposable` that can be used to remove the value from the data structure.
insertValue :: forall p v. (Ord p, Hashable p) => ObservablePriority p v -> p -> v -> IO Disposable
insertValue (ObservablePriority mvar) priority value = modifyMVar mvar $ \internals -> do
key <- newUnique
newInternals <- insertValue' key internals
......
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