import { AccessorT, Observer, Accessor } from "./observer"; function _variance(): Observer { let count: number; let mean: number; let sum: number; return { observe: (value: number, idx: number) => { if (idx === 0) { count = 0; mean = 0; sum = 0; } const delta = value - mean; mean += delta / ++count; sum += delta * (value - mean); }, peek: () => count > 1 ? sum / (count - 1) : undefined }; } export type VarianceAccessor = AccessorT; export function variance(): Observer; export function variance(callbackFn: VarianceAccessor): Observer; export function variance(callbackFn?: VarianceAccessor): Observer | Observer { return callbackFn ? Accessor(_variance, callbackFn) : _variance(); }