Могу ли я создать событие на основе изменения поведения в реактивном банане? - PullRequest
2 голосов
/ 08 июля 2020

Цель состоит в том, чтобы создать событие, которое запускается всякий раз, когда поведение изменяется под некоторым наблюдением.

Чтобы сделать его более конкретным, скажем, у меня есть:

  • a bFoo :: Behavior a, которое мне нравится думать как состояние, изменяющееся во времени.
  • функция diffA :: a -> a -> Maybe b, чтобы определить, была ли изменена определенная часть значения bFoo (вместе с дополнительной информацией, указывающей что изменилось, или оставляя мне место для избежания булевой слепоты)

и теперь я хочу создать событие eChanged :: Event b, которое срабатывает тогда и только тогда, когда у нас есть Just _, исходящий из diffA fooBefore fooAfter.

Здесь возникает проблема: похоже, фреймворк позволяет вам смотреть только на одно значение Behavior в Moment. Поэтому у меня нет доступа к двум значениям для сравнения друг с другом. Я смотрел Reactive.Banana.Combinators , но до сих пор не очень понимаю, возможно ли это.

Еще несколько кусочков на случай, если они будут полезны или вызовут новые идеи:

На основе событий, а не на основе поведения?

Первое, о чем я могу думать, это просто позволить себе получить доступ к более подробной информации: bFoo это accumB - ed из события eUpdate, но eUpdate не обязательно что-либо обновлять. Итак, да, у нас есть доступ к eFoo :: Event a, если мы хотим, но я хочу избежать его использования, поскольку я думаю, что это деталь реализации bFoo.

Неудачная попытка

Моя текущая попытка выглядит так:

networkDesc :: MomemtIO ()
networkDesc = do
  ...
  foo <- valueB bFoo
  let eChanged = filterJust $ fmap (diffA foo) eUpdate
  ...

Это не работает, поскольку foo не меняется с течением времени.

Последнее средство

Мое последнее средство - reactimate на eFoo, проведите сравнение вне фреймворка и передайте результат обратно в сеть - звучит выполнимо, но это лишает сеть заботы обо всех логах c.

...