Я хотел бы реализовать определенный тип дросселирования событий в 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), [] )