packages feed

rhine-0.9: src/FRP/Rhine/ResamplingBuffer/MSF.hs

{-# LANGUAGE RecordWildCards #-}

{- |
Collect and process all incoming values statefully and with time stamps.
-}
module FRP.Rhine.ResamplingBuffer.MSF where

-- dunai
import Data.MonadicStreamFunction.InternalCore

-- rhine
import FRP.Rhine.ResamplingBuffer

{- | 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 =>
  -- | 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.
  MSF m (TimeInfo cl2, [(TimeInfo cl1, a)]) b ->
  ResamplingBuffer m cl1 cl2 a b
msfBuffer = msfBuffer' []
  where
    msfBuffer' ::
      Monad m =>
      [(TimeInfo cl1, a)] ->
      MSF m (TimeInfo cl2, [(TimeInfo cl1, a)]) b ->
      ResamplingBuffer m cl1 cl2 a b
    msfBuffer' as msf = ResamplingBuffer {..}
      where
        put ti1 a = return $ msfBuffer' ((ti1, a) : as) msf
        get ti2 = do
          (b, msf') <- unMSF msf (ti2, as)
          return (b, msfBuffer msf')