import { merge, Observable } from "kefir"; export const transform = < T, Mutations extends [Observable, (prev: T, evt: any) => T][] >( initValue: T, ...mutations: Mutations ): Observable => merge( mutations.map(([source, mutation]) => source.map((event) => ({ event, mutation })) ) ).scan((prev, { event, mutation }) => mutation(prev, event), initValue); export const partition = ( classes: C, partitionFn: (v: T) => C[number] ) => (obs: Observable) => { const assigned = obs.map((obj) => ({ obj, cls: partitionFn(obj) })); return Object.fromEntries( classes.map((C) => [ C, assigned.filter(({ cls }) => cls == C).map(({ obj }) => obj), ]) ); };