Цель состоит в том, чтобы создать событие, которое запускается всякий раз, когда поведение изменяется под некоторым наблюдением.
Чтобы сделать его более конкретным, скажем, у меня есть:
- 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.