{-# 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
