import { merge, Observable } from "kefir"; import Bus from "kefir-bus"; export type ValueWithin> = Parameters< Parameters[0] >[0]; type Mutation> = [ O, (prev: A, value: ValueWithin) => A ]; export const multiScan = []>( initValue: A, ...mutations: M ): Observable => merge( mutations.map(([source, mutation]) => source.map((event) => ({ event, mutation })) ) ).scan((prev, { event, mutation }) => mutation(prev, event), initValue); export const partition = < C extends readonly [...string[]], T extends { [key: string]: any }, E >( classes: C, obs: Observable ) => { const classBuses = Object.fromEntries(classes.map((c) => [c, Bus()])); obs.onValue((v) => { for (const _class of classes) { if (_class in v) { classBuses[_class].emit(v); return; } } }); return classBuses; }; export const isEmpty = (container: { length: number }) => container.length == 0; export const setDiff = ( sets: [Set, s2: Set] ): { added: T[]; removed: T[] } => ({ added: [...sets[1].difference(sets[0])], removed: [...sets[0].difference(sets[1])], }); export const set = (arr: T[]) => new Set(arr); export const invert = (obs: Observable) => obs.map((o) => !o);