diff --git a/rhine/src/FRP/Rhine/ClSF/Util.hs b/rhine/src/FRP/Rhine/ClSF/Util.hs index fe28061c1..9c0ec1ffd 100644 --- a/rhine/src/FRP/Rhine/ClSF/Util.hs +++ b/rhine/src/FRP/Rhine/ClSF/Util.hs @@ -16,7 +16,8 @@ module FRP.Rhine.ClSF.Util where import Control.Arrow import Control.Category (Category) import qualified Control.Category (id) -import Data.Maybe (fromJust) +import Data.Functor (($>)) +import Data.Maybe (fromMaybe) import Data.Monoid (Last (Last), getLast) -- containers @@ -26,7 +27,7 @@ import Data.Sequence import Control.Monad.Trans.Reader (ask, asks) -- dunai -import Control.Monad.Trans.MSF.Reader (readerS) +import Control.Monad.Trans.MSF.Reader (readerS, runReaderS) import Data.MonadicStreamFunction.Instances.Num () import Data.MonadicStreamFunction.Instances.VectorSpace () @@ -436,10 +437,20 @@ scaledTimer :: BehaviorF (ExceptT () m) td a (Diff td) scaledTimer diff = timer diff >>> arr (/ diff) +-- * Ad-hoc re-clocking utilities + +-- | Define a local clock for one 'BehaviourF' which ticks exactly when the input is @'Just' a@. +onLocalClock :: (Monad m, TimeDomain td) => BehaviourF m td a b -> BehaviourF m td (Maybe a) (Maybe b) +onLocalClock behaviour = readerS $ proc (ti, aMaybe) -> do + let now = absolute ti + x <- iPre mempty <<< mappendS -< Last $ aMaybe $> now + let sinceLast' = maybe (sinceLast ti) (`diffTime` now) $ getLast x + mapMaybeS $ runReaderS behaviour -< (ti {sinceLast = sinceLast'},) <$> aMaybe + -- * To be ported to Dunai {- | Remembers the last 'Just' value, defaulting to the given initialisation value. -} lastS :: (Monad m) => a -> MSF m (Maybe a) a -lastS a = arr Last >>> mappendFrom (Last (Just a)) >>> arr (getLast >>> fromJust) +lastS a = arr Last >>> mappendS >>> arr (getLast >>> fromMaybe a)