track.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.track = exports.resetOffsetStack = exports.offsetStack = exports.setTracking = void 0;
  4. let tracking = true;
  5. let stackOffset = 0;
  6. function setTracking(value) {
  7. tracking = value;
  8. }
  9. exports.setTracking = setTracking;
  10. function offsetStack() {
  11. stackOffset++;
  12. }
  13. exports.offsetStack = offsetStack;
  14. function resetOffsetStack() {
  15. stackOffset--;
  16. }
  17. exports.resetOffsetStack = resetOffsetStack;
  18. function track(segments, stacks = []) {
  19. return [
  20. new Proxy(segments, {
  21. get(target, prop, receiver) {
  22. if (tracking) {
  23. if (prop === 'push')
  24. return push;
  25. if (prop === 'pop')
  26. return pop;
  27. if (prop === 'shift')
  28. return shift;
  29. if (prop === 'unshift')
  30. return unshift;
  31. if (prop === 'splice')
  32. return splice;
  33. if (prop === 'sort')
  34. return sort;
  35. if (prop === 'reverse')
  36. return reverse;
  37. }
  38. return Reflect.get(target, prop, receiver);
  39. }
  40. }),
  41. stacks,
  42. ];
  43. function push(...items) {
  44. stacks.push({ stack: getStack(), length: items.length });
  45. return segments.push(...items);
  46. }
  47. function pop() {
  48. if (stacks.length) {
  49. const last = stacks[stacks.length - 1];
  50. if (last.length > 1) {
  51. last.length--;
  52. }
  53. else {
  54. stacks.pop();
  55. }
  56. }
  57. return segments.pop();
  58. }
  59. function shift() {
  60. if (stacks.length) {
  61. const first = stacks[0];
  62. if (first.length > 1) {
  63. first.length--;
  64. }
  65. else {
  66. stacks.shift();
  67. }
  68. }
  69. return segments.shift();
  70. }
  71. function unshift(...items) {
  72. stacks.unshift({ stack: getStack(), length: items.length });
  73. return segments.unshift(...items);
  74. }
  75. function splice(start, deleteCount, ...items) {
  76. if (deleteCount === undefined) {
  77. deleteCount = segments.length - start;
  78. }
  79. let _stackStart = 0;
  80. let operateIndex;
  81. for (let i = 0; i < stacks.length; i++) {
  82. const stack = stacks[i];
  83. const stackStart = _stackStart;
  84. const stackEnd = stackStart + stack.length;
  85. _stackStart = stackEnd;
  86. if (start >= stackStart) {
  87. operateIndex = i + 1;
  88. const originalLength = stack.length;
  89. stack.length = start - stackStart;
  90. stacks.splice(operateIndex, 0, { stack: stack.stack, length: originalLength - stack.length });
  91. break;
  92. }
  93. }
  94. if (operateIndex === undefined) {
  95. throw new Error('Invalid splice operation');
  96. }
  97. let _deleteCount = deleteCount;
  98. for (let i = operateIndex; i < stacks.length; i++) {
  99. const stack = stacks[i];
  100. while (_deleteCount > 0 && stack.length > 0) {
  101. stack.length--;
  102. _deleteCount--;
  103. }
  104. if (_deleteCount === 0) {
  105. break;
  106. }
  107. }
  108. stacks.splice(operateIndex, 0, { stack: getStack(), length: items.length });
  109. return segments.splice(start, deleteCount, ...items);
  110. }
  111. function sort(compareFn) {
  112. stacks.splice(0, stacks.length, { stack: getStack(), length: segments.length });
  113. return segments.sort(compareFn);
  114. }
  115. function reverse() {
  116. stacks.splice(0, stacks.length, { stack: getStack(), length: segments.length });
  117. return segments.reverse();
  118. }
  119. function getStack() {
  120. const stack = new Error().stack;
  121. let source = stack.split('\n')[3 + stackOffset].trim();
  122. if (source.endsWith(')')) {
  123. source = source.slice(source.lastIndexOf('(') + 1, -1);
  124. }
  125. else {
  126. source = source.slice(source.lastIndexOf(' ') + 1);
  127. }
  128. return source;
  129. }
  130. }
  131. exports.track = track;
  132. //# sourceMappingURL=track.js.map