Skip to content
This repository has been archived by the owner on Jun 13, 2020. It is now read-only.

Latest commit

 

History

History
33 lines (24 loc) · 1.41 KB

e9a1b18c.md

File metadata and controls

33 lines (24 loc) · 1.41 KB
title date tags
Widget taking Dynamic and returning Event
2020-06-07
reflex

A common pattern in Reflex apps is that you write widgets which are rendered based on a Dynamic of some value (usually server-sent response), and then have the widget return an Event or some other value (eg: user button clicks).

documentEditor :: Dynamic t Document -> Event t (Id Document, Text)
documentEditor = 
  undefined

It is recommended to push the Dynamic to as deep as level as possible, where it actually gets used. So, if documentEditor is the place where it actually gets used, over there we would unpack the dynamic using the dyn function:

dyn :: (Adjustable t m, NotReady t m, PostBuild t m) => Dynamic t (m a) -> m (Event t a)

If we had a function Document -> m (Event t (Id Document, Text) that renders the document editor, along with returning the "save" event (of document ID and the user-entered text), then we can use dyn $ ffor ... to pass that input dynamic to it.

But in return we would get Event t (Event t (Id Document, Text)). How do we pull the final event out of it? This is where switchHold comes in handy.

switchHold :: (Reflex t, MonadHold t m) => Event t a -> Event t (Event t a) -> m (Event t a)

So for this particular pattern, it is common to call the widget using:

switchHold never <=< dyn $ ffor inputDyn $ \input -> do ...