packages feed

timberc-1.0.1: examples/Reflex.t

module Reflex where

import POSIX
import RandomGenerator

data State = Idle | Waiting Msg | Counting

root env = class
  
   print str = env.stdout.write (str ++ "\n")

   tmr = new timer
   gen = new baseGen (microsecOf env.startTime)

   state := Idle
  
   enter _ = action
      case state of
        Idle ->         r <- gen.next
                        waitingTime = sec 2 + millisec (r `mod` 2000)
                        msg <- after waitingTime action
                           tmr.reset
                           print "Go!"
                           state := Counting 
                        print "Wait..."
                        state := Waiting msg
                 
        Waiting msg ->  abort msg
                        print "Cheat!!!"
                        state := Idle

        Counting ->     t <- tmr.sample
                        print (format t)
                        state := Idle

   result 
     action
       env.stdin.installR enter
       print "Press return to start"

format t = show (secOf t) ++ '.' : fracs ++ " secs"
  where t100  = microsecOf t `div` 10000
        fracs = if t100<10 then '0':show t100 else show t100