複数のイベント タイプに応じて変化するプロパティを 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 でこの種のことを行う自然な方法はありますか、それとも自分で実装する必要があるのでしょうか?