diff --git a/src/__tests__/__snapshots__/index.test.ts.snap b/src/__tests__/__snapshots__/index.test.ts.snap index 89ed2897..68ec1d0b 100644 --- a/src/__tests__/__snapshots__/index.test.ts.snap +++ b/src/__tests__/__snapshots__/index.test.ts.snap @@ -9,6 +9,7 @@ exports[`test existence of exported functions 1`] = ` "getOutputArray", "xAbsolute", "xAbsoluteMedian", + "xAbsoluteSum", "xAdd", "xApplyFunctionStr", "xAutoCorrelation", diff --git a/src/x/__tests__/xAbsoluteSum.test.ts b/src/x/__tests__/xAbsoluteSum.test.ts new file mode 100644 index 00000000..dad9afa6 --- /dev/null +++ b/src/x/__tests__/xAbsoluteSum.test.ts @@ -0,0 +1,21 @@ +import { expect, test } from 'vitest'; + +import { xAbsoluteSum } from '../index'; + +test('normal array', () => { + const array = [-1, 2, -3, 4]; + expect(xAbsoluteSum(array)).toStrictEqual(10); +}); + +test('typed array', () => { + const array = new Float64Array([-1, 2, -3, 4]); + expect(xAbsoluteSum(array)).toBe(10); +}); + +test('typed array from to', () => { + const array = new Float64Array([10, -1, 2, -3, 4, 20]); + + const fromIndex = 1; + const toIndex = 4; + expect(xAbsoluteSum(array, { fromIndex, toIndex })).toBe(10); +}); diff --git a/src/x/index.ts b/src/x/index.ts index f376ac09..6d298e77 100644 --- a/src/x/index.ts +++ b/src/x/index.ts @@ -1,6 +1,7 @@ export * from './getOutputArray'; export * from './xAbsolute'; export * from './xAbsoluteMedian'; +export * from './xAbsoluteSum'; export * from './xAdd'; export * from './xApplyFunctionStr'; export * from './xAutoCorrelation'; diff --git a/src/x/xAbsoluteSum.ts b/src/x/xAbsoluteSum.ts new file mode 100644 index 00000000..1cdfe648 --- /dev/null +++ b/src/x/xAbsoluteSum.ts @@ -0,0 +1,23 @@ +import { NumberArray } from 'cheminfo-types'; + +import { xCheck } from './xCheck'; +import { XGetFromToIndexOptions, xGetFromToIndex } from './xGetFromToIndex'; + +export function xAbsoluteSum( + array: NumberArray, + options: XGetFromToIndexOptions = {}, +): number { + xCheck(array); + const { fromIndex, toIndex } = xGetFromToIndex(array, options); + + let sum = 0; + for (let i = fromIndex; i <= toIndex; i++) { + if (array[i] < 0) { + sum -= array[i]; + } else { + sum += array[i]; + } + } + + return sum; +}