Обратите внимание, что функция 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
как список вхождений, а затем применить к нему ваши любимые комбинаторы списков.