Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UI input with reactive-banana-wx

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.

like image 894
Masse Avatar asked Jul 01 '11 06:07

Masse


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.

like image 129
John L Avatar answered Oct 22 '22 13:10

John L


(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)
like image 29
Heinrich Apfelmus Avatar answered Oct 22 '22 14:10

Heinrich Apfelmus