index.transform.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { isArray, isBigNumber, isMatrix, isNumber, isRange } from '../../utils/is.js';
  2. import { factory } from '../../utils/factory.js';
  3. var name = 'index';
  4. var dependencies = ['Index'];
  5. export var createIndexTransform = /* #__PURE__ */factory(name, dependencies, _ref => {
  6. var {
  7. Index
  8. } = _ref;
  9. /**
  10. * Attach a transform function to math.index
  11. * Adds a property transform containing the transform function.
  12. *
  13. * This transform creates a one-based index instead of a zero-based index
  14. */
  15. return function indexTransform() {
  16. var args = [];
  17. for (var i = 0, ii = arguments.length; i < ii; i++) {
  18. var arg = arguments[i];
  19. // change from one-based to zero based, and convert BigNumber to number
  20. if (isRange(arg)) {
  21. arg.start--;
  22. arg.end -= arg.step > 0 ? 0 : 2;
  23. } else if (arg && arg.isSet === true) {
  24. arg = arg.map(function (v) {
  25. return v - 1;
  26. });
  27. } else if (isArray(arg) || isMatrix(arg)) {
  28. arg = arg.map(function (v) {
  29. return v - 1;
  30. });
  31. } else if (isNumber(arg)) {
  32. arg--;
  33. } else if (isBigNumber(arg)) {
  34. arg = arg.toNumber() - 1;
  35. } else if (typeof arg === 'string') {
  36. // leave as is
  37. } else {
  38. throw new TypeError('Dimension must be an Array, Matrix, number, string, or Range');
  39. }
  40. args[i] = arg;
  41. }
  42. var res = new Index();
  43. Index.apply(res, args);
  44. return res;
  45. };
  46. }, {
  47. isTransformFunction: true
  48. });