How do you get the content of ui elements when using reactive-banana? The event0 returns an event of type Event ()
, which has unit type instead of the type of the control. event1 takes an event of type Event w (a -> IO ())
, but command is of type Event w (IO ())
. mapAccumE and mapAccumB takes pure functions as parameters, so get text foo
can't be used with them.

- 9,819
- 4
- 38
- 67

- 4,334
- 3
- 30
- 41
2 Answers
Basically, you want to work with functions instead of data. If you're thinking "How do I create a behavior which has the current text in a box", you don't. Instead you write functions that take the current text as a parameter, and pass it in when necessary. Suppose you want to print the contents of a textbox when a button is pressed. Then you would do something like this:
eButton :: NetworkDescription (Event ())
eButton = event0 button command
network = do
pressButton <- eButton
reactimate $ (\() -> get text foo >>= print) <$> pressButton
If you need to get input into a Behavior, you can similarly use a function with type Behavior (String -> a)
(or whatever type you need), and then just pass the string in at the point of the reactimate
call.

- 27,937
- 4
- 73
- 88
(Author of reactive-banana speaking. Sorry for the late reply, the possibility of questions being asked here didn't even cross my mind. :-) )
I discovered today that I omitted a very crucial feature from the library: getting the content of a UI element as a Behavior
. Embarassing! :-D
John describes the current workaround, but the next version of reactive-banana will include the missing feature.
EDIT: I have released reactive-banana version 0.4 which now includes the functionality in form of a function
fromPoll :: IO a -> NetworkDescription (Behavior a)

- 1
- 1

- 11,034
- 1
- 39
- 67