import { Observer } from "./observer"; export type ReduceCallback = (previousValue: U, currentValue: T, currentIndex: number) => U; function _reduce(callback: ReduceCallback, initialValue?: U): Observer { let reduced: U; return { observe: (value: T, idx: number) => { if (idx === 0) { reduced = initialValue === undefined ? (value as unknown as U) : callback(initialValue, value, idx); } else { reduced = callback(reduced, value, idx); } }, peek: () => reduced }; } export function reduce(callbackFn: ReduceCallback, initialValue?: U): Observer { return _reduce(callbackFn, initialValue); }