module Control.Varying.Time where
import Control.Varying.Core
import Control.Varying.Event
import Control.Applicative
import Data.Time.Clock
import Control.Monad.IO.Class (MonadIO,liftIO)
deltaUTC :: (MonadIO m, Fractional t) => VarT m b t
deltaUTC = delta (liftIO getCurrentTime) (\a b -> realToFrac $ diffUTCTime a b)
delta :: (Num t, Fractional t, Applicative m, Monad m)
=> m a -> (a -> a -> t) -> VarT m b t
delta m f = VarT $ \_ -> do
t <- m
return (0, delta' t)
where delta' t = VarT $ \_ -> do
t' <- m
let dt = t' `f` t
return (dt, delta' t')
before :: (Applicative m, Monad m, Num t, Ord t) => t -> VarT m t (Event ())
before t = VarT $ \dt -> return $
if t dt >= 0
then (Event (), before $ t dt)
else (NoEvent, never)
after :: (Applicative m, Monad m, Num t, Ord t) => t -> VarT m t (Event ())
after t = VarT $ \dt -> return $
if t dt <= 0
then (Event (), pure $ Event ())
else (NoEvent, after $ t dt)