{-----------------------------------------------------------------------------
reactive-banana-threepenny
Example: Very simple arithmetic
------------------------------------------------------------------------------}
{-# LANGUAGE ScopedTypeVariables #-} -- allows "forall t. Moment t"
import Data.Maybe
import qualified Graphics.UI.Threepenny as UI
import Graphics.UI.Threepenny.Core hiding (Event)
import Reactive.Banana
import Reactive.Banana.Threepenny
{-----------------------------------------------------------------------------
Main
------------------------------------------------------------------------------}
main :: IO ()
main = do
startGUI Config
{ tpPort = 10000
, tpCustomHTML = Nothing
, tpStatic = ""
} setup
setup :: Window -> IO ()
setup window = do
return window # set title "Arithmetic"
input1 <- UI.input
input2 <- UI.input
output <- UI.span
getBody window #+ [row
[ element input1, UI.string " + ", element input2
, UI.string " = ", element output]]
let networkDescription :: forall t. Frameworks t => Moment t ()
networkDescription = do
binput1 <- behaviorValue input1 ""
binput2 <- behaviorValue input2 ""
let
result :: Behavior t (Maybe Int)
result = f <$> binput1 <*> binput2
where
f x y = liftA2 (+) (readNumber x) (readNumber y)
readNumber s = listToMaybe [x | (x,"") <- reads s]
showNumber = maybe "--" show
return output # sink text (showNumber <$> result)
network <- compile networkDescription
actuate network