Есть сетевой эквивалент степпера?

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 создавать тривиальные провода.

Другие вопросы по тегам