mathjs 11.8.2 → 11.9.1

Sign up to get free protection for your applications and to get access to all the features.
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
  }