reactive-banana throttling events

Я хотел бы реализовать определенный тип дросселирования событий в reactive-banana. Он должен работать таким образом, чтобы событие не пропускалось, если оно прибыло менее чем за дельта секунд от последнего прошедшего события. Если он не пропущен, то он сохраняется и запускается через дельту секунд от последнего запущенного события.

Ниже приведена программа, реализующая это для списков номеров с отметками времени. Можно ли перевести это на реактивный банан?

Кроме того, как в реактивном банане запустить событие через x секунд после того, как произойдет какое-то другое событие?

module Main where

import Data.List

-- 1 second throtling
-- logic is to never output a value before 1 second has passed since last value was outputed.

main :: IO()
main = print $ test [ (0.0, 1.0), (1.1, 2.0), (1.5,3.0), (1.7,4.0),  (2.2, 5.0)  ]
--should output  [ (0.0, 1.0), (1.1, 2.0), (2.1,4.0), (3.1, 5.0) ]

test :: [(Double,Double)] -> [(Double,Double)]
test list = g v (concat xs)
       where
               (v, xs) = mapAccumL f (-50,Nothing) list
               g (t, Just x) ys = ys ++ [ (t+1,x) ]
               g _ ys  = ys
               f (lasttime, Just holdvalue) (t,x) = if t > (lasttime+1) then
                               if t > (lasttime + 2) then
                                       ( (t, Nothing), [ (lasttime+1,holdvalue), (t,x)] )
                               else ( (lasttime+1, Just x) , [ (lasttime+1,holdvalue) ] )
                       else        
                               ( (lasttime, Just x), [] )
               f (lasttime, Nothing) (t,x) = if t > (lasttime+1) then
                        ( (t,Nothing) , [ (t, x ) ] ) 
                        else ( (lasttime, Just x), [] )
7
задан miguel.negrao 4 June 2012 в 21:46
поделиться