UNPKG

2.39 kBJavaScriptView Raw
1import { containsCollections, deepForEach, reduce } from '../../utils/collection'
2import { factory } from '../../utils/factory'
3import { improveErrorMessage } from './utils/improveErrorMessage'
4import { noBignumber, noFraction } from '../../utils/noop'
5
6const name = 'sum'
7const dependencies = ['typed', 'config', 'add', '?bignumber', '?fraction']
8
9export const createSum = /* #__PURE__ */ factory(name, dependencies, ({ typed, config, add, bignumber, fraction }) => {
10 /**
11 * Compute the sum of a matrix or a list with values.
12 * In case of a (multi dimensional) array or matrix, the sum of all
13 * elements will be calculated.
14 *
15 * Syntax:
16 *
17 * math.sum(a, b, c, ...)
18 * math.sum(A)
19 *
20 * Examples:
21 *
22 * math.sum(2, 1, 4, 3) // returns 10
23 * math.sum([2, 1, 4, 3]) // returns 10
24 * math.sum([[2, 5], [4, 3], [1, 7]]) // returns 22
25 *
26 * See also:
27 *
28 * mean, median, min, max, prod, std, variance
29 *
30 * @param {... *} args A single matrix or or multiple scalar values
31 * @return {*} The sum of all values
32 */
33 return typed(name, {
34 // sum([a, b, c, d, ...])
35 'Array | Matrix': _sum,
36
37 // sum([a, b, c, d, ...], dim)
38 'Array | Matrix, number | BigNumber': _nsumDim,
39
40 // sum(a, b, c, d, ...)
41 '...': function (args) {
42 if (containsCollections(args)) {
43 throw new TypeError('Scalar values expected in function sum')
44 }
45
46 return _sum(args)
47 }
48 })
49
50 /**
51 * Recursively calculate the sum of an n-dimensional array
52 * @param {Array} array
53 * @return {number} sum
54 * @private
55 */
56 function _sum (array) {
57 let sum
58
59 deepForEach(array, function (value) {
60 try {
61 sum = (sum === undefined) ? value : add(sum, value)
62 } catch (err) {
63 throw improveErrorMessage(err, 'sum', value)
64 }
65 })
66
67 if (sum === undefined) {
68 switch (config.number) {
69 case 'number':
70 return 0
71 case 'BigNumber':
72 return bignumber ? bignumber(0) : noBignumber()
73 case 'Fraction':
74 return fraction ? fraction(0) : noFraction()
75 default:
76 return 0
77 }
78 }
79
80 return sum
81 }
82
83 function _nsumDim (array, dim) {
84 try {
85 const sum = reduce(array, dim, add)
86 return sum
87 } catch (err) {
88 throw improveErrorMessage(err, 'sum')
89 }
90 }
91})