import { AccessorT, Observer, Accessor } from "./observer"; function _median(): Observer { let values: number[]; return { observe: (value: number, idx: number) => { if (idx === 0) { values = []; } values.push(value); }, peek: () => { const sorted = values.sort((l, r) => l - r); const mid = sorted.length / 2; if (sorted.length % 2 === 0) { return (sorted[mid - 1] + sorted[mid]) / 2; } else { return sorted[Math.floor(mid)]; } } }; } export type MedianAccessor = AccessorT; export function median(): Observer; export function median(callbackFn: MedianAccessor): Observer; export function median(callbackFn?: MedianAccessor): Observer | Observer { return callbackFn ? Accessor(_median, callbackFn) : _median(); }