Как убрать повторяющиеся события в реактив-банане? - PullRequest
7 голосов
/ 03 апреля 2012

В реактивном банане у меня есть поток событий, который производит серию чисел, некоторые из которых повторяются несколько раз подряд (меня не касаются все дубликаты, только последовательные дубликаты).Как я могу изменить этот поток событий, чтобы он содержал только непоследовательные дубликаты?

Я пытался использовать изменения, чтобы преобразовать его в поведение, думая, что поведение будет «меняться» только тогда, когда событие было новым числом, но вместо этого поведениезапускает событие изменения каждый раз, когда поступает новое входное событие.

Ответы [ 2 ]

6 голосов
/ 03 апреля 2012

Обратите внимание, что функция changes должна только использоваться для привязки к инструментарию GUI и т.п., она должна not использоваться для обычного программирования с событиями и поведением.

Функция, которая подавляет повторяющиеся события, может быть выражена через комбинаторы mapAccum и filterJust следующим образом:

skipEqual :: Eq a => Event t a -> Event t a
skipEqual = filterJust . fst . mapAccum Nothing . fmap f
    where
    f y (Just x) = if x == y then (Nothing,Just x) else (Just y,Just y)
    f y Nothing  = (Just y, Just y)

test = interpretModel skipEqual $ map (:[]) [1 :: Int,1,2,3,3,2]

Запуск test дает

*Main> test
[[1],[],[2],[3],[],[2]]

по желанию.

Другими словами, вы можете просто представить Event как список вхождений, а затем применить к нему ваши любимые комбинаторы списков.

0 голосов
/ 03 апреля 2012

Ну, changes ничего не превращает в Behavior; он просто позволяет наблюдать изменения Behavior в NetworkDescription, так что вы можете приклеить его к внешним фреймворкам. Поведение для changes описывается как changes (stepper x e)return (calm e), поэтому повторное отключение события через stepper и changes не будет иметь никакого эффекта, кроме calm (который просто отбрасывает все одновременные вхождения, кроме первого).

Полезно иметь комбинатор для отбрасывания вхождений, которые не меняют значения, и я думаю, что некоторые другие FRP-фреймворки имеют встроенную. Но, как показывает ответ Генриха, вы можете написать свою собственную довольно легко.

...