{-# LANGUAGE Arrows #-} module JuicyBar.Timer (makeTimer, sampleAt) where import FRP.Grapefruit.Signal as Signal import FRP.Grapefruit.Signal.Discrete as DSignal import FRP.Grapefruit.Signal.Continuous as CSignal import FRP.Grapefruit.Signal.Segmented as SSignal import FRP.Grapefruit.Setup (Setup, fromIO) import FRP.Grapefruit.Circuit as Circuit import System.Glib.MainLoop import Control.Arrow as Arrow -- interval in milliseconds timerProducer :: Int -> Producer DSignal () timerProducer interval = DSignal.producer setup where setup handler = fromIO $ do timeoutAdd (handler () >> return True) interval return () makeTimer :: Circuit era Int (DSignal era ()) makeTimer = proc interval -> do signal <- produce $ timerProducer interval -<< () returnA -< signal sampleAt :: Int -> Circuit era (CSignal era val) (SSignal era val) sampleAt interval = proc cs -> do timer <- makeTimer -< interval returnA -< construct () timer #> cs