mathjs 11.8.2 → 11.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/HISTORY.md +24 -0
  2. package/lib/browser/math.js +1 -1
  3. package/lib/browser/math.js.LICENSE.txt +2 -2
  4. package/lib/browser/math.js.map +1 -1
  5. package/lib/cjs/entry/dependenciesAny/dependenciesFreqz.generated.js +28 -0
  6. package/lib/cjs/entry/dependenciesAny/dependenciesRange.generated.js +4 -0
  7. package/lib/cjs/entry/dependenciesAny/dependenciesRangeTransform.generated.js +4 -0
  8. package/lib/cjs/entry/dependenciesAny/dependenciesSolveODE.generated.js +46 -0
  9. package/lib/cjs/entry/dependenciesAny/dependenciesZpk2tf.generated.js +26 -0
  10. package/lib/cjs/entry/dependenciesAny.generated.js +21 -0
  11. package/lib/cjs/entry/dependenciesNumber/dependenciesRange.generated.js +4 -0
  12. package/lib/cjs/entry/dependenciesNumber/dependenciesRangeTransform.generated.js +4 -0
  13. package/lib/cjs/entry/impureFunctionsAny.generated.js +35 -30
  14. package/lib/cjs/entry/impureFunctionsNumber.generated.js +2 -0
  15. package/lib/cjs/entry/pureFunctionsAny.generated.js +82 -45
  16. package/lib/cjs/entry/pureFunctionsNumber.generated.js +2 -0
  17. package/lib/cjs/expression/embeddedDocs/core/typed.js +1 -1
  18. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +11 -3
  19. package/lib/cjs/expression/embeddedDocs/function/{matrix → algebra}/lyap.js +2 -2
  20. package/lib/cjs/expression/embeddedDocs/function/algebra/polynomialRoot.js +1 -1
  21. package/lib/cjs/expression/embeddedDocs/function/{matrix → algebra}/schur.js +2 -2
  22. package/lib/cjs/expression/embeddedDocs/function/algebra/simplifyConstant.js +1 -1
  23. package/lib/cjs/expression/embeddedDocs/function/{matrix → algebra}/sylvester.js +2 -2
  24. package/lib/cjs/expression/embeddedDocs/function/arithmetic/invmod.js +1 -1
  25. package/lib/cjs/expression/embeddedDocs/function/expression/evaluate.js +2 -2
  26. package/lib/cjs/expression/embeddedDocs/function/matrix/diff.js +1 -1
  27. package/lib/cjs/expression/embeddedDocs/function/matrix/range.js +1 -1
  28. package/lib/cjs/expression/embeddedDocs/function/numeric/solveODE.js +15 -0
  29. package/lib/cjs/expression/embeddedDocs/function/signal/freqz.js +15 -0
  30. package/lib/cjs/expression/embeddedDocs/function/signal/zpk2tf.js +15 -0
  31. package/lib/cjs/expression/embeddedDocs/function/utils/numeric.js +1 -1
  32. package/lib/cjs/expression/node/FunctionNode.js +5 -6
  33. package/lib/cjs/expression/node/ObjectNode.js +5 -7
  34. package/lib/cjs/expression/node/SymbolNode.js +1 -1
  35. package/lib/cjs/expression/transform/range.transform.js +7 -3
  36. package/lib/cjs/factoriesAny.js +21 -0
  37. package/lib/cjs/function/algebra/simplify.js +3 -0
  38. package/lib/cjs/function/matrix/range.js +34 -110
  39. package/lib/cjs/function/numeric/solveODE.js +315 -0
  40. package/lib/cjs/function/signal/freqz.js +117 -0
  41. package/lib/cjs/function/signal/zpk2tf.js +95 -0
  42. package/lib/cjs/header.js +2 -2
  43. package/lib/cjs/type/unit/Unit.js +15 -13
  44. package/lib/cjs/utils/customs.js +4 -3
  45. package/lib/cjs/version.js +1 -1
  46. package/lib/esm/entry/dependenciesAny/dependenciesFreqz.generated.js +20 -0
  47. package/lib/esm/entry/dependenciesAny/dependenciesRange.generated.js +4 -0
  48. package/lib/esm/entry/dependenciesAny/dependenciesRangeTransform.generated.js +4 -0
  49. package/lib/esm/entry/dependenciesAny/dependenciesSolveODE.generated.js +38 -0
  50. package/lib/esm/entry/dependenciesAny/dependenciesZpk2tf.generated.js +18 -0
  51. package/lib/esm/entry/dependenciesAny.generated.js +3 -0
  52. package/lib/esm/entry/dependenciesNumber/dependenciesRange.generated.js +4 -0
  53. package/lib/esm/entry/dependenciesNumber/dependenciesRangeTransform.generated.js +4 -0
  54. package/lib/esm/entry/impureFunctionsAny.generated.js +34 -29
  55. package/lib/esm/entry/impureFunctionsNumber.generated.js +2 -0
  56. package/lib/esm/entry/pureFunctionsAny.generated.js +70 -36
  57. package/lib/esm/entry/pureFunctionsNumber.generated.js +2 -0
  58. package/lib/esm/expression/embeddedDocs/core/typed.js +1 -1
  59. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +11 -3
  60. package/lib/esm/expression/embeddedDocs/function/{matrix → algebra}/lyap.js +2 -2
  61. package/lib/esm/expression/embeddedDocs/function/algebra/polynomialRoot.js +1 -1
  62. package/lib/esm/expression/embeddedDocs/function/{matrix → algebra}/schur.js +2 -2
  63. package/lib/esm/expression/embeddedDocs/function/algebra/simplifyConstant.js +1 -1
  64. package/lib/esm/expression/embeddedDocs/function/{matrix → algebra}/sylvester.js +2 -2
  65. package/lib/esm/expression/embeddedDocs/function/arithmetic/invmod.js +1 -1
  66. package/lib/esm/expression/embeddedDocs/function/expression/evaluate.js +2 -2
  67. package/lib/esm/expression/embeddedDocs/function/matrix/diff.js +1 -1
  68. package/lib/esm/expression/embeddedDocs/function/matrix/range.js +1 -1
  69. package/lib/esm/expression/embeddedDocs/function/numeric/solveODE.js +8 -0
  70. package/lib/esm/expression/embeddedDocs/function/signal/freqz.js +8 -0
  71. package/lib/esm/expression/embeddedDocs/function/signal/zpk2tf.js +8 -0
  72. package/lib/esm/expression/embeddedDocs/function/utils/numeric.js +1 -1
  73. package/lib/esm/expression/node/FunctionNode.js +6 -7
  74. package/lib/esm/expression/node/ObjectNode.js +5 -7
  75. package/lib/esm/expression/node/SymbolNode.js +1 -1
  76. package/lib/esm/expression/transform/range.transform.js +7 -3
  77. package/lib/esm/factoriesAny.js +3 -0
  78. package/lib/esm/function/algebra/simplify.js +3 -0
  79. package/lib/esm/function/matrix/range.js +34 -110
  80. package/lib/esm/function/numeric/solveODE.js +284 -0
  81. package/lib/esm/function/signal/freqz.js +115 -0
  82. package/lib/esm/function/signal/zpk2tf.js +82 -0
  83. package/lib/esm/type/unit/Unit.js +15 -13
  84. package/lib/esm/utils/customs.js +4 -3
  85. package/lib/esm/version.js +1 -1
  86. package/package.json +15 -15
  87. package/types/index.d.ts +51 -6
