From 28df26276191a85152153127a31a22b4c512cc57 Mon Sep 17 00:00:00 2001
From: Jens Nolte <git@queezle.net>
Date: Sat, 11 Sep 2021 01:35:08 +0200
Subject: [PATCH] Add documentation

---
 src/Quasar/Observable.hs | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/Quasar/Observable.hs b/src/Quasar/Observable.hs
index a20d946..6c1948c 100644
--- a/src/Quasar/Observable.hs
+++ b/src/Quasar/Observable.hs
@@ -80,6 +80,14 @@ retrieveIO :: IsRetrievable v a => a -> IO v
 retrieveIO x = withResourceManagerM $ await =<< retrieve x
 
 class IsRetrievable v o => IsObservable v o | o -> v where
+  -- | Register a callback to observe changes. The callback is called when the value changes, but depending on the
+  -- delivery method (e.g. network) intermediate values may be skipped.
+  --
+  -- A correct implementation of observe will call the callback during registration (if no value is available
+  -- immediately an `ObservableLoading` will be delivered).
+  --
+  -- The callback must return without blocking, otherwise other callbacks will be delayed. If the value can't be
+  -- processed immediately, use `observeBlocking` instead or manually pass the value e.g. by using STM.
   observe
     :: MonadResourceManager m
     => o -- ^ observable
@@ -91,6 +99,7 @@ class IsRetrievable v o => IsObservable v o | o -> v where
     disposable <- liftIO $ oldObserve observable (\msg -> runReaderT (await =<< callback msg) resourceManager)
     registerDisposable disposable
 
+  -- | Old signature of `observe`, will be removed from the class once it's no longer used for implementations.
   oldObserve :: o -> (ObservableMessage v -> IO ()) -> IO Disposable
   oldObserve observable callback = do
     resourceManager <- unsafeNewResourceManager
@@ -109,9 +118,14 @@ class IsRetrievable v o => IsObservable v o | o -> v where
 {-# DEPRECATED oldObserve "Old implementation of `observe`." #-}
 
 
--- | Observes an observable by handling updates on the current thread.
+-- | Observe an observable by handling updates on the current thread.
+--
+-- `observeBlocking` will run the handler whenever the observable changes (forever / until an exception is encountered).
+--
+-- The handler is allowed to block. When the value changes while the handler is running the handler will be run again
+-- after it completes; when the value changes multiple times it will only be executed once (with the latest value).
 observeBlocking :: (IsObservable v o, MonadResourceManager m) => o -> (ObservableMessage v -> m ()) -> m a
-observeBlocking observable callback = do
+observeBlocking observable handler = do
   withSubResourceManagerM do
     var <- liftIO newEmptyTMVarIO
     observe observable \msg -> do
-- 
GitLab