{----------------------------------------------------------------------------- reactive-banana-wx Example: Very simple arithmetic ------------------------------------------------------------------------------} import Data.Maybe import Graphics.UI.WX hiding (Event) import Reactive.Banana import Reactive.Banana.WX {----------------------------------------------------------------------------- Main ------------------------------------------------------------------------------} main = start $ do f <- frame [text := "Arithmetic"] calculate <- button f [text := "="] input1 <- entry f [processEnter := True] input2 <- entry f [processEnter := True] output <- staticText f [ size := sz 40 20 ] set f [layout := margin 10 $ row 10 $ [widget input1, label "+", widget input2 , widget calculate, widget output]] network <- compile $ do -- TODO: Maybe include real-time updates? (see CurrencyConverter.hs) eenter1 <- event0 input1 command eenter2 <- event0 input2 command ebutton <- event0 calculate command binput1 <- behavior input1 text binput2 <- behavior input2 text let ecalculate :: Event () ecalculate = ebutton `union` eenter1 `union` eenter2 result :: Discrete (Maybe Int) result = stepperD Nothing $ (f <$> binput1 <*> binput2) <@ ecalculate where f x y = liftA2 (+) (readNumber x) (readNumber y) readNumber s = listToMaybe [x | (x,"") <- reads s] showNumber = maybe "--" show sink output [text :== showNumber <$> result] actuate network