@@ -1,8 +1,8 @@
1
1
  export var schurDocs = {
2
2
  name: 'schur',
3
- category: 'Matrix',
3
+ category: 'Algebra',
4
4
  syntax: ['schur(A)'],
5
5
  description: 'Performs a real Schur decomposition of the real matrix A = UTU\'',
6
- examples: ['schur([[1, 0], [-4, 3]])', 'schur(A)'],
6
+ examples: ['schur([[1, 0], [-4, 3]])', 'A = [[1, 0], [-4, 3]]', 'schur(A)'],
7
7
  seealso: ['lyap', 'sylvester']
8
8
  };
@@ -3,6 +3,6 @@ export var simplifyConstantDocs = {
3
3
  category: 'Algebra',
4
4
  syntax: ['simplifyConstant(expr)', 'simplifyConstant(expr, options)'],
5
5
  description: 'Replace constant subexpressions of node with their values.',
6
- examples: ['simplifyConatant("(3-3)*x")', 'simplifyConstant(parse("z-cos(tau/8)"))'],
6
+ examples: ['simplifyConstant("(3-3)*x")', 'simplifyConstant(parse("z-cos(tau/8)"))'],
7
7
  seealso: ['simplify', 'simplifyCore', 'evaluate']
8
8
  };
@@ -1,8 +1,8 @@
1
1
  export var sylvesterDocs = {
2
2
  name: 'sylvester',
3
- category: 'Matrix',
3
+ category: 'Algebra',
4
4
  syntax: ['sylvester(A,B,C)'],
5
5
  description: 'Solves the real-valued Sylvester equation AX+XB=C for X',
6
- examples: ['sylvester([[-1, -2], [1, 1]], [[-2, 1], [-1, 2]], [[-3, 2], [3, 0]])', 'sylvester(A,B,C)'],
6
+ examples: ['sylvester([[-1, -2], [1, 1]], [[-2, 1], [-1, 2]], [[-3, 2], [3, 0]])', 'A = [[-1, -2], [1, 1]]; B = [[2, -1], [1, -2]]; C = [[-3, 2], [3, 0]]', 'sylvester(A, B, C)'],
7
7
  seealso: ['schur', 'lyap']
8
8
  };
