In reactive-banana the Event
type represents a stream of some events in time. An Event
is similar to an analog impulse signal in the sense that it is not continuous in time. As a result, Event
is an instance of the Functor
typeclass only. You can't combine two Event
s together because they may fire at different times. You can do something with an Event
's [current] value and react to it with some IO
action.
Transformations on Event
s value are done using fmap
:
main = do (inputHandler, inputFire) <- newAddHandler compile $ do inputEvent <- fromAddHandler inputHandler -- turn all characters in the signal to upper case let inputEvent' = fmap (map toUpper) inputEvent
Reacting to an Event
is done the same way. First you fmap
it with an action of type a -> IO ()
and then pass it to reactimate
function:
main = do (inputHandler, inputFire) <- newAddHandler compile $ do inputEvent <- fromAddHandler inputHandler -- turn all characters in the signal to upper case let inputEvent' = fmap (map toUpper) inputEvent let inputEventReaction = fmap putStrLn inputEvent' -- this has type `Event (IO ()) reactimate inputEventReaction
Now whenever inputFire "something"
is called, "SOMETHING"
would be printed.