rhine-0.1.0.0: src/FRP/Rhine/ResamplingBuffer/MSF.hs
{-# LANGUAGE RecordWildCards #-}
module FRP.Rhine.ResamplingBuffer.MSF where
-- rhine
import FRP.Rhine
-- | Given a monadic stream function that accepts
-- a varying number of inputs (a list),
-- a `ResamplingBuffer` can be formed
-- that collects all input in a timestamped list
msfBuffer
:: Monad m
=> MSF m (TimeInfo cl2, [(TimeInfo cl1, a)]) b
-- ^ The monadic stream function that consumes
-- a single time stamp for the moment when an output value is required,
-- and a list of timestamped inputs,
-- and outputs a single value.
-- The list will contain the /newest/ element in the head.
-> ResamplingBuffer m cl1 cl2 a b
msfBuffer msf = msfBuffer' msf []
where
msfBuffer'
:: Monad m
=> MSF m (TimeInfo cl2, [(TimeInfo cl1, a)]) b
-> [(TimeInfo cl1, a)]
-> ResamplingBuffer m cl1 cl2 a b
msfBuffer' msf as = ResamplingBuffer {..}
where
put ti1 a = return $ msfBuffer' msf $ (ti1, a) : as
get ti2 = do
(b, msf') <- unMSF msf (ti2, as)
return (b, msfBuffer msf')