Source: cumulative.mjs

import { tester, array, NDArray, wrapper_accumulate } from './core.mjs';

/**
 * x1 * x2
 * @function
 * @param {NDArray} x
 * @param {null|number|number[]} [axis = null]
 * @param {null|NDArray} [out = null]
 * @returns {NDArray}
 */
export const cumprod = wrapper_accumulate('cumprod', (x1, x2) => x1 * x2);

/**
 * x1 + x2
 * @function
 * @param {NDArray} x
 * @param {null|number|number[]} [axis = null]
 * @param {null|NDArray} [out = null]
 * @returns {NDArray}
 */
export const cumsum = wrapper_accumulate('cumsum', (x1, x2) => x1 + x2);

let nan1 = x => (Number.isNaN(x) ? 1 : x);

/**
 * nan1(x1) * nan1(x2)
 * @function
 * @param {NDArray} x
 * @param {null|number|number[]} [axis = null]
 * @param {null|NDArray} [out = null]
 * @returns {NDArray}
 */
export const nancumprod = wrapper_accumulate('nancumprod', (x1, x2) => nan1(x1) * nan1(x2));

let nan0 = x => (Number.isNaN(x) ? 0 : x);

/**
 * nan0(x1) + nan0(x2)
 * @function
 * @param {NDArray} x
 * @param {null|number|number[]} [axis = null]
 * @param {null|NDArray} [out = null]
 * @returns {NDArray}
 */
export const nancumsum = wrapper_accumulate('nancumsum', (x1, x2) => nan0(x1) + nan0(x2));

process.env.PRODUCTION ||
	tester
		.add(
			cumprod,
			() => cumprod(0),
			() => array([0])
		)
		.add(
			cumprod,
			() => cumprod([]),
			() => array([])
		)
		.add(
			cumprod,
			() => cumprod(array([1, 2, 3])),
			() => array([1, 2, 6])
		)
		.add(
			cumprod,
			() =>
				cumprod(
					array([
						[1, 2, 3],
						[4, 5, 6],
					])
				),
			() => array([1, 2, 6, 24, 120, 720])
		)
		.add(
			cumprod,
			() =>
				cumprod(
					array([
						[1, 2, 3],
						[4, 5, 6],
					]),
					0
				),
			() =>
				array([
					[1, 2, 3],
					[4, 10, 18],
				])
		)
		.add(
			cumprod,
			() =>
				cumprod(
					array([
						[1, 2, 3],
						[4, 5, 6],
					]),
					1
				),
			() =>
				array([
					[1, 2, 6],
					[4, 20, 120],
				])
		);

process.env.PRODUCTION ||
	tester
		.add(
			cumsum,
			() =>
				cumsum(
					array([
						[1, 2, 3],
						[4, 5, 6],
					])
				),
			() => array([1, 3, 6, 10, 15, 21])
		)
		.add(
			cumsum,
			() =>
				cumsum(
					array([
						[1, 2, 3],
						[4, 5, 6],
					]),
					0
				),
			() =>
				array([
					[1, 2, 3],
					[5, 7, 9],
				])
		)
		.add(
			cumsum,
			() =>
				cumsum(
					array([
						[1, 2, 3],
						[4, 5, 6],
					]),
					1
				),
			() =>
				array([
					[1, 3, 6],
					[4, 9, 15],
				])
		);

process.env.PRODUCTION ||
	tester
		.add(
			nancumprod,
			() => nancumprod(1),
			() => array([1])
		)
		.add(
			nancumprod,
			() => nancumprod([1]),
			() => array([1])
		)
		.add(
			nancumprod,
			() => nancumprod([1, NaN]),
			() => array([1, 1])
		)
		.add(
			nancumprod,
			() =>
				nancumprod(
					array([
						[1, 2],
						[3, NaN],
					])
				),
			() => array([1, 2, 6, 6])
		)
		.add(
			nancumprod,
			() =>
				nancumprod(
					array([
						[1, 2],
						[3, NaN],
					]),
					0
				),
			() =>
				array([
					[1, 2],
					[3, 2],
				])
		)
		.add(
			nancumprod,
			() =>
				nancumprod(
					array([
						[1, 2],
						[3, NaN],
					]),
					1
				),
			() =>
				array([
					[1, 2],
					[3, 3],
				])
		);

process.env.PRODUCTION ||
	tester
		.add(
			nancumsum,
			() => nancumsum(1),
			() => array([1])
		)
		.add(
			nancumsum,
			() => nancumsum([1]),
			() => array([1])
		)
		.add(
			nancumsum,
			() => nancumsum([1, NaN]),
			() => array([1, 1])
		)
		.add(
			nancumsum,
			() =>
				nancumsum(
					array([
						[1, 2],
						[3, NaN],
					])
				),
			() => array([1, 3, 6, 6])
		)
		.add(
			nancumsum,
			() =>
				nancumsum(
					array([
						[1, 2],
						[3, NaN],
					]),
					0
				),
			() =>
				array([
					[1, 2],
					[4, 2],
				])
		)
		.add(
			nancumsum,
			() =>
				nancumsum(
					array([
						[1, 2],
						[3, NaN],
					]),
					1
				),
			() =>
				array([
					[1, 3],
					[3, 3],
				])
		);