@@ -28,33 +28,33 @@ Since MonadWidget depends on MonadHold and MonadHold depends on MonadSample, any
2828
2929```haskell
3030-- Trivial Event
31−[ ] never :: Event a
31+[ ] never :: Event a
3232
3333-- Extract Event from Dynamic
3434[ ] updated :: Dynamic a -> Event a
3535
3636-- Transform Event to Event using function
37−[ ] fmap :: (a -> b) -> Event a -> Event b
38−[ ] fmapMaybe :: (a -> Maybe b) -> Event a -> Event b
39−[ ] ffor :: Event a -> (a -> b) -> Event b
40−[ ] fforMaybe :: Event a -> (a -> Maybe b) -> Event b
41−[ ] ffilter :: (a -> Bool) -> Event a -> Event a
37+[ ] fmap :: (a -> b) -> Event a -> Event b
38+[ ] fmapMaybe :: (a -> Maybe b) -> Event a -> Event b
39+[ ] ffilter :: (a -> Bool) -> Event a -> Event a
40+[ ] ffor :: Event a -> (a -> b) -> Event b
41+[ ] fforMaybe :: Event a -> (a -> Maybe b) -> Event b
4242[ ] splitE :: Event (a, b) -> (Event a, Event b)
4343
4444-- Event to identical Event with debug trace.
45−[ ] traceEvent :: Show a => String -> Event a -> Event a
46−[ ] traceEventWith :: (a -> String) -> Event a -> Event a
45+[ ] traceEvent :: Show a => String -> Event a -> Event a
46+[ ] traceEventWith :: (a -> String) -> Event a -> Event a
4747
4848-- Transform Event to Event by sampling Behavior or Dynamic
49−[ ] tag :: Behavior b -> Event a -> Event b
50−[ ] tagDyn :: Dynamic a -> Event b -> Event a
51−[ ] gate :: Behavior Bool -> Event a -> Event a
52−[ ] attach :: Behavior a -> Event b -> Event (a, b)
53−[ ] attachDyn :: Dynamic a -> Event b -> Event (a, b)
54−[ ] attachWith :: (a -> b -> c) -> Behavior a -> Event b -> Event c
55−[ ] attachDynWith :: (a -> b -> c) -> Dynamic a -> Event b -> Event c
56−[ ] attachWithMaybe :: (a -> b -> Maybe c) -> Behavior a -> Event b -> Event c
57−[ ] attachDynWithMaybe :: (a -> b -> Maybe c) -> Dynamic a -> Event b -> Event c
49+[ ] gate :: Behavior Bool -> Event a -> Event a
50+[ ] tag :: Behavior a -> Event b -> Event a
51+[ ] tagDyn :: Dynamic a -> Event b -> Event a
52+[ ] attach :: Behavior a -> Event b -> Event (a, b)
53+[ ] attachDyn :: Dynamic a -> Event b -> Event (a, b)
54+[ ] attachWith :: (a -> b -> c) -> Behavior a -> Event b -> Event c
55+[ ] attachDynWith :: (a -> b -> c) -> Dynamic a -> Event b -> Event c
56+[ ] attachWithMaybe :: (a -> b -> Maybe c) -> Behavior a -> Event b -> Event c
57+[ ] attachDynWithMaybe :: (a -> b -> Maybe c) -> Dynamic a -> Event b -> Event c
5858
5959-- Combine multiple Events
6060[ ] <> :: Monoid a => Event a -> Event a -> Event a
@@ -65,18 +65,18 @@ Since MonadWidget depends on MonadHold and MonadHold depends on MonadSample, any
6565[ ] mergeMap :: Ord k => Map k (Event a) -> Event (Map k a)
6666
6767-- Efficient one-to-many fanout
68−[ ] fan :: GCompare k => Event (DMap k) -> EventSelector k
69−[ ] fanMap :: Ord k => Event (Map k a) -> EventSelector (Const2 k a)
70−[ ] select :: EventSelector k -> k a -> Event a
68+[ ] fanMap :: Ord k => Event (Map k a) -> EventSelector (Const2 k a)
69+[ ] fan :: GCompare k => Event (DMap k) -> EventSelector k
70+[ ] select :: EventSelector k -> k a -> Event a
7171
7272-- Event to Event via monadic function
73−[ ] push :: (a -> m (Maybe b)) -> Event a -> Event b
74−[ ] pushAlways :: (a -> m b) -> Event a -> Event b
73+[ ] push :: (a -> m (Maybe b)) -> Event a -> Event b
74+[ ] pushAlways :: (a -> m b ) -> Event a -> Event b
7575 -- Note supplied function operates in [H] context
7676
7777-- Event to monadic Event
78−[H] headE :: Event a -> m (Event a)
79−[H] tailE :: Event a -> m (Event a)
78+[H] headE :: Event a -> m (Event a)
79+[H] tailE :: Event a -> m (Event a)
8080[H] headTailE :: Event a -> m (Event a, Event a)
8181```
8282
@@ -86,63 +86,69 @@ These functions flatten Event-of-Event, Behavior-of-Event, or Dynamic-of-Event i
8686
8787```haskell
8888-- Flatten Event-of-Event to monadic Event. New Event is used immediately.
89−[H] switchPromptly :: Event a -> Event (Event a) -> m (Event a)
89+[H] switchPromptly :: Event a -> Event (Event a) -> m (Event a)
9090
9191-- Flatten Behavior-of-Event to Event. Old Event is used during switchover.
92−[ ] switch :: Behavior (Event a) -> Event a
92+[ ] switch :: Behavior (Event a) -> Event a
9393
9494-- Flatten Dyanmic-of-Event to Event. New Event is used immediately.
95−[ ] switchPromptlyDyn :: Dynamic (Event a) -> Event a
95+[ ] switchPromptlyDyn :: Dynamic (Event a) -> Event a
9696
9797-- Flatten Event-of-Event to Event that fires when both wrapper and new Event fire.
98−[ ] coincidence :: Event (Event a) -> Event a
98+[ ] coincidence :: Event (Event a) -> Event a
99+
100+-- Flatten Dynamic-of-Dynamic to Dynamic. New Dynamic is used immediately.
101+-- Output updated whenever inner or outer Dynamic updates.
102+[ ] joinDyn :: Dynamic (Dynamic a) -> Dynamic a
103+[ ] joinDynThroughMap :: Ord k => Dynamic (Map k (Dynamic a)) -> Dynamic (Map k a)
104+
105+-- Flatten Event-of-Behavior to monadic Behavior
106+[H] switcher :: Behavior a -> Event (Behavior a) -> m (Behavior a)
99107```
100108
101109### Functions producing Behavior
102110
103111```haskell
104112-- Trivial Behavior
105−[ ] constant :: a -> Behavior a
113+[ ] constant :: a -> Behavior a
106114
107115-- Extract Behavior from Dynamic
108−[ ] current :: Dynamic a -> Behavior a
116+[ ] current :: Dynamic a -> Behavior a
117+
118+-- Event to monadic Behavior
119+[H] hold :: a -> Event a -> m (Behavior a)
109120
110121-- Transform Behavior to Behavior using function
111−[ ] fmap :: (a -> b) -> Behavior a -> Behavior b
112−[ ] ffor :: Behavior a -> (a -> b) -> Behavior b
122+[ ] fmap :: (a -> b) -> Behavior a -> Behavior b
123+[ ] ffor :: Behavior a -> (a -> b) -> Behavior b
113124[ ] <*> :: Behavior (a -> b) -> Behavior a -> Behavior b
114125[ ] >>= :: Behavior a -> (a -> Behavior b) -> Behavior b
115126[ ] <> :: Monoid a => Behavior a -> Behavior a -> Behavior a
127+-- ... plus many more due to typeclass membership
116128
117129-- Behavior to Behavior via monadic value
118130[S] sample :: Behavior a -> m a
119−[ ] pull :: m a -> Behavior a
131+[ ] pull :: m a -> Behavior a
120132 -- Note supplied value is in [S] context
121−
122−-- Event to monadic Behavior
123−[H] hold :: a -> Event a -> m (Behavior a)
124−
125−-- Flatten Event-of-Behavior to monadic Behavior
126−[H] switcher :: Behavior a -> Event (Behavior a) -> m (Behavior a)
127133```
128134
129135### Functions producing Dynamic
130136
131137```haskell
132138-- Trivial Dynamic
133−[ ] constDyn :: a -> Dynamic a
139+[ ] constDyn :: a -> Dynamic a
134140
135141-- Construct Dynamic from Event
136−[H] holdDyn :: a -> Event a -> m (Dynamic a)
137−[H] foldDyn :: (a -> b -> b) -> b -> Event a -> m (Dynamic b)
142+[H] holdDyn :: a -> Event a -> m (Dynamic a)
143+[H] foldDyn :: (a -> b -> b) -> b -> Event a -> m (Dynamic b)
138144[H] foldDynM :: (a -> b -> m' b) -> b -> Event a -> m (Dynamic b)
139145 -- Note supplied function operates in [H] context
140146[H] count :: Num b => Event a -> m (Dynamic b)
141147[H] toggle :: Bool -> Event a -> m (Dynamic Bool)
142148
143149-- Transform Dynamic to Dynamic using function
144−[H] mapDyn :: (a -> b) -> Dynamic a -> m (Dynamic b)
145−[H] forDyn :: Dynamic a -> (a -> b) -> m (Dynamic b)
150+[H] forDyn :: Dynamic a -> (a -> b) -> m (Dynamic b)
151+[H] mapDyn :: (a -> b) -> Dynamic a -> m (Dynamic b)
146152[H] mapDynM :: (a -> m' b) -> Dynamic a -> m (Dynamic b)
147153 -- Note supplied function runs in [S] context
148154[H] splitDyn :: Dynamic (a, b) -> m (Dynamic a, Dynamic b)
@@ -153,20 +159,15 @@ These functions flatten Event-of-Event, Behavior-of-Event, or Dynamic-of-Event i
153159[H] combineDyn :: (a -> b -> c) -> Dynamic a -> Dynamic b -> m (Dynamic c)
154160
155161-- Efficient one-to-many fanout
156−[ ] demux :: Ord k => Dynamic k -> Demux k
157−[H] getDemuxed :: Eq k => Demux k -> k -> m (Dynamic Bool)
162+[ ] demux :: Ord k => Dynamic k -> Demux k
163+[H] getDemuxed :: Eq k => Demux k -> k -> m (Dynamic Bool)
158164
159165-- Dynamic to Dynamic, removing updates w/o value change
160166[ ] nubDyn :: Eq a => Dynamic a -> Dynamic a
161167
162168-- Dynamic to identical Dynamic with debug trace.
163−[ ] traceDyn :: Show a => String -> Dynamic a -> Dynamic a
164−[ ] traceDynWith :: (a -> String) -> Dynamic a -> Dynamic a
165−
166−-- Flatten Dynamic-of-Dynamic to Dynamic. New Dynamic is used immediately.
167−-- Output updated whenever inner or outer Dynamic updates.
168−[ ] joinDyn :: Dynamic (Dynamic a) -> Dynamic a
169−[ ] joinDynThroughMap :: Ord k => Dynamic (Map k (Dynamic a)) -> Dynamic (Map k a)
169+[ ] traceDyn :: Show a => String -> Dynamic a -> Dynamic a
170+[ ] traceDynWith :: (a -> String) -> Dynamic a -> Dynamic a
170171```
171172
172173## Reflex-Dom
@@ -182,37 +183,37 @@ Widgets may return any type (this is 'a' in many of the functions below). Often
182183```haskell
183184-- Simplest form. Create a widget of given type containing the given child.
184185-- Return whatever the child returns.
185−[W] el :: String -> m a -> m a
186+[W] el :: String -> m a -> m a
186187
187188-- This version returns the 'El' as well.
188−[W] el' :: String -> m a -> m (El, a)
189+[W] el' :: String -> m a -> m (El, a)
189190
190−-- These two additionaly apply attributes to the element, such as ("class" =: "blah")
191−[W] elAttr :: String -> Map String String -> m a -> m a
192−[W] elAttr' :: String -> Map String String -> m a -> m (El, a)
191+-- These two additionally apply attributes to the element, such as ("class" =: "blah")
192+[W] elAttr :: String -> Map String String -> m a -> m a
193+[W] elAttr' :: String -> Map String String -> m a -> m (El, a)
193194
194195-- As above, but now the attribute map is Dynamic
195−[W] elDynAttr :: String -> Dynamic (Map String String) -> m a -> m a
196+[W] elDynAttr :: String -> Dynamic (Map String String) -> m a -> m a
196197[W] elDynAttr' :: String -> Dynamic (Map String String) -> m a -> m (El, a)
197198
198199-- Shortcut for elAttr when you only want to set the "class" attribute.
199−[W] elClass :: String -> String -> m a -> m a
200+[W] elClass :: String -> String -> m a -> m a
200201
201202-- Even shorter-cut for above when element type is "div". Create a div of given class.
202−[W] divClass :: String -> m a -> m a
203+[W] divClass :: String -> m a -> m a
203204
204205-- Create a widget of given type with arbitrary, Dymamic HTML inside.
205−[W] elDynHtml' :: String -> Dynamic String -> m El
206+[W] elDynHtml' :: String -> Dynamic String -> m El
206207[W] elDynHtmlAttr' :: String -> Map String String -> Dynamic String -> m El
207208
208209-- Shortcut for elDynHtml' where the type is "div" and you don't need the 'El'.
209−[W] dynHtml :: Dynamic String -> m ()
210+[W] dynHtml :: Dynamic String -> m ()
210211
211212-- Create a static text element
212−[W] text :: String -> m ()
213+[W] text :: String -> m ()
213214
214215-- Create a dynamic text element
215−[W] dynText :: Dynamic String -> m ()
216+[W] dynText :: Dynamic String -> m ()
216217[W] display :: Show a => Dynamic a -> m ()
217218
218219-- Create a "button" element with given label, return onClick Event
@@ -229,37 +230,46 @@ In the Dynamic cases above, the *content* of a widget is dynamic but the *defini
229230Note the "list" functions do not imply particular HTML tags (ul, li, etc), though the widgets they create can have those tags if you construct them appropriately.
230231
231232```haskell
232−-- Given a Dynamic of widget-creating actions, create a widget that is redefined whenever the Dynamic updates.
233−-- The returned Event of widget results occurs when the Dynamic does. Note that if type 'a' is an Event, the
234−-- return value is an Event-of-Events that would typically be flattened.
235−[W] dyn :: Dynamic (m a) -> m (Event a)
233+-- Given a Dynamic of widget-creating actions, create a widget that is redefined
234+-- whenever the Dynamic updates. The returned Event of widget results occurs when
235+-- the Dynamic does. Note that if type 'a' is an Event, the return value is an
236+-- Event-of-Events that would typically be flattened.
237+[W] dyn :: Dynamic (m a) -> m (Event a)
236238
237239-- Same as dyn, but takes initial value and an update Event instead of a Dynamic.
238−[W] widgetHold :: m a -> Event (m a) -> m (Dynamic a)
240+[W] widgetHold :: m a -> Event (m a) -> m (Dynamic a)
239241
240242-- Given a Dynamic key/value map and a function to create a widget for a given
241243-- key & Dynamic value, create a bunch of widgets. Widgets will be created,
242244-- destroyed, and updated appropriately as the map changes. Returns Dynamic map
243245-- from keys to widget results.
244−[W] listWithKey :: Ord k => Dynamic (Map k v) -> (k -> Dynamic v -> m a) -> m (Dynamic (Map k a))
246+[W] listWithKey :: Ord k =>
247+ Dynamic (Map k v) -> (k -> Dynamic v -> m a ) -> m (Dynamic (Map k a))
245248
246249-- Same as above where the widget constructor doesn't care about the key.
247−[W] list :: Ord k => Dynamic (Map k v) -> (Dynamic v -> m a) -> m (Dynamic (Map k a))
250+[W] list :: Ord k =>
251+ Dynamic (Map k v) -> ( Dynamic v -> m a ) -> m (Dynamic (Map k a))
248252
249253-- Even simpler version where there are no keys and we just use a list.
250−[W] simpleList :: Dynamic [v] -> (Dynamic v -> m a) -> m (Dynamic [a])
254+[W] simpleList ::
255+ Dynamic [v] -> ( Dynamic v -> m a ) -> m (Dynamic [a])
256+
257+-- Like listWithKey specialized for widgets returning (Event a). listWithKey would
258+-- return 'Dynamic (Map k (Event a))' in this scenario, but listViewWithKey flattens
259+-- this to 'Event (Map k a)' via 'switch'.
260+[W] listViewWithKey :: Ord k =>
261+ Dynamic (Map k v) -> (k -> Dynamic v -> m (Event a)) -> m (Event (Map k a))
262+
263+-- As above, but there is a "current key", and the widget constructor gets a
264+-- Dynamic Bool indicating if that widget is currently selected. The returned
265+-- Event fires when any of the widgets' returned Events fire, and returns the key
266+-- of an arbitrary firing widget.
267+[W] selectViewListWithKey_ :: Ord k => Dynamic k ->
268+ Dynamic (Map k v) -> (k -> Dynamic v -> Dynamic Bool -> m (Event a)) -> m (Event k)
251269
252270-- Same as listWithKey, but takes initial values and an updates Event instead of a Dynamic.
253−[W] listWithKey' :: Ord k => Map k v -> Event (Map k (Maybe v)) -> (k -> v -> Event v -> m a) -> m (Dynamic (Map k a))
254−
255−-- Like listWithKey specialized for widgets returning (Event a). listWithKey would return 'Dynamic (Map k (Event a))'
256−-- in this scenario, but listViewWithKey flattens this to 'Event (Map k a)' via 'switch'.
257−[W] listViewWithKey :: Ord k => Dynamic (Map k v) -> (k -> Dynamic v -> m (Event a)) -> m (Event (Map k a))
258−
259−-- As above, but there is a "current key", and the widget constructor gets a Dynamic Bool indicating if that widget
260−-- is currently selected. The returned Event fires when any of the widgets' returned Events fire, and returns the key
261−-- of an arbitrary firing widget.
262−[W] selectViewListWithKey_ :: Ord k => Dynamic k -> Dynamic (Map k v) -> (k -> Dynamic v -> Dynamic Bool -> m (Event a)) -> m (Event k)
271+[W] listWithKey' :: Ord k =>
272+ Map k v -> Event (Map k (Maybe v)) -> (k -> v -> Event v -> m a) -> m (Dynamic (Map k a))
263273
264274-- tableDynAttr
265275-- tabDisplay
@@ -272,32 +282,39 @@ Note the "list" functions do not imply particular HTML tags (ul, li, etc), thoug
272282#### Connecting to DOM events
273283
274284```haskell
275−-- Extract the specified Event from an 'El'. The allowable event names, and their corresponding
276−-- data types, are listed in Reflex/Dom/Widget/Basic.hs
285+-- Extract the specified Event from an 'El'. The allowable event names, and their
286+-- corresponding data types, are listed in Reflex/Dom/Widget/Basic.hs
277287[ ] domEvent :: EventName en -> El -> Event (EventResultType en)
278288```
279289
280290#### Performing arbitrary I/O in response to Events
281291
282292```haskell
283−-- Run side-effecting actions in Event when it occurs; returned Event contains results.
284−-- Side effects run in (WidgetHost m) monad, which includes [S] and [H] and can also do I/O via liftIO
285−[W] performEvent :: Event (WidgetHost m a) -> m (Event a)
293+-- Run side-effecting actions in Event when it occurs; returned Event contains
294+-- results. Side effects run in (WidgetHost m) monad, which includes [S] and [H]
295+-- and can also do I/O via liftIO
296+[W] performEvent :: Event ( WidgetHost m a) -> m (Event a)
286297
287298-- Just run side-effects; no return Event
288−[W] performEvent_ :: Event (WidgetHost m ()) -> m ()
299+[W] performEvent_ :: Event ( WidgetHost m ()) -> m ()
289300
290−-- Actions are run asynchronously; each action is given a callback to call when it completes
301+-- Actions run asynchronously; actions are given a callback to send return values
291302[W] performEventAsync :: Event ((a -> IO ()) -> WidgetHost m ()) -> m (Event a)
292303```
293304
294305### Startup
295306
296307```haskell
297−-- Reflex-Dom entry point. Takes a monadic widget-building action of lengthy type and turns it into an IO action.
298−[I] mainWidget :: Widget Spider (Gui Spider (WithWebView SpiderHost) (HostFrame Spider)) () -> IO ()
299−[I] mainWidgetWithHead :: Widget Spider (Gui Spider (WithWebView SpiderHost) (HostFrame Spider)) () -> Widget Spider (Gui Spider (WithWebView SpiderHost) (HostFrame Spider)) () -> IO ()
300−[I] mainWidgetWithCss :: ByteString -> Widget Spider (Gui Spider (WithWebView SpiderHost) (HostFrame Spider)) () -> IO ()
308+-- Reflex-Dom entry point. Takes a monadic widget-building action of lengthy
309+-- type and turns it into an IO action.
310+[I] mainWidget ::
311+ Widget Spider (Gui Spider (WithWebView SpiderHost) (HostFrame Spider)) () -> IO ()
312+[I] mainWidgetWithHead ::
313+ Widget Spider (Gui Spider (WithWebView SpiderHost) (HostFrame Spider)) () ->
314+ Widget Spider (Gui Spider (WithWebView SpiderHost) (HostFrame Spider)) () -> IO ()
315+[I] mainWidgetWithCss ::
316+ ByteString ->
317+ Widget Spider (Gui Spider (WithWebView SpiderHost) (HostFrame Spider)) () -> IO ()
301318
302319-- One-shot Event that is triggered once all initial widgets are built
303320[W] getPostBuild :: m (Event ())