Каков идиоматический способ создания свойства в Kefir, которое изменяется в ответ на несколько типов событий?
В моем проекте я начал использовать rxjs
для приложения в стиле FRP. В этом приложении я хотел подписаться на состояние, которое изменилось в ответ на несколько переменных. Вот как я вроде заработал:
const subject = new BehaviorSubject([]);
addEvents
.withLatestFrom(subject, (newItem, items) => items.concat(newItem))
.subscribe(subject);
removeEvents
.withLatestFrom(subject, (item, items) => {
return items.filter(i => i !== item);
})
.subscribe(subject);
Я мог бы сказать, что это, вероятно, не лучшая практика; это не кажется идиоматичным, и я также только что понял, что подписка наблюдателя на несколько источников не совсем корректна.
По многим причинам я решил попробовать библиотеку, отличную от RxJs, и сейчас оцениваю Kefir, у которого отличная документация и предположительно более высокая производительность. Но мне еще труднее определить, как делать то, что я хотел бы, если не считать уродливых хаков, где мне придется проверять типы событий:
kefir
.merge(addEvents, removeEvents)
.scan(
(items, event) => {
switch (event.type) {
case 'add': return items.concat(event.item);
case 'remove': return items.filter(i => i !== event.item);
}
},
[])
.toProperty();
Я действительно предпочел бы, чтобы не приходилось использовать неэлегантные методы, такие как большие условные блоки для множества типов событий, чтобы создать поток изменений.
Я не планирую использовать Bacon.js, но вижу, что в нем есть именно то, что мне нужно:
Bacon.update([],
[addEvents], (items, evt) => items.concat(evt.item),
[removeEvents], (items, evt) => items.filter(i => i !== evt.item));
Есть ли естественный способ делать такие вещи с Kefir с его стандартными операторами, или это то, что мне в конечном итоге придется реализовать самому?