Semantically, you have
Behavior a = Time -> a
That is, a Behavior a
is a value of type a
that varies over time. In general, you know nothing at all about when a Behavior a
would change, so it turns out to be a rather poor choice for updating a text field on the click of a button. That said, it would be easy to get a behavior that expresses the current value of the number in the counter example. Just use stepper
on the event stream, or alternatively, build it from scratch the same way, except by using accumB
instead of accumE
.
Typically, things you hook up to input and output will always be Event
s, so Behavior
is used internally for intermediate results.
Suppose that in the given example, you want to add a new button that remembers the current value, like the memory function on simple calculators. You would start out by adding a memory button and a text field for the remembered value:
bmem <- button f [text := "Remember"]
memory <- staticText f []
You need to be able to ask for the current value at any time, so in your network, you'd add a behavior to represent it.
let currentVal = stepper 0 counter
Then you can hook up events, and use apply
to read the value of the behavior every time the Remember button is pressed, and produce an Event with that sequence of values.
emem <- event0 bmem command
let memoryE = apply (const <$> currentVal) emem
And finally, hook up this new event to the output
sink memory [text :== ("", show <$> memoryE)]
If you wanted to use memory internally, then again you'd want a Behavior
for its current value too... but since we only ever use it to connect it to an output, we only need an event for now.
Does that help?