38 lines
985 B
TypeScript
38 lines
985 B
TypeScript
import { merge, Observable } from "kefir";
|
|
|
|
export type ValueWithin<O extends Observable<any, any>> = Parameters<
|
|
Parameters<O["map"]>[0]
|
|
>[0];
|
|
|
|
type Mutation<A, O extends Observable<any, any>> = [
|
|
O,
|
|
(prev: A, value: ValueWithin<O>) => A
|
|
];
|
|
|
|
export const multiScan = <A, M extends Mutation<A, any>[]>(
|
|
initValue: A,
|
|
...mutations: M
|
|
): Observable<A, any> =>
|
|
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, E>(
|
|
classes: C,
|
|
partitionFn: (v: T) => C[number]
|
|
) =>
|
|
(obs: Observable<T, E>) => {
|
|
const assigned = obs.map((obj) => ({ obj, cls: partitionFn(obj) }));
|
|
return Object.fromEntries(
|
|
classes.map((C) => [
|
|
C,
|
|
assigned.filter(({ cls }) => cls == C).map(({ obj }) => obj),
|
|
])
|
|
);
|
|
};
|
|
|
|
export const isEmpty = (container: { length: number }) => container.length == 0;
|