diff --git a/src/Quasar/Observable.hs b/src/Quasar/Observable.hs index 939002fd9785ef284607d507685f3c571aa68c8d..549b838375a75fa17a035db3280568019653950f 100644 --- a/src/Quasar/Observable.hs +++ b/src/Quasar/Observable.hs @@ -22,6 +22,7 @@ module Quasar.Observable ( mergeObservable, joinObservable, bindObservable, + unsafeObservableIO, -- * Helper types ObservableCallback, @@ -303,6 +304,21 @@ constObservable :: v -> Observable v constObservable = Observable . ConstObservable +-- | Create an observable by simply running an IO action whenever a value is requested or a callback is registered. +-- +-- There is no mechanism to send more than one update, so the resulting `Observable` will only be correct in specific +-- situations. +unsafeObservableIO :: forall v. IO v -> Observable v +unsafeObservableIO action = synchronousFnObservable observeFn action + where + observeFn :: (ObservableMessage v -> IO ()) -> IO Disposable + observeFn callback = do + callback ObservableLoading + value <- (ObservableUpdate <$> action) `catchAll` (pure . ObservableNotAvailable @v) + callback value + pure noDisposable + + -- TODO implement --cacheObservable :: IsObservable v o => o -> Observable v --cacheObservable = undefined