@@ -3,6 +3,6 @@ export var invmodDocs = {
3
3
  category: 'Arithmetic',
4
4
  syntax: ['invmod(a, b)'],
5
5
  description: 'Calculate the (modular) multiplicative inverse of a modulo b. Solution to the equation ax ≣ 1 (mod b)',
6
- examples: ['invmod(8, 12)=NaN', 'invmod(7, 13)=2', 'invmod(15151, 15122)=10429'],
6
+ examples: ['invmod(8, 12)', 'invmod(7, 13)', 'invmod(15151, 15122)'],
7
7
  seealso: ['gcd', 'xgcd']
8
8
  };
@@ -1,8 +1,8 @@
1
1
  export var evaluateDocs = {
2
2
  name: 'evaluate',
3
3
  category: 'Expression',
4
- syntax: ['evaluate(expression)', 'evaluate([expr1, expr2, expr3, ...])'],
4
+ syntax: ['evaluate(expression)', 'evaluate(expression, scope)', 'evaluate([expr1, expr2, expr3, ...])', 'evaluate([expr1, expr2, expr3, ...], scope)'],
5
5
  description: 'Evaluate an expression or an array with expressions.',
6
- examples: ['evaluate("2 + 3")', 'evaluate("sqrt(" + 4 + ")")'],
6
+ examples: ['evaluate("2 + 3")', 'evaluate("sqrt(16)")', 'evaluate("2 inch to cm")', 'evaluate("sin(x * pi)", { "x": 1/2 })', 'evaluate(["width=2", "height=4","width*height"])'],
7
7
  seealso: []
8
8
  };
@@ -3,6 +3,6 @@ export var diffDocs = {
3
3
  category: 'Matrix',
4
4
  syntax: ['diff(arr)', 'diff(arr, dim)'],
5
5
  description: ['Create a new matrix or array with the difference of the passed matrix or array.', 'Dim parameter is optional and used to indicant the dimension of the array/matrix to apply the difference', 'If no dimension parameter is passed it is assumed as dimension 0', 'Dimension is zero-based in javascript and one-based in the parser', 'Arrays must be \'rectangular\' meaning arrays like [1, 2]', 'If something is passed as a matrix it will be returned as a matrix but other than that all matrices are converted to arrays'],
6
- examples: ['diff([1, 2, 4, 7, 0])', 'diff([1, 2, 4, 7, 0], 0)', 'diff(matrix([1, 2, 4, 7, 0]))', 'diff([[1, 2], [3, 4]])', 'diff([[1, 2], [3, 4]], 0)', 'diff([[1, 2], [3, 4]], 1)', 'diff([[1, 2], [3, 4]], bignumber(1))', 'diff(matrix([[1, 2], [3, 4]]), 1)', 'diff([[1, 2], matrix([3, 4])], 1)'],
6
+ examples: ['A = [1, 2, 4, 7, 0]', 'diff(A)', 'diff(A, 1)', 'B = [[1, 2], [3, 4]]', 'diff(B)', 'diff(B, 1)', 'diff(B, 2)', 'diff(B, bignumber(2))', 'diff([[1, 2], matrix([3, 4])], 2)'],
7
7
  seealso: ['subtract', 'partitionSelect']
8
8
  };
