module Control.Wire.Prefab.Clock
(
dtime,
dtimeFrom,
time,
timeFrom,
timeOffset
)
where
import Control.Arrow
import Control.Wire.Classes
import Control.Wire.Types
dtime :: (ArrowClock (>~), Time (>~) ~ t, Num t) => Wire e (>~) a t
dtime =
mkGen $ proc _ -> do
t <- arrTime -< ()
returnA -< (Right 0, dtimeFrom t)
dtimeFrom :: (ArrowClock (>~), Time (>~) ~ t, Num t) => t -> Wire e (>~) a t
dtimeFrom t' =
mkGen $ proc _ -> do
t <- arrTime -< ()
let dt = t t'
returnA -< t' `seq` (Right dt, dtimeFrom t)
timeFrom :: (ArrowClock (>~), Time (>~) ~ t, Num t) => t -> Wire e (>~) a t
timeFrom t0 =
mkGen $ proc _ -> do
t <- arrTime -< ()
returnA -< t0 `seq` (Right t0, timeOffset (t0 t))
timeOffset :: (ArrowClock (>~), Time (>~) ~ t, Num t) => t -> Wire e (>~) a t
timeOffset offset = mkFix $ proc _ -> Right . (+ offset) ^<< arrTime -< ()
time :: (ArrowClock (>~), Time (>~) ~ t, Num t) => Wire e (>~) a t
time = timeFrom 0