132 lines
4.2 KiB
JavaScript
132 lines
4.2 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.track = exports.resetOffsetStack = exports.offsetStack = exports.setTracking = void 0;
|
||
|
let tracking = true;
|
||
|
let stackOffset = 0;
|
||
|
function setTracking(value) {
|
||
|
tracking = value;
|
||
|
}
|
||
|
exports.setTracking = setTracking;
|
||
|
function offsetStack() {
|
||
|
stackOffset++;
|
||
|
}
|
||
|
exports.offsetStack = offsetStack;
|
||
|
function resetOffsetStack() {
|
||
|
stackOffset--;
|
||
|
}
|
||
|
exports.resetOffsetStack = resetOffsetStack;
|
||
|
function track(segments, stacks = []) {
|
||
|
return [
|
||
|
new Proxy(segments, {
|
||
|
get(target, prop, receiver) {
|
||
|
if (tracking) {
|
||
|
if (prop === 'push')
|
||
|
return push;
|
||
|
if (prop === 'pop')
|
||
|
return pop;
|
||
|
if (prop === 'shift')
|
||
|
return shift;
|
||
|
if (prop === 'unshift')
|
||
|
return unshift;
|
||
|
if (prop === 'splice')
|
||
|
return splice;
|
||
|
if (prop === 'sort')
|
||
|
return sort;
|
||
|
if (prop === 'reverse')
|
||
|
return reverse;
|
||
|
}
|
||
|
return Reflect.get(target, prop, receiver);
|
||
|
}
|
||
|
}),
|
||
|
stacks,
|
||
|
];
|
||
|
function push(...items) {
|
||
|
stacks.push({ stack: getStack(), length: items.length });
|
||
|
return segments.push(...items);
|
||
|
}
|
||
|
function pop() {
|
||
|
if (stacks.length) {
|
||
|
const last = stacks[stacks.length - 1];
|
||
|
if (last.length > 1) {
|
||
|
last.length--;
|
||
|
}
|
||
|
else {
|
||
|
stacks.pop();
|
||
|
}
|
||
|
}
|
||
|
return segments.pop();
|
||
|
}
|
||
|
function shift() {
|
||
|
if (stacks.length) {
|
||
|
const first = stacks[0];
|
||
|
if (first.length > 1) {
|
||
|
first.length--;
|
||
|
}
|
||
|
else {
|
||
|
stacks.shift();
|
||
|
}
|
||
|
}
|
||
|
return segments.shift();
|
||
|
}
|
||
|
function unshift(...items) {
|
||
|
stacks.unshift({ stack: getStack(), length: items.length });
|
||
|
return segments.unshift(...items);
|
||
|
}
|
||
|
function splice(start, deleteCount, ...items) {
|
||
|
if (deleteCount === undefined) {
|
||
|
deleteCount = segments.length - start;
|
||
|
}
|
||
|
let _stackStart = 0;
|
||
|
let operateIndex;
|
||
|
for (let i = 0; i < stacks.length; i++) {
|
||
|
const stack = stacks[i];
|
||
|
const stackStart = _stackStart;
|
||
|
const stackEnd = stackStart + stack.length;
|
||
|
_stackStart = stackEnd;
|
||
|
if (start >= stackStart) {
|
||
|
operateIndex = i + 1;
|
||
|
const originalLength = stack.length;
|
||
|
stack.length = start - stackStart;
|
||
|
stacks.splice(operateIndex, 0, { stack: stack.stack, length: originalLength - stack.length });
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (operateIndex === undefined) {
|
||
|
throw new Error('Invalid splice operation');
|
||
|
}
|
||
|
let _deleteCount = deleteCount;
|
||
|
for (let i = operateIndex; i < stacks.length; i++) {
|
||
|
const stack = stacks[i];
|
||
|
while (_deleteCount > 0 && stack.length > 0) {
|
||
|
stack.length--;
|
||
|
_deleteCount--;
|
||
|
}
|
||
|
if (_deleteCount === 0) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
stacks.splice(operateIndex, 0, { stack: getStack(), length: items.length });
|
||
|
return segments.splice(start, deleteCount, ...items);
|
||
|
}
|
||
|
function sort(compareFn) {
|
||
|
stacks.splice(0, stacks.length, { stack: getStack(), length: segments.length });
|
||
|
return segments.sort(compareFn);
|
||
|
}
|
||
|
function reverse() {
|
||
|
stacks.splice(0, stacks.length, { stack: getStack(), length: segments.length });
|
||
|
return segments.reverse();
|
||
|
}
|
||
|
function getStack() {
|
||
|
const stack = new Error().stack;
|
||
|
let source = stack.split('\n')[3 + stackOffset].trim();
|
||
|
if (source.endsWith(')')) {
|
||
|
source = source.slice(source.lastIndexOf('(') + 1, -1);
|
||
|
}
|
||
|
else {
|
||
|
source = source.slice(source.lastIndexOf(' ') + 1);
|
||
|
}
|
||
|
return source;
|
||
|
}
|
||
|
}
|
||
|
exports.track = track;
|
||
|
//# sourceMappingURL=track.js.map
|