packages feed

WidgetRattus-0.4: examples/gui/src/Stopwatch.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedLists #-}
{-# OPTIONS -fplugin=WidgetRattus.Plugin #-}

{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ScopedTypeVariables #-}


import WidgetRattus

import WidgetRattus.Signal
import WidgetRattus.Widgets
import Prelude hiding (map, const, zipWith, zip, filter, getLine, putStrLn,null)
import Data.Text hiding (filter, map, all)

sampleInterval :: O ()
sampleInterval = timer 20000

currentTime :: C (Sig Time)
currentTime = do
     t <- time 
     return (t ::: mkSig (box (delayC $ delay (let _ = adv sampleInterval in time))))
     



elapsedTime :: C (NominalDiffTime -> Sig NominalDiffTime)
elapsedTime =  do t <- time
                  return (\ s -> run s t)
     where run :: NominalDiffTime -> Time -> Sig NominalDiffTime
           run start t = 
               start ::: delayC (delay (
                    let _ = adv sampleInterval 
                    in do t' <- time
                          return (run (start + (t' `diffTime` t)) t')))

window :: C VStack
window = do
    startBtn <- mkButton (const ("Start" :: Text))
    stopBtn <- mkButton (const ("Stop" :: Text))
    let startDelay = btnOnClick startBtn
    let startSig :: O (Sig (NominalDiffTime -> Sig NominalDiffTime)) 
         = mkSig' (box (delay (let _ = adv (unbox startDelay) in elapsedTime)))

    let stopDelay = btnOnClick stopBtn
    let stopSig :: O (Sig (NominalDiffTime -> Sig NominalDiffTime)) 
         = mkSig (box (delay (let _ = adv (unbox stopDelay) in const)))

    
    let inputSig :: O (Sig (NominalDiffTime -> Sig NominalDiffTime))
         = interleave (box (\ x _ -> x)) startSig stopSig


    let stopWatchSig :: Sig NominalDiffTime
         = switchR (const 0) inputSig

    timeLabName <- mkLabel (const ("Current Time:" :: Text))
    swLabName <- mkLabel (const ("Elapsed Time:" :: Text))


    timeLab <- currentTime >>= mkLabel
    stopWatchLab <- mkLabel stopWatchSig
    buttons <- mkConstHStack (startBtn :* stopBtn)
    time <- mkConstHStack (timeLabName :* timeLab)
    sw <- mkConstHStack (swLabName :* stopWatchLab)

    mkConstVStack (time :* sw :* buttons)

main :: IO ()
main = runApplication window