UNPKG

@ldrick/trade-indicators

Version:
13 lines (12 loc) 808 B
import { apply as AP, either as E, function as F, readonlyNonEmptyArray as RNEA } from 'fp-ts'; import * as array from '../utils/array.js'; import * as number_ from '../utils/number.js'; const calculation = (values, period, callback) => F.pipe(RNEA.range(0, values.length - period), RNEA.traverse(E.Applicative)((r) => F.pipe(values.slice(r, period + r), array.validateRequiredSize(period), E.map(callback)))); /** * Moving Average * @internal */ export const ma = (values, period, callback) => F.pipe(AP.sequenceS(E.Applicative)({ periodV: number_.validatePositiveInteger(period), valuesV: array.validateRequiredSize(period)(values), }), E.bind('valuesB', ({ valuesV }) => array.toBig(valuesV)), E.chain(({ periodV, valuesB }) => calculation(valuesB, periodV, callback)), E.map(array.toNumber));