diff --git a/src/Quasar/Observable.hs b/src/Quasar/Observable.hs index 549b838375a75fa17a035db3280568019653950f..a529e8a28d69e65e8071aea7b5f7c99c0cbdd1b9 100644 --- a/src/Quasar/Observable.hs +++ b/src/Quasar/Observable.hs @@ -40,6 +40,7 @@ import Quasar.Awaitable import Quasar.Core import Quasar.Disposable import Quasar.Prelude +import System.IO (fixIO) data ObservableMessage a @@ -81,10 +82,11 @@ class IsRetrievable v o => IsObservable v o | o -> v where mapObservable :: (v -> a) -> o -> Observable a mapObservable f = Observable . MappedObservable f --- TODO needs a name -- | A variant of `observe` that passes the `Disposable` to the callback. -observeWithDisposablePassedToTheCallback :: IsObservable v o => o -> (Disposable -> ObservableMessage v -> IO ()) -> IO Disposable -observeWithDisposablePassedToTheCallback observable callback = mfix $ \disposable -> observe observable (callback disposable) +-- +-- The disposable passed to the callback must not be used before `observeFixed` returns (otherwise an exception is thrown). +observeFixed :: IsObservable v o => o -> (Disposable -> ObservableMessage v -> IO ()) -> IO Disposable +observeFixed observable callback = fixIO $ \disposable -> observe observable (callback disposable) type ObservableCallback v = ObservableMessage v -> IO ()