aboutsummaryrefslogtreecommitdiff
path: root/client/src/Model
diff options
context:
space:
mode:
authorJoris2019-10-20 21:31:57 +0200
committerJoris2019-10-20 21:31:57 +0200
commit602c52acfcfa494b07fec05c20b317b60ea8a6f3 (patch)
tree34fd9c44f82a83569822bc36eb2e0b04518e59f2 /client/src/Model
parent7aadcc97f9df0e2daccbe8a8726d8bc6c63d67f4 (diff)
Load init data per page with AJAX
Diffstat (limited to 'client/src/Model')
-rw-r--r--client/src/Model/Loadable.hs51
1 files changed, 51 insertions, 0 deletions
diff --git a/client/src/Model/Loadable.hs b/client/src/Model/Loadable.hs
new file mode 100644
index 0000000..3076b46
--- /dev/null
+++ b/client/src/Model/Loadable.hs
@@ -0,0 +1,51 @@
+module Model.Loadable
+ ( Loadable (..)
+ , fromEvent
+ , view
+ ) where
+
+import Reflex.Dom (MonadWidget)
+import qualified Reflex.Dom as R
+
+import Data.Functor (Functor)
+import Data.Text (Text)
+import Reflex.Dom (Dynamic, Event, MonadWidget)
+import qualified Reflex.Dom as R
+
+data Loadable t
+ = Loading
+ | Error Text
+ | Loaded t
+
+instance Functor Loadable where
+ fmap f Loading = Loading
+ fmap f (Error e) = Error e
+ fmap f (Loaded x) = Loaded (f x)
+
+instance Applicative Loadable where
+ pure x = Loaded x
+
+ Loading <*> _ = Loading
+ (Error e) <*> _ = Error e
+ (Loaded f) <*> Loading = Loading
+ (Loaded f) <*> (Error e) = Error e
+ (Loaded f) <*> (Loaded x) = Loaded (f x)
+
+instance Monad Loadable where
+ Loading >>= f = Loading
+ (Error e) >>= f = Error e
+ (Loaded x) >>= f = f x
+
+fromEvent :: forall t m a. MonadWidget t m => Event t (Either Text a) -> m (Dynamic t (Loadable a))
+fromEvent =
+ R.foldDyn
+ (\res _ -> case res of
+ Left err -> Error err
+ Right t -> Loaded t
+ )
+ Loading
+
+view :: forall t m a. MonadWidget t m => (a -> m ()) -> Loadable a -> m ()
+view _ (Loading) = R.divClass "pageSpinner" $ R.divClass "spinner" $ R.blank
+view _ (Error e) = R.text e
+view f (Loaded x) = f x