packages feed

reactive-banana-threepenny-0.7.1.3: src/Counter.hs

{-----------------------------------------------------------------------------
    reactive-banana-threepenny
    
    Example: Counter
------------------------------------------------------------------------------}
{-# LANGUAGE ScopedTypeVariables #-} -- allows "forall t. Moment t"

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 "Counter"
    
    bup    <- UI.button #+ [UI.string "Up"  ]
    bdown  <- UI.button #+ [UI.string "Down"]
    output <- UI.span
    
    getBody window #+ [column [element bup, element bdown, element output]]

    let networkDescription :: forall t. Frameworks t => Moment t ()
        networkDescription = do
        
        eup   <- event UI.click bup
        edown <- event UI.click bdown
        
        let
            counter :: Behavior t Int
            counter = accumB 0 $ ((+1) <$ eup) `union` (subtract 1 <$ edown)
    
        return output # sink text (show <$> counter)

    network <- compile networkDescription    
    actuate network