UNPKG

@thi.ng/transducers-stats

Version:

Transducers for statistical / technical analysis

36 lines (35 loc) 841 B
import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; import { compR } from "@thi.ng/transducers/compr"; import { iterator1 } from "@thi.ng/transducers/iterator"; function ema(period, src) { if (src) { return iterator1(ema(period), src); } period |= 0; period < 2 && illegalArgs("period must be >= 2"); const k = 2 / (period + 1); return (rfn) => { const reduce = rfn[2]; let window = []; let ema2; let sum = 0; return compR(rfn, (acc, x) => { if (ema2 != null) { ema2 += (x - ema2) * k; return rfn[2](acc, ema2); } else { window.push(x); sum += x; if (window.length == period) { ema2 = sum / period; window = null; return reduce(acc, ema2); } return acc; } }); }; } export { ema };