Есть сетевой эквивалент степпера?
Reactive-банан имеет функцию с именем stepper
(типа MonadMoment m => a -> Event a -> m (Behavior a)
), который преобразует событие в поведение, где значением поведения является значение последнего события или начальное значение, если событие еще не произошло.
В выступлении Конала Эллиота, имя которого я не помню, он представляет это как одну из фундаментальных операций над событиями и поведением. Тем не менее, я не могу найти аналогичную функцию в сети. С моим ограниченным пониманием netwire я бы ожидал, что он будет иметь тип:
a -> Wire s e m (Event a) a
- Netwire имеет эквивалентную функцию?
- Если нет, есть ли причина, почему это невозможно?
- Возможно ли что-то подобное, то есть способы преобразования событий в поведение?
2 ответа
Функция, которую я искал, называется hold
, вControl.Wire.Interval
,
Это не требует начального значения, потому что провод блокирует, пока не получено первое событие. Если такое поведение необходимо, оно может быть реализовано так
stepper init = hold <|> pure init
Я могу только догадываться, почему netwire этого не обеспечивает. Все в Control.Wire.Event
сохраняет результаты в Event
сохраняя знание о том, когда они происходят.
Вы можете выйти из Event
с помощью одного из методов переключения в Control.Wire.Switch
, Ты ищешь rSwitch
,
-- Beware: untested, untype-checked code
stepper :: (Monad m) => a -> Wire s e m (Event a) a
stepper init = switcher . source
where
-- source :: Wire s e m (Event a) ((), Event (Wire s e m () a))
source = arr (\e -> ((), pure <$> e))
-- switcher :: Wire s e m ((), Event (Wire s e m () a)) a
switcher = rSwitch (pure init)
В коде выше pure
используется как a -> Wire s e m () a
создавать тривиальные провода.