arrayMapper.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _array = require('./../helpers/array');
  4. var _object = require('./../helpers/object');
  5. var _number = require('./../helpers/number');
  6. var MIXIN_NAME = 'arrayMapper';
  7. /**
  8. * @type {Object}
  9. */
  10. var arrayMapper = {
  11. _arrayMap: [],
  12. /**
  13. * Get value by map index.
  14. *
  15. * @param {Number} index Array index.
  16. * @return {*} Returns value mapped to passed index.
  17. */
  18. getValueByIndex: function getValueByIndex(index) {
  19. var value = void 0;
  20. /* eslint-disable no-cond-assign */
  21. return (value = this._arrayMap[index]) === void 0 ? null : value;
  22. },
  23. /**
  24. * Get map index by its value.
  25. *
  26. * @param {*} value Value to search.
  27. * @returns {Number} Returns array index.
  28. */
  29. getIndexByValue: function getIndexByValue(value) {
  30. var index = void 0;
  31. /* eslint-disable no-cond-assign */
  32. return (index = this._arrayMap.indexOf(value)) === -1 ? null : index;
  33. },
  34. /**
  35. * Insert new items to array mapper starting at passed index. New entries will be a continuation of last value in the array.
  36. *
  37. * @param {Number} index Array index.
  38. * @param {Number} [amount=1] Defines how many items will be created to an array.
  39. * @returns {Array} Returns added items.
  40. */
  41. insertItems: function insertItems(index) {
  42. var _this = this;
  43. var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  44. var newIndex = (0, _array.arrayMax)(this._arrayMap) + 1;
  45. var addedItems = [];
  46. (0, _number.rangeEach)(amount - 1, function (count) {
  47. addedItems.push(_this._arrayMap.splice(index + count, 0, newIndex + count));
  48. });
  49. return addedItems;
  50. },
  51. /**
  52. * Remove items from array mapper.
  53. *
  54. * @param {Number} index Array index.
  55. * @param {Number} [amount=1] Defines how many items will be created to an array.
  56. * @returns {Array} Returns removed items.
  57. */
  58. removeItems: function removeItems(index) {
  59. var _this2 = this;
  60. var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  61. var removedItems = [];
  62. if (Array.isArray(index)) {
  63. var mapCopy = [].concat(this._arrayMap);
  64. // Sort descending
  65. index.sort(function (a, b) {
  66. return b - a;
  67. });
  68. removedItems = (0, _array.arrayReduce)(index, function (acc, item) {
  69. _this2._arrayMap.splice(item, 1);
  70. return acc.concat(mapCopy.slice(item, item + 1));
  71. }, []);
  72. } else {
  73. removedItems = this._arrayMap.splice(index, amount);
  74. }
  75. return removedItems;
  76. },
  77. /**
  78. * Unshift items (remove and shift chunk of array to the left).
  79. *
  80. * @param {Number|Array} index Array index or Array of indexes to unshift.
  81. * @param {Number} [amount=1] Defines how many items will be removed from an array (when index is passed as number).
  82. */
  83. unshiftItems: function unshiftItems(index) {
  84. var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  85. var removedItems = this.removeItems(index, amount);
  86. function countRowShift(logicalRow) {
  87. // Todo: compare perf between reduce vs sort->each->brake
  88. return (0, _array.arrayReduce)(removedItems, function (count, removedLogicalRow) {
  89. if (logicalRow > removedLogicalRow) {
  90. count++;
  91. }
  92. return count;
  93. }, 0);
  94. }
  95. this._arrayMap = (0, _array.arrayMap)(this._arrayMap, function (logicalRow, physicalRow) {
  96. var rowShift = countRowShift(logicalRow);
  97. if (rowShift) {
  98. logicalRow -= rowShift;
  99. }
  100. return logicalRow;
  101. });
  102. },
  103. /**
  104. * Shift (right shifting) items starting at passed index.
  105. *
  106. * @param {Number} index Array index.
  107. * @param {Number} [amount=1] Defines how many items will be created to an array.
  108. */
  109. shiftItems: function shiftItems(index) {
  110. var _this3 = this;
  111. var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  112. this._arrayMap = (0, _array.arrayMap)(this._arrayMap, function (row) {
  113. if (row >= index) {
  114. row += amount;
  115. }
  116. return row;
  117. });
  118. (0, _number.rangeEach)(amount - 1, function (count) {
  119. _this3._arrayMap.splice(index + count, 0, index + count);
  120. });
  121. },
  122. /**
  123. * Clear all stored index<->value information from an array.
  124. */
  125. clearMap: function clearMap() {
  126. this._arrayMap.length = 0;
  127. }
  128. };
  129. (0, _object.defineGetter)(arrayMapper, 'MIXIN_NAME', MIXIN_NAME, {
  130. writable: false,
  131. enumerable: false
  132. });
  133. exports.default = arrayMapper;