@@ -3,6 +3,6 @@ export var rangeDocs = {
3
3
  category: 'Type',
4
4
  syntax: ['start:end', 'start:step:end', 'range(start, end)', 'range(start, end, step)', 'range(string)'],
5
5
  description: 'Create a range. Lower bound of the range is included, upper bound is excluded.',
6
- examples: ['1:5', '3:-1:-3', 'range(3, 7)', 'range(0, 12, 2)', 'range("4:10")', 'a = [1, 2, 3, 4; 5, 6, 7, 8]', 'a[1:2, 1:2]'],
6
+ examples: ['1:5', '3:-1:-3', 'range(3, 7)', 'range(0, 12, 2)', 'range("4:10")', 'range(1m, 1m, 3m)', 'a = [1, 2, 3, 4; 5, 6, 7, 8]', 'a[1:2, 1:2]'],
7
7
  seealso: ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros']
8
8
  };
@@ -0,0 +1,8 @@
1
+ export var solveODEDocs = {
2
+ name: 'solveODE',
3
+ category: 'Numeric',
4
+ syntax: ['solveODE(func, tspan, y0)', 'solveODE(func, tspan, y0, options)'],
5
+ description: 'Numerical Integration of Ordinary Differential Equations.',
6
+ examples: ['f(t,y) = y', 'tspan = [0, 4]', 'solveODE(f, tspan, 1)', 'solveODE(f, tspan, [1, 2])', 'solveODE(f, tspan, 1, { method:"RK23", maxStep:0.1 })'],
7
+ seealso: ['derivative', 'simplifyCore']
8
+ };
@@ -0,0 +1,8 @@
1
+ export var freqzDocs = {
2
+ name: 'freqz',
3
+ category: 'Signal',
4
+ syntax: ['freqz(b, a)', 'freqz(b, a, w)'],
5
+ description: 'Calculates the frequency response of a filter given its numerator and denominator coefficients.',
6
+ examples: ['freqz([1, 2], [1, 2, 3])', 'freqz([1, 2], [1, 2, 3], [0, 1])', 'freqz([1, 2], [1, 2, 3], 512)'],
7
+ seealso: []
8
+ };
@@ -0,0 +1,8 @@
1
+ export var zpk2tfDocs = {
2
+ name: 'zpk2tf',
3
+ category: 'Signal',
4
+ syntax: ['zpk2tf(z, p, k)'],
5
+ description: 'Compute the transfer function of a zero-pole-gain model.',
6
+ examples: ['zpk2tf([1, 2], [-1, -2], 1)', 'zpk2tf([1, 2], [-1, -2])', 'zpk2tf([1 - 3i, 2 + 2i], [-1, -2])'],
7
+ seealso: []
8
+ };
@@ -3,6 +3,6 @@ export var numericDocs = {
3
3
  category: 'Utils',
4
4
  syntax: ['numeric(x)'],
5
5
  description: 'Convert a numeric input to a specific numeric type: number, BigNumber, or Fraction.',
6
- examples: ['numeric("4")', 'numeric("4", "number")', 'numeric("4", "BigNumber")', 'numeric("4", "Fraction)', 'numeric(4, "Fraction")', 'numeric(fraction(2, 5), "number)'],
6
+ examples: ['numeric("4")', 'numeric("4", "number")', 'numeric("4", "BigNumber")', 'numeric("4", "Fraction")', 'numeric(4, "Fraction")', 'numeric(fraction(2, 5), "number")'],
7
7
  seealso: ['number', 'fraction', 'bignumber', 'string', 'format']
8
8
  };
@@ -2,7 +2,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import { isAccessorNode, isFunctionAssignmentNode, isIndexNode, isNode, isSymbolNode } from '../../utils/is.js';
3
3
  import { escape, format } from '../../utils/string.js';
4
4
  import { hasOwnProperty } from '../../utils/object.js';
5
- import { getSafeProperty, validateSafeMethod } from '../../utils/customs.js';
5
+ import { getSafeProperty, getSafeMethod } from '../../utils/customs.js';
6
6
  import { createSubScope } from '../../utils/scope.js';
7
7
  import { factory } from '../../utils/factory.js';
8
8
  import { defaultTemplate, latexFunctions } from '../../utils/latex.js';
@@ -203,7 +203,7 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
203
203
  // the function symbol is an argName
204
204
  var _rawArgs = this.args;
205
205
  return function evalFunctionNode(scope, args, context) {
206
- var fn = args[_name];
206
+ var fn = getSafeProperty(args, _name);
207
207
  if (typeof fn !== 'function') {
208
208
  throw new TypeError("Argument '".concat(_name, "' was not a function; received: ").concat(strin(fn)));
209
209
  }
@@ -225,15 +225,14 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
225
225
  var _rawArgs2 = this.args;
226
226
  return function evalFunctionNode(scope, args, context) {
227
227
  var object = evalObject(scope, args, context);
228
- validateSafeMethod(object, prop);
229
- var isRaw = object[prop] && object[prop].rawArgs;
230
- if (isRaw) {
228
+ var fn = getSafeMethod(object, prop);
229
+ if (fn !== null && fn !== void 0 && fn.rawArgs) {
231
230
  // "Raw" evaluation
232
- return object[prop](_rawArgs2, math, createSubScope(scope, args), scope);
231
+ return fn(_rawArgs2, math, createSubScope(scope, args), scope);
233
232
  } else {
234
233
  // "regular" evaluation
235
234
  var values = evalArgs.map(evalArg => evalArg(scope, args, context));
236
- return object[prop].apply(object, values);
235
+ return fn.apply(object, values);
237
236
  }
238
237
  };
239
238
  } else {
@@ -1,9 +1,9 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import { getSafeProperty } from '../../utils/customs.js';
3
+ import { factory } from '../../utils/factory.js';
2
4
  import { isNode } from '../../utils/is.js';
3
- import { escape, stringify } from '../../utils/string.js';
4
- import { isSafeProperty } from '../../utils/customs.js';
5
5
  import { hasOwnProperty } from '../../utils/object.js';
6
- import { factory } from '../../utils/factory.js';
6
+ import { escape, stringify } from '../../utils/string.js';
7
7
  var name = 'ObjectNode';
8
8
  var dependencies = ['Node'];
9
9
  export var createObjectNode = /* #__PURE__ */factory(name, dependencies, _ref => {
@@ -58,10 +58,8 @@ export var createObjectNode = /* #__PURE__ */factory(name, dependencies, _ref =>
58
58
  // so you cannot create a key like {"co\\u006Estructor": null}
59
59
  var stringifiedKey = stringify(key);
60
60
  var parsedKey = JSON.parse(stringifiedKey);
61
- if (!isSafeProperty(this.properties, parsedKey)) {
62
- throw new Error('No access to property "' + parsedKey + '"');
63
- }
64
- evalEntries[parsedKey] = this.properties[key]._compile(math, argNames);
61
+ var prop = getSafeProperty(this.properties, key);
62
+ evalEntries[parsedKey] = prop._compile(math, argNames);
65
63
  }
66
64
  }
67
65
  return function evalObjectNode(scope, args, context) {
@@ -61,7 +61,7 @@ export var createSymbolNode = /* #__PURE__ */factory(name, dependencies, _ref =>
61
61
  // (like an x when inside the expression of a function
62
62
  // assignment `f(x) = ...`)
63
63
  return function (scope, args, context) {
64
- return args[name];
64
+ return getSafeProperty(args, name);
65
65
  };
66
66
  } else if (name in math) {
67
67
  return function (scope, args, context) {
@@ -1,7 +1,7 @@
1
1
  import { factory } from '../../utils/factory.js';
2
2
  import { createRange } from '../../function/matrix/range.js';
3
3
  var name = 'range';
4
- var dependencies = ['typed', 'config', '?matrix', '?bignumber', 'smaller', 'smallerEq', 'larger', 'largerEq'];
4
+ var dependencies = ['typed', 'config', '?matrix', '?bignumber', 'smaller', 'smallerEq', 'larger', 'largerEq', 'add', 'isPositive'];
5
5
  export var createRangeTransform = /* #__PURE__ */factory(name, dependencies, _ref => {
6
6
  var {
7
7
  typed,
@@ -11,7 +11,9 @@ export var createRangeTransform = /* #__PURE__ */factory(name, dependencies, _re
11
11
  smaller,
12
12
  smallerEq,
13
13
  larger,
14
- largerEq
14
+ largerEq,
15
+ add,
16
+ isPositive
15
17
  } = _ref;
16
18
  var range = createRange({
17
19
  typed,
@@ -21,7 +23,9 @@ export var createRangeTransform = /* #__PURE__ */factory(name, dependencies, _re
21
23
  smaller,
22
24
  smallerEq,
23
25
  larger,
24
- largerEq
26
+ largerEq,
27
+ add,
28
+ isPositive
25
29
  });
26
30
 
27
31
  /**
@@ -94,6 +94,7 @@ export { createCtranspose } from './function/matrix/ctranspose.js';
94
94
  export { createZeros } from './function/matrix/zeros.js';
95
95
  export { createFft } from './function/matrix/fft.js';
96
96
  export { createIfft } from './function/matrix/ifft.js';
97
+ export { createSolveODE } from './function/numeric/solveODE.js';
97
98
  export { createErf } from './function/special/erf.js';
98
99
  export { createMode } from './function/statistics/mode.js';
99
100
  export { createProd } from './function/statistics/prod.js';
@@ -258,6 +259,8 @@ export { createResolve } from './function/algebra/resolve.js';
258
259
  export { createSymbolicEqual } from './function/algebra/symbolicEqual.js';
259
260
  export { createDerivative } from './function/algebra/derivative.js';
260
261
  export { createRationalize } from './function/algebra/rationalize.js';
262
+ export { createZpk2tf } from './function/signal/zpk2tf.js';
263
+ export { createFreqz } from './function/signal/freqz.js';
261
264
  export { createReviver } from './json/reviver.js';
262
265
  export { createReplacer } from './json/replacer.js';
263
266
  export { createE, createUppercaseE, createFalse, createI, createInfinity, createLN10, createLN2, createLOG10E, createLOG2E, createNaN, createNull, createPhi, createPi, createUppercasePi, createSQRT1_2,
@@ -533,6 +533,9 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
533
533
  },
534
534
  // undo replace 'subtract'
535
535
  {
536
+ l: 'n+-(n1)',
537
+ r: 'n-(n1)'
538
+ }, {
536
539
  s: 'n*(n1^-1) -> n/n1',
537
540
  // undo replace 'divide'; for * commutative
538
541
  assuming: {
@@ -1,7 +1,7 @@
1
1
  import { factory } from '../../utils/factory.js';
2
2
  import { noBignumber, noMatrix } from '../../utils/noop.js';
3
3
  var name = 'range';
4
- var dependencies = ['typed', 'config', '?matrix', '?bignumber', 'smaller', 'smallerEq', 'larger', 'largerEq'];
4
+ var dependencies = ['typed', 'config', '?matrix', '?bignumber', 'smaller', 'smallerEq', 'larger', 'largerEq', 'add', 'isPositive'];
5
5
  export var createRange = /* #__PURE__ */factory(name, dependencies, _ref => {
6
6
  var {
7
7
  typed,
@@ -11,7 +11,9 @@ export var createRange = /* #__PURE__ */factory(name, dependencies, _ref => {
11
11
  smaller,
12
12
  smallerEq,
13
13
  larger,
14
- largerEq
14
+ largerEq,
15
+ add,
16
+ isPositive
15
17
  } = _ref;
16
18
  /**
17
19
  * Create an array from a range.
@@ -33,11 +35,11 @@ export var createRange = /* #__PURE__ */factory(name, dependencies, _ref => {
33
35
  *
34
36
  * - `str: string`
35
37
  * A string 'start:end' or 'start:step:end'
36
- * - `start: {number | BigNumber}`
38
+ * - `start: {number | BigNumber | Unit}`
37
39
  * Start of the range
38
- * - `end: number | BigNumber`
40
+ * - `end: number | BigNumber | Unit`
39
41
  * End of the range, excluded by default, included when parameter includeEnd=true
40
- * - `step: number | BigNumber`
42
+ * - `step: number | BigNumber | Unit`
41
43
  * Step size. Default value is 1.
42
44
  * - `includeEnd: boolean`
43
45
  * Option to specify whether to include the end or not. False by default.
@@ -48,6 +50,7 @@ export var createRange = /* #__PURE__ */factory(name, dependencies, _ref => {
48
50
  * math.range(2, -3, -1) // [2, 1, 0, -1, -2]
49
51
  * math.range('2:1:6') // [2, 3, 4, 5]
50
52
  * math.range(2, 6, true) // [2, 3, 4, 5, 6]
53
+ * math.range(math.unit(2, 'm'), math.unit(-3, 'm'), math.unit(-1, 'm')) // [2 m, 1 m, 0 m , -1 m, -2 m]
51
54
  *
52
55
  * See also:
53
56
  *
@@ -63,30 +66,36 @@ export var createRange = /* #__PURE__ */factory(name, dependencies, _ref => {
63
66
  string: _strRange,
64
67
  'string, boolean': _strRange,
65
68
  'number, number': function numberNumber(start, end) {
66
- return _out(_rangeEx(start, end, 1));
69
+ return _out(_range(start, end, 1, false));
67
70
  },
68
71
  'number, number, number': function numberNumberNumber(start, end, step) {
69
- return _out(_rangeEx(start, end, step));
72
+ return _out(_range(start, end, step, false));
70
73
  },
71
74
  'number, number, boolean': function numberNumberBoolean(start, end, includeEnd) {
72
- return includeEnd ? _out(_rangeInc(start, end, 1)) : _out(_rangeEx(start, end, 1));
75
+ return _out(_range(start, end, 1, includeEnd));
73
76
  },
74
77
  'number, number, number, boolean': function numberNumberNumberBoolean(start, end, step, includeEnd) {
75
- return includeEnd ? _out(_rangeInc(start, end, step)) : _out(_rangeEx(start, end, step));
78
+ return _out(_range(start, end, step, includeEnd));
76
79
  },
77
80
  'BigNumber, BigNumber': function BigNumberBigNumber(start, end) {
78
81
  var BigNumber = start.constructor;
79
- return _out(_bigRangeEx(start, end, new BigNumber(1)));
82
+ return _out(_range(start, end, new BigNumber(1), false));
80
83
  },
81
84
  'BigNumber, BigNumber, BigNumber': function BigNumberBigNumberBigNumber(start, end, step) {
82
- return _out(_bigRangeEx(start, end, step));
85
+ return _out(_range(start, end, step, false));
83
86
  },
84
87
  'BigNumber, BigNumber, boolean': function BigNumberBigNumberBoolean(start, end, includeEnd) {
85
88
  var BigNumber = start.constructor;
86
- return includeEnd ? _out(_bigRangeInc(start, end, new BigNumber(1))) : _out(_bigRangeEx(start, end, new BigNumber(1)));
89
+ return _out(_range(start, end, new BigNumber(1), includeEnd));
87
90
  },
88
91
  'BigNumber, BigNumber, BigNumber, boolean': function BigNumberBigNumberBigNumberBoolean(start, end, step, includeEnd) {
89
- return includeEnd ? _out(_bigRangeInc(start, end, step)) : _out(_bigRangeEx(start, end, step));
92
+ return _out(_range(start, end, step, includeEnd));
93
+ },
94
+ 'Unit, Unit, Unit': function UnitUnitUnit(start, end, step) {
95
+ return _out(_range(start, end, step, false));
96
+ },
97
+ 'Unit, Unit, Unit, boolean': function UnitUnitUnitBoolean(start, end, step, includeEnd) {
98
+ return _out(_range(start, end, step, includeEnd));
90
99
  }
91
100
  });
92
101
  function _out(arr) {
@@ -100,117 +109,32 @@ export var createRange = /* #__PURE__ */factory(name, dependencies, _ref => {
100
109
  if (!r) {
101
110
  throw new SyntaxError('String "' + str + '" is no valid range');
102
111
  }
103
- var fn;
104
112
  if (config.number === 'BigNumber') {
105
113
  if (bignumber === undefined) {
106
114
  noBignumber();
107
115
  }
108
- fn = includeEnd ? _bigRangeInc : _bigRangeEx;
109
- return _out(fn(bignumber(r.start), bignumber(r.end), bignumber(r.step)));
116
+ return _out(_range(bignumber(r.start), bignumber(r.end), bignumber(r.step)), includeEnd);
110
117
  } else {
111
- fn = includeEnd ? _rangeInc : _rangeEx;
112
- return _out(fn(r.start, r.end, r.step));
113
- }
114
- }
115
-
116
- /**
117
- * Create a range with numbers. End is excluded
118
- * @param {number} start
119
- * @param {number} end
120
- * @param {number} step
121
- * @returns {Array} range
122
- * @private
123
- */
124
- function _rangeEx(start, end, step) {
125
- var array = [];
126
- var x = start;
127
- if (step > 0) {
128
- while (smaller(x, end)) {
129
- array.push(x);
130
- x += step;
131
- }
132
- } else if (step < 0) {
133
- while (larger(x, end)) {
134
- array.push(x);
135
- x += step;
136
- }
137
- }
138
- return array;
139
- }
140
-
141
- /**
142
- * Create a range with numbers. End is included
143
- * @param {number} start
144
- * @param {number} end
145
- * @param {number} step
146
- * @returns {Array} range
147
- * @private
148
- */
149
- function _rangeInc(start, end, step) {
150
- var array = [];
151
- var x = start;
152
- if (step > 0) {
153
- while (smallerEq(x, end)) {
154
- array.push(x);
155
- x += step;
156
- }
157
- } else if (step < 0) {
158
- while (largerEq(x, end)) {
159
- array.push(x);
160
- x += step;
161
- }
162
- }
163
- return array;
164
- }
165
-
166
- /**
167
- * Create a range with big numbers. End is excluded
168
- * @param {BigNumber} start
169
- * @param {BigNumber} end
170
- * @param {BigNumber} step
171
- * @returns {Array} range
172
- * @private
173
- */
174
- function _bigRangeEx(start, end, step) {
175
- var zero = bignumber(0);
176
- var array = [];
177
- var x = start;
178
- if (step.gt(zero)) {
179
- while (smaller(x, end)) {
180
- array.push(x);
181
- x = x.plus(step);
182
- }
183
- } else if (step.lt(zero)) {
184
- while (larger(x, end)) {
185
- array.push(x);
186
- x = x.plus(step);
187
- }
118
+ return _out(_range(r.start, r.end, r.step, includeEnd));
188
119
  }
189
- return array;
190
120
  }
191
121
 
192
122
  /**
193
- * Create a range with big numbers. End is included
194
- * @param {BigNumber} start
195
- * @param {BigNumber} end
196
- * @param {BigNumber} step
123
+ * Create a range with numbers or BigNumbers
124
+ * @param {number | BigNumber | Unit} start
125
+ * @param {number | BigNumber | Unit} end
126
+ * @param {number | BigNumber | Unit} step
127
+ * @param {boolean} includeEnd
197
128
  * @returns {Array} range
198
129
  * @private
199
130
  */
200
- function _bigRangeInc(start, end, step) {
201
- var zero = bignumber(0);
131
+ function _range(start, end, step, includeEnd) {
202
132
  var array = [];
133
+ var ongoing = isPositive(step) ? includeEnd ? smallerEq : smaller : includeEnd ? largerEq : larger;
203
134
  var x = start;
204
- if (step.gt(zero)) {
205
- while (smallerEq(x, end)) {
206
- array.push(x);
207
- x = x.plus(step);
208
- }
209
- } else if (step.lt(zero)) {
210
- while (largerEq(x, end)) {
211
- array.push(x);
212
- x = x.plus(step);
213
- }
135
+ while (ongoing(x, end)) {
136
+ array.push(x);
137
+ x = add(x, step);
214
138
  }
215
139
  return array;
216
140
  }