@x-oasis/prefix-interval-tree 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/prefix-interval-tree.cjs.development.js +8 -8
- package/dist/prefix-interval-tree.cjs.development.js.map +1 -1
- package/dist/prefix-interval-tree.cjs.production.min.js +1 -1
- package/dist/prefix-interval-tree.cjs.production.min.js.map +1 -1
- package/dist/prefix-interval-tree.esm.js +8 -8
- package/dist/prefix-interval-tree.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +8 -8
|
@@ -216,12 +216,12 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
|
|
|
216
216
|
return this.sumUntil(end) - this.sumUntil(begin);
|
|
217
217
|
};
|
|
218
218
|
_proto.greatestLowerBound = function greatestLowerBound(t) {
|
|
219
|
-
if (t < 0) {
|
|
219
|
+
if (t < 0 || !this._actualSize) {
|
|
220
220
|
return -1;
|
|
221
221
|
}
|
|
222
222
|
var node = 1;
|
|
223
223
|
if (this._heap[node] < t) {
|
|
224
|
-
return
|
|
224
|
+
return this._actualSize;
|
|
225
225
|
}
|
|
226
226
|
while (node < this._half) {
|
|
227
227
|
var leftSum = this._heap[2 * node];
|
|
@@ -232,15 +232,15 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
|
|
|
232
232
|
t -= leftSum;
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
|
-
return Math.min(node - this._half, this._actualSize
|
|
235
|
+
return Math.min(node - this._half, this._actualSize);
|
|
236
236
|
};
|
|
237
237
|
_proto.greatestStrictLowerBound = function greatestStrictLowerBound(t) {
|
|
238
|
-
if (t <= 0) {
|
|
238
|
+
if (t <= 0 || !this._actualSize) {
|
|
239
239
|
return -1;
|
|
240
240
|
}
|
|
241
241
|
var node = 1;
|
|
242
242
|
if (this._heap[node] < t) {
|
|
243
|
-
return
|
|
243
|
+
return this._actualSize;
|
|
244
244
|
}
|
|
245
245
|
while (node < this._half) {
|
|
246
246
|
var leftSum = this._heap[2 * node];
|
|
@@ -251,7 +251,7 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
|
|
|
251
251
|
t -= leftSum;
|
|
252
252
|
}
|
|
253
253
|
}
|
|
254
|
-
return Math.min(node - this._half, this._actualSize
|
|
254
|
+
return Math.min(node - this._half, this._actualSize);
|
|
255
255
|
};
|
|
256
256
|
_proto.computeRange = function computeRange(minOffset, maxOffset) {
|
|
257
257
|
if (this.getHeap()[1] < minOffset) {
|
|
@@ -266,10 +266,10 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
|
|
|
266
266
|
};
|
|
267
267
|
};
|
|
268
268
|
_proto.leastUpperBound = function leastUpperBound(t) {
|
|
269
|
-
return this.greatestStrictLowerBound(t) + 1;
|
|
269
|
+
return Math.min(this.greatestStrictLowerBound(t) + 1, this._actualSize);
|
|
270
270
|
};
|
|
271
271
|
_proto.leastStrictUpperBound = function leastStrictUpperBound(t) {
|
|
272
|
-
return this.greatestLowerBound(t) + 1;
|
|
272
|
+
return Math.min(this.greatestLowerBound(t) + 1, this._actualSize);
|
|
273
273
|
};
|
|
274
274
|
return PrefixIntervalTree;
|
|
275
275
|
}();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefix-interval-tree.cjs.development.js","sources":["../src/index.ts"],"sourcesContent":["const parent = (node: number) => Math.floor(node / 2);\n\nconst createArray = function (size: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = 0;\n }\n return xs;\n};\n\n/**\n * Computes the next power of 2 after or equal to x.\n */\nfunction ceilLog2(x: number) {\n let y = 1;\n while (y < x) {\n y *= 2;\n }\n\n return y;\n}\n\n/**\n * A prefix interval tree stores an numeric array and the partial sums of that\n * array. It is optimized for updating the values of the array without\n * recomputing all of the partial sums.\n *\n * - O(ln n) update\n * - O(1) lookup\n * - O(ln n) compute a partial sum\n * - O(n) space\n *\n * Note that the sequence of partial sums is one longer than the array, so that\n * the first partial sum is always 0, and the last partial sum is the sum of the\n * entire array.\n */\nclass PrefixIntervalTree {\n private _size: number;\n /**\n * Half the size of the heap. It is also the number of non-leaf nodes, and the\n * index of the first element in the heap. Always a power of 2.\n */\n private _half: number;\n private _heap: number[];\n\n private _actualSize: number;\n\n private _onUpdateItemLayout: Function;\n private _onUpdateIntervalTree: Function;\n\n constructor(\n xs: number[] | number,\n opts?: {\n onUpdateItemLayout?: Function;\n onUpdateIntervalTree?: Function;\n }\n ) {\n if (typeof xs === 'number') this.initWithNumber(xs);\n if (Array.isArray(xs)) this.initWithArray(xs);\n\n const { onUpdateItemLayout, onUpdateIntervalTree } = opts || {};\n this._onUpdateIntervalTree = onUpdateIntervalTree;\n this._onUpdateItemLayout = onUpdateItemLayout;\n }\n\n initWithNumber(length: number) {\n this._half = ceilLog2(length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n this._actualSize = 0;\n }\n\n initWithArray(arr: number[]) {\n this._half = ceilLog2(arr.length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n let i;\n for (i = 0; i < this._size; ++i) {\n this._heap[this._half + i] = arr[i];\n }\n\n for (i = this._half - 1; i > 0; --i) {\n this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];\n }\n this._actualSize = arr.length;\n }\n\n static uniform(size: number, initialValue: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = initialValue;\n }\n\n return new PrefixIntervalTree(xs);\n }\n\n static empty(size: number) {\n return PrefixIntervalTree.uniform(size, 0);\n }\n\n /**\n * the length should be 2\n */\n stretch() {\n const nextHeap = createArray(2 * this._half * 2);\n const nextHeapHalf = this._half * 2;\n\n // copy old value to new one\n for (let i = 0; i < this._size; i++) {\n nextHeap[nextHeapHalf + i] = this._heap[this._half + i] || 0;\n }\n\n // sum old value to create new sum value\n for (let i = nextHeapHalf - 1; i > 0; i--) {\n nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];\n }\n\n this._half = nextHeapHalf;\n this._size = nextHeapHalf;\n this._heap = nextHeap;\n }\n\n isValidIndex(index: number) {\n return typeof index === 'number' && index >= 0 && index < this._actualSize;\n }\n\n reflowHeap(startIndex: number, endIndex = this._half * 2 - 2) {\n const len = Math.log2(this._size);\n\n Array.from({ length: len }, (v, i) => i).reduce(\n (acc) => {\n const { startIndex, endIndex } = acc;\n const _nextStart = parent(startIndex);\n const _nextEnd = parent(endIndex);\n\n for (let idx = _nextStart; idx <= _nextEnd; idx++) {\n this._heap[idx] = this._heap[2 * idx] + this._heap[2 * idx + 1];\n }\n\n return {\n startIndex: _nextStart,\n endIndex: _nextEnd,\n };\n },\n {\n startIndex,\n endIndex,\n }\n );\n }\n\n remove(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n\n this.batchRemove([index]);\n }\n\n batchRemove(indices: number[]) {\n indices.sort((a, b) => a - b);\n\n indices.forEach((index) => {\n if (!this.isValidIndex(index)) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n this._heap.splice(this._half + index, 1);\n this._heap.push(0);\n this._actualSize = this._actualSize - 1;\n });\n\n this.reflowHeap(indices[0] + this._half);\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n for (let idx = indices[0]; idx < this._half; idx++) {\n this._onUpdateItemLayout(idx, this.get(idx));\n }\n }\n }\n\n removeV0(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n if (!this.isValidIndex(index)) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n const nextHeap = createArray(this._half * 2);\n const copy = this._heap.slice(this._half);\n copy.splice(index, 1);\n\n for (let index = this._half; index < this._half * 2; index++) {\n nextHeap[index] = copy[index - this._half] || 0;\n }\n\n for (let index = this._half - 1; index > 0; index--) {\n nextHeap[index] = nextHeap[2 * index] + nextHeap[2 * index + 1];\n }\n\n this._actualSize = this._actualSize - 1;\n this._heap = nextHeap;\n }\n\n set(index: number, value: number) {\n if (typeof index !== 'number' || index < 0) return false;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return false;\n }\n\n while (index >= this._half) {\n this.stretch();\n }\n\n let node = this._half + index;\n this._heap[node] = value;\n\n node = parent(node);\n for (; node !== 0; node = parent(node)) {\n this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];\n }\n\n if (index + 1 > this._actualSize) {\n this._actualSize = index + 1;\n }\n\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n this._onUpdateItemLayout(index, value);\n }\n return true;\n }\n\n getMaxUsefulLength() {\n return this.getActualSize();\n }\n\n getActualSize() {\n return this._actualSize;\n }\n\n get(index: number) {\n // invariant(index >= 0 && index < this._size, 'Index out of range %s', index);\n const node = this._half + index;\n return this._heap[node];\n }\n\n getSize() {\n return this._size;\n }\n\n getHalf() {\n return this._half;\n }\n\n getHeap() {\n return this._heap;\n }\n\n getMaxValue() {\n return this._heap[1];\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(end - 1).\n * End is not included. if end less than 0, then return 0\n */\n sumUntil(end: number) {\n // invariant(end >= 0 && end < this._size + 1, 'Index out of range %s', end);\n\n if (end <= 0) {\n return 0;\n }\n\n let node = this._half + end - 1;\n let sum = this._heap[node];\n\n for (; node !== 1; node = parent(node)) {\n if (node % 2 === 1) {\n sum += this._heap[node - 1];\n }\n }\n\n return sum;\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(inclusiveEnd).\n */\n sumTo(inclusiveEnd: number) {\n // invariant(\n // inclusiveEnd >= 0 && inclusiveEnd < this._size,\n // 'Index out of range %s',\n // inclusiveEnd\n // );\n return this.sumUntil(inclusiveEnd + 1);\n }\n\n /**\n * Returns the sum get(begin) + get(begin + 1) + ... + get(end - 1).\n * end length is not included\n */\n sum(begin: number, end: number) {\n // invariant(begin <= end, 'Begin must precede end');\n return this.sumUntil(end) - this.sumUntil(begin);\n }\n\n /**\n * return the biggest i, sumUntil(i) === t\n * return the biggest i, subUntil(i) < t\n */\n greatestLowerBound(t: number) {\n if (t < 0) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n // not use this._size;this._size always be a big value\n return Math.max(this._actualSize - 1, 0);\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t < leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._actualSize - 1);\n }\n\n /**\n * Return the biggest i, subUntil(i) < t\n * or -1 if no such i exists.\n */\n greatestStrictLowerBound(t: number) {\n if (t <= 0) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n return Math.max(this._actualSize - 1, 0);\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t <= leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._actualSize - 1);\n }\n\n /**\n *\n * @param minOffset\n * @param maxOffset\n * @returns\n *\n * pending issue:\n * when item with length list [100, 0, 100, 0, 0, 100].\n * then computeRange(100, 200) => { startIndex: 2, endIndex: 6 }\n *\n * item index in viewport will be [2, 3, 4, 5], index 6 is not\n * included just like Array.slice(start, end)\n *\n */\n computeRange(minOffset: number, maxOffset: number) {\n if (this.getHeap()[1] < minOffset) {\n return {\n startIndex: this._actualSize,\n endIndex: this._actualSize,\n };\n }\n\n return {\n // the biggest item, value <= minOffset\n startIndex: this.greatestLowerBound(minOffset),\n\n // the smallest item, value > maxOffset\n endIndex: this.leastStrictUpperBound(maxOffset),\n };\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and t <= sumUntil(i), or\n * size + 1 if no such i exists.\n */\n leastUpperBound(t: number) {\n return this.greatestStrictLowerBound(t) + 1;\n }\n\n /**\n * Returns the smallest i, t < sumUntil(i), it should be used as range end\n * size + 1 if no such i exists.\n */\n leastStrictUpperBound(t: number) {\n return this.greatestLowerBound(t) + 1;\n }\n}\n\nexport default PrefixIntervalTree;\n"],"names":["parent","node","Math","floor","createArray","size","xs","i","ceilLog2","x","y","PrefixIntervalTree","opts","initWithNumber","Array","isArray","initWithArray","_ref","onUpdateItemLayout","onUpdateIntervalTree","_onUpdateIntervalTree","_onUpdateItemLayout","_proto","prototype","length","_half","_size","_heap","_actualSize","arr","uniform","initialValue","empty","stretch","nextHeap","nextHeapHalf","isValidIndex","index","reflowHeap","startIndex","endIndex","len","log2","from","v","reduce","acc","_nextStart","_nextEnd","idx","_this","remove","batchRemove","indices","sort","a","b","forEach","_this2","isNaN","console","warn","splice","push","get","removeV0","copy","slice","set","value","getMaxUsefulLength","getActualSize","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","max","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prefix-interval-tree.cjs.development.js","sources":["../src/index.ts"],"sourcesContent":["const parent = (node: number) => Math.floor(node / 2);\n\nconst createArray = function (size: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = 0;\n }\n return xs;\n};\n\n/**\n * Computes the next power of 2 after or equal to x.\n */\nfunction ceilLog2(x: number) {\n let y = 1;\n while (y < x) {\n y *= 2;\n }\n\n return y;\n}\n\n/**\n * A prefix interval tree stores an numeric array and the partial sums of that\n * array. It is optimized for updating the values of the array without\n * recomputing all of the partial sums.\n *\n * - O(ln n) update\n * - O(1) lookup\n * - O(ln n) compute a partial sum\n * - O(n) space\n *\n * Note that the sequence of partial sums is one longer than the array, so that\n * the first partial sum is always 0, and the last partial sum is the sum of the\n * entire array.\n */\nclass PrefixIntervalTree {\n private _size: number;\n /**\n * Half the size of the heap. It is also the number of non-leaf nodes, and the\n * index of the first element in the heap. Always a power of 2.\n */\n private _half: number;\n private _heap: number[];\n\n private _actualSize: number;\n\n private _onUpdateItemLayout: Function;\n private _onUpdateIntervalTree: Function;\n\n constructor(\n xs: number[] | number,\n opts?: {\n onUpdateItemLayout?: Function;\n onUpdateIntervalTree?: Function;\n }\n ) {\n if (typeof xs === 'number') this.initWithNumber(xs);\n if (Array.isArray(xs)) this.initWithArray(xs);\n\n const { onUpdateItemLayout, onUpdateIntervalTree } = opts || {};\n this._onUpdateIntervalTree = onUpdateIntervalTree;\n this._onUpdateItemLayout = onUpdateItemLayout;\n }\n\n initWithNumber(length: number) {\n this._half = ceilLog2(length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n this._actualSize = 0;\n }\n\n initWithArray(arr: number[]) {\n this._half = ceilLog2(arr.length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n let i;\n for (i = 0; i < this._size; ++i) {\n this._heap[this._half + i] = arr[i];\n }\n\n for (i = this._half - 1; i > 0; --i) {\n this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];\n }\n this._actualSize = arr.length;\n }\n\n static uniform(size: number, initialValue: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = initialValue;\n }\n\n return new PrefixIntervalTree(xs);\n }\n\n static empty(size: number) {\n return PrefixIntervalTree.uniform(size, 0);\n }\n\n /**\n * the length should be 2\n */\n stretch() {\n const nextHeap = createArray(2 * this._half * 2);\n const nextHeapHalf = this._half * 2;\n\n // copy old value to new one\n for (let i = 0; i < this._size; i++) {\n nextHeap[nextHeapHalf + i] = this._heap[this._half + i] || 0;\n }\n\n // sum old value to create new sum value\n for (let i = nextHeapHalf - 1; i > 0; i--) {\n nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];\n }\n\n this._half = nextHeapHalf;\n this._size = nextHeapHalf;\n this._heap = nextHeap;\n }\n\n isValidIndex(index: number) {\n return typeof index === 'number' && index >= 0 && index < this._actualSize;\n }\n\n reflowHeap(startIndex: number, endIndex = this._half * 2 - 2) {\n const len = Math.log2(this._size);\n\n Array.from({ length: len }, (v, i) => i).reduce(\n (acc) => {\n const { startIndex, endIndex } = acc;\n const _nextStart = parent(startIndex);\n const _nextEnd = parent(endIndex);\n\n for (let idx = _nextStart; idx <= _nextEnd; idx++) {\n this._heap[idx] = this._heap[2 * idx] + this._heap[2 * idx + 1];\n }\n\n return {\n startIndex: _nextStart,\n endIndex: _nextEnd,\n };\n },\n {\n startIndex,\n endIndex,\n }\n );\n }\n\n remove(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n\n this.batchRemove([index]);\n }\n\n batchRemove(indices: number[]) {\n indices.sort((a, b) => a - b);\n\n indices.forEach((index) => {\n if (!this.isValidIndex(index)) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n this._heap.splice(this._half + index, 1);\n this._heap.push(0);\n this._actualSize = this._actualSize - 1;\n });\n\n this.reflowHeap(indices[0] + this._half);\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n for (let idx = indices[0]; idx < this._half; idx++) {\n this._onUpdateItemLayout(idx, this.get(idx));\n }\n }\n }\n\n removeV0(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n if (!this.isValidIndex(index)) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n const nextHeap = createArray(this._half * 2);\n const copy = this._heap.slice(this._half);\n copy.splice(index, 1);\n\n for (let index = this._half; index < this._half * 2; index++) {\n nextHeap[index] = copy[index - this._half] || 0;\n }\n\n for (let index = this._half - 1; index > 0; index--) {\n nextHeap[index] = nextHeap[2 * index] + nextHeap[2 * index + 1];\n }\n\n this._actualSize = this._actualSize - 1;\n this._heap = nextHeap;\n }\n\n set(index: number, value: number) {\n if (typeof index !== 'number' || index < 0) return false;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return false;\n }\n\n while (index >= this._half) {\n this.stretch();\n }\n\n let node = this._half + index;\n this._heap[node] = value;\n\n node = parent(node);\n for (; node !== 0; node = parent(node)) {\n this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];\n }\n\n if (index + 1 > this._actualSize) {\n this._actualSize = index + 1;\n }\n\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n this._onUpdateItemLayout(index, value);\n }\n return true;\n }\n\n getMaxUsefulLength() {\n return this.getActualSize();\n }\n\n getActualSize() {\n return this._actualSize;\n }\n\n get(index: number) {\n // invariant(index >= 0 && index < this._size, 'Index out of range %s', index);\n const node = this._half + index;\n return this._heap[node];\n }\n\n getSize() {\n return this._size;\n }\n\n getHalf() {\n return this._half;\n }\n\n getHeap() {\n return this._heap;\n }\n\n getMaxValue() {\n return this._heap[1];\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(end - 1).\n * End is not included. if end less than 0, then return 0\n */\n sumUntil(end: number) {\n // invariant(end >= 0 && end < this._size + 1, 'Index out of range %s', end);\n\n if (end <= 0) {\n return 0;\n }\n\n let node = this._half + end - 1;\n let sum = this._heap[node];\n\n for (; node !== 1; node = parent(node)) {\n if (node % 2 === 1) {\n sum += this._heap[node - 1];\n }\n }\n\n return sum;\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(inclusiveEnd).\n */\n sumTo(inclusiveEnd: number) {\n // invariant(\n // inclusiveEnd >= 0 && inclusiveEnd < this._size,\n // 'Index out of range %s',\n // inclusiveEnd\n // );\n return this.sumUntil(inclusiveEnd + 1);\n }\n\n /**\n * Returns the sum get(begin) + get(begin + 1) + ... + get(end - 1).\n * end length is not included\n */\n sum(begin: number, end: number) {\n // invariant(begin <= end, 'Begin must precede end');\n return this.sumUntil(end) - this.sumUntil(begin);\n }\n\n /**\n * return the biggest i, sumUntil(i) === t\n * return the biggest i, subUntil(i) < t\n */\n greatestLowerBound(t: number) {\n if (t < 0 || !this._actualSize) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n // not use this._size;this._size always be a big value\n return this._actualSize;\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t < leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._actualSize);\n }\n\n /**\n * Return the biggest i, subUntil(i) < t\n * or -1 if no such i exists.\n */\n greatestStrictLowerBound(t: number) {\n if (t <= 0 || !this._actualSize) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n return this._actualSize;\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t <= leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._actualSize);\n }\n\n /**\n *\n * @param minOffset\n * @param maxOffset\n * @returns\n *\n * pending issue:\n * when item with length list [100, 0, 100, 0, 0, 100].\n * then computeRange(100, 200) => { startIndex: 2, endIndex: 6 }\n *\n * item index in viewport will be [2, 3, 4, 5], index 6 is not\n * included just like Array.slice(start, end)\n *\n */\n computeRange(minOffset: number, maxOffset: number) {\n if (this.getHeap()[1] < minOffset) {\n return {\n startIndex: this._actualSize,\n endIndex: this._actualSize,\n };\n }\n\n return {\n // the biggest item, value <= minOffset\n startIndex: this.greatestLowerBound(minOffset),\n\n // the smallest item, value > maxOffset\n endIndex: this.leastStrictUpperBound(maxOffset),\n };\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and t <= sumUntil(i), or\n * size + 1 if no such i exists.\n */\n leastUpperBound(t: number) {\n return Math.min(this.greatestStrictLowerBound(t) + 1, this._actualSize);\n }\n\n /**\n * Returns the smallest i, t < sumUntil(i), it should be used as range end\n * size + 1 if no such i exists.\n */\n leastStrictUpperBound(t: number) {\n return Math.min(this.greatestLowerBound(t) + 1, this._actualSize);\n }\n}\n\nexport default PrefixIntervalTree;\n"],"names":["parent","node","Math","floor","createArray","size","xs","i","ceilLog2","x","y","PrefixIntervalTree","opts","initWithNumber","Array","isArray","initWithArray","_ref","onUpdateItemLayout","onUpdateIntervalTree","_onUpdateIntervalTree","_onUpdateItemLayout","_proto","prototype","length","_half","_size","_heap","_actualSize","arr","uniform","initialValue","empty","stretch","nextHeap","nextHeapHalf","isValidIndex","index","reflowHeap","startIndex","endIndex","len","log2","from","v","reduce","acc","_nextStart","_nextEnd","idx","_this","remove","batchRemove","indices","sort","a","b","forEach","_this2","isNaN","console","warn","splice","push","get","removeV0","copy","slice","set","value","getMaxUsefulLength","getActualSize","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=function(t){return Math.floor(t/2)},e=function(t){for(var e=[],i=t-1;i>=0;--i)e[i]=0;return e};function i(t){for(var e=1;e<t;)e*=2;return e}exports.default=function(){function a(t,e){"number"==typeof t&&this.initWithNumber(t),Array.isArray(t)&&this.initWithArray(t);var i=e||{},a=i.onUpdateItemLayout;this._onUpdateIntervalTree=i.onUpdateIntervalTree,this._onUpdateItemLayout=a}var n=a.prototype;return n.initWithNumber=function(t){this._half=i(t),this._size=this._half,this._heap=e(2*this._half),this._actualSize=0},n.initWithArray=function(t){var a;for(this._half=i(t.length),this._size=this._half,this._heap=e(2*this._half),a=0;a<this._size;++a)this._heap[this._half+a]=t[a];for(a=this._half-1;a>0;--a)this._heap[a]=this._heap[2*a]+this._heap[2*a+1];this._actualSize=t.length},a.uniform=function(t,e){for(var i=[],n=t-1;n>=0;--n)i[n]=e;return new a(i)},a.empty=function(t){return a.uniform(t,0)},n.stretch=function(){for(var t=e(2*this._half*2),i=2*this._half,a=0;a<this._size;a++)t[i+a]=this._heap[this._half+a]||0;for(var n=i-1;n>0;n--)t[n]=t[2*n]+t[2*n+1];this._half=i,this._size=i,this._heap=t},n.isValidIndex=function(t){return"number"==typeof t&&t>=0&&t<this._actualSize},n.reflowHeap=function(e,i){var a=this;void 0===i&&(i=2*this._half-2);var n=Math.log2(this._size);Array.from({length:n},(function(t,e){return e})).reduce((function(e){for(var i=e.endIndex,n=t(e.startIndex),h=t(i),r=n;r<=h;r++)a._heap[r]=a._heap[2*r]+a._heap[2*r+1];return{startIndex:n,endIndex:h}}),{startIndex:e,endIndex:i})},n.remove=function(t){this.batchRemove([t])},n.batchRemove=function(t){var e=this;if(t.sort((function(t,e){return t-e})),t.forEach((function(t){e.isValidIndex(t)&&(isNaN(t)?console.warn("Passing a NaN value as interval tree index"):(e._heap.splice(e._half+t,1),e._heap.push(0),e._actualSize=e._actualSize-1))})),this.reflowHeap(t[0]+this._half),"function"==typeof this._onUpdateIntervalTree&&this._onUpdateIntervalTree(this._heap),"function"==typeof this._onUpdateItemLayout)for(var i=t[0];i<this._half;i++)this._onUpdateItemLayout(i,this.get(i))},n.removeV0=function(t){if(this.isValidIndex(t))if(isNaN(t))console.warn("Passing a NaN value as interval tree index");else{var i=e(2*this._half),a=this._heap.slice(this._half);a.splice(t,1);for(var n=this._half;n<2*this._half;n++)i[n]=a[n-this._half]||0;for(var h=this._half-1;h>0;h--)i[h]=i[2*h]+i[2*h+1];this._actualSize=this._actualSize-1,this._heap=i}},n.set=function(e,i){if("number"!=typeof e||e<0)return!1;if(isNaN(e))return console.warn("Passing a NaN value as interval tree index"),!1;for(;e>=this._half;)this.stretch();var a=this._half+e;for(this._heap[a]=i,a=t(a);0!==a;a=t(a))this._heap[a]=this._heap[2*a]+this._heap[2*a+1];return e+1>this._actualSize&&(this._actualSize=e+1),"function"==typeof this._onUpdateIntervalTree&&this._onUpdateIntervalTree(this._heap),"function"==typeof this._onUpdateItemLayout&&this._onUpdateItemLayout(e,i),!0},n.getMaxUsefulLength=function(){return this.getActualSize()},n.getActualSize=function(){return this._actualSize},n.get=function(t){return this._heap[this._half+t]},n.getSize=function(){return this._size},n.getHalf=function(){return this._half},n.getHeap=function(){return this._heap},n.getMaxValue=function(){return this._heap[1]},n.sumUntil=function(e){if(e<=0)return 0;for(var i=this._half+e-1,a=this._heap[i];1!==i;i=t(i))i%2==1&&(a+=this._heap[i-1]);return a},n.sumTo=function(t){return this.sumUntil(t+1)},n.sum=function(t,e){return this.sumUntil(e)-this.sumUntil(t)},n.greatestLowerBound=function(t){if(t<0)return-1;var e=1;if(this._heap[e]<t)return
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=function(t){return Math.floor(t/2)},e=function(t){for(var e=[],i=t-1;i>=0;--i)e[i]=0;return e};function i(t){for(var e=1;e<t;)e*=2;return e}exports.default=function(){function a(t,e){"number"==typeof t&&this.initWithNumber(t),Array.isArray(t)&&this.initWithArray(t);var i=e||{},a=i.onUpdateItemLayout;this._onUpdateIntervalTree=i.onUpdateIntervalTree,this._onUpdateItemLayout=a}var n=a.prototype;return n.initWithNumber=function(t){this._half=i(t),this._size=this._half,this._heap=e(2*this._half),this._actualSize=0},n.initWithArray=function(t){var a;for(this._half=i(t.length),this._size=this._half,this._heap=e(2*this._half),a=0;a<this._size;++a)this._heap[this._half+a]=t[a];for(a=this._half-1;a>0;--a)this._heap[a]=this._heap[2*a]+this._heap[2*a+1];this._actualSize=t.length},a.uniform=function(t,e){for(var i=[],n=t-1;n>=0;--n)i[n]=e;return new a(i)},a.empty=function(t){return a.uniform(t,0)},n.stretch=function(){for(var t=e(2*this._half*2),i=2*this._half,a=0;a<this._size;a++)t[i+a]=this._heap[this._half+a]||0;for(var n=i-1;n>0;n--)t[n]=t[2*n]+t[2*n+1];this._half=i,this._size=i,this._heap=t},n.isValidIndex=function(t){return"number"==typeof t&&t>=0&&t<this._actualSize},n.reflowHeap=function(e,i){var a=this;void 0===i&&(i=2*this._half-2);var n=Math.log2(this._size);Array.from({length:n},(function(t,e){return e})).reduce((function(e){for(var i=e.endIndex,n=t(e.startIndex),h=t(i),r=n;r<=h;r++)a._heap[r]=a._heap[2*r]+a._heap[2*r+1];return{startIndex:n,endIndex:h}}),{startIndex:e,endIndex:i})},n.remove=function(t){this.batchRemove([t])},n.batchRemove=function(t){var e=this;if(t.sort((function(t,e){return t-e})),t.forEach((function(t){e.isValidIndex(t)&&(isNaN(t)?console.warn("Passing a NaN value as interval tree index"):(e._heap.splice(e._half+t,1),e._heap.push(0),e._actualSize=e._actualSize-1))})),this.reflowHeap(t[0]+this._half),"function"==typeof this._onUpdateIntervalTree&&this._onUpdateIntervalTree(this._heap),"function"==typeof this._onUpdateItemLayout)for(var i=t[0];i<this._half;i++)this._onUpdateItemLayout(i,this.get(i))},n.removeV0=function(t){if(this.isValidIndex(t))if(isNaN(t))console.warn("Passing a NaN value as interval tree index");else{var i=e(2*this._half),a=this._heap.slice(this._half);a.splice(t,1);for(var n=this._half;n<2*this._half;n++)i[n]=a[n-this._half]||0;for(var h=this._half-1;h>0;h--)i[h]=i[2*h]+i[2*h+1];this._actualSize=this._actualSize-1,this._heap=i}},n.set=function(e,i){if("number"!=typeof e||e<0)return!1;if(isNaN(e))return console.warn("Passing a NaN value as interval tree index"),!1;for(;e>=this._half;)this.stretch();var a=this._half+e;for(this._heap[a]=i,a=t(a);0!==a;a=t(a))this._heap[a]=this._heap[2*a]+this._heap[2*a+1];return e+1>this._actualSize&&(this._actualSize=e+1),"function"==typeof this._onUpdateIntervalTree&&this._onUpdateIntervalTree(this._heap),"function"==typeof this._onUpdateItemLayout&&this._onUpdateItemLayout(e,i),!0},n.getMaxUsefulLength=function(){return this.getActualSize()},n.getActualSize=function(){return this._actualSize},n.get=function(t){return this._heap[this._half+t]},n.getSize=function(){return this._size},n.getHalf=function(){return this._half},n.getHeap=function(){return this._heap},n.getMaxValue=function(){return this._heap[1]},n.sumUntil=function(e){if(e<=0)return 0;for(var i=this._half+e-1,a=this._heap[i];1!==i;i=t(i))i%2==1&&(a+=this._heap[i-1]);return a},n.sumTo=function(t){return this.sumUntil(t+1)},n.sum=function(t,e){return this.sumUntil(e)-this.sumUntil(t)},n.greatestLowerBound=function(t){if(t<0||!this._actualSize)return-1;var e=1;if(this._heap[e]<t)return this._actualSize;for(;e<this._half;){var i=this._heap[2*e];t<i?e*=2:(e=2*e+1,t-=i)}return Math.min(e-this._half,this._actualSize)},n.greatestStrictLowerBound=function(t){if(t<=0||!this._actualSize)return-1;var e=1;if(this._heap[e]<t)return this._actualSize;for(;e<this._half;){var i=this._heap[2*e];t<=i?e*=2:(e=2*e+1,t-=i)}return Math.min(e-this._half,this._actualSize)},n.computeRange=function(t,e){return this.getHeap()[1]<t?{startIndex:this._actualSize,endIndex:this._actualSize}:{startIndex:this.greatestLowerBound(t),endIndex:this.leastStrictUpperBound(e)}},n.leastUpperBound=function(t){return Math.min(this.greatestStrictLowerBound(t)+1,this._actualSize)},n.leastStrictUpperBound=function(t){return Math.min(this.greatestLowerBound(t)+1,this._actualSize)},a}();
|
|
2
2
|
//# sourceMappingURL=prefix-interval-tree.cjs.production.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefix-interval-tree.cjs.production.min.js","sources":["../src/index.ts"],"sourcesContent":["const parent = (node: number) => Math.floor(node / 2);\n\nconst createArray = function (size: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = 0;\n }\n return xs;\n};\n\n/**\n * Computes the next power of 2 after or equal to x.\n */\nfunction ceilLog2(x: number) {\n let y = 1;\n while (y < x) {\n y *= 2;\n }\n\n return y;\n}\n\n/**\n * A prefix interval tree stores an numeric array and the partial sums of that\n * array. It is optimized for updating the values of the array without\n * recomputing all of the partial sums.\n *\n * - O(ln n) update\n * - O(1) lookup\n * - O(ln n) compute a partial sum\n * - O(n) space\n *\n * Note that the sequence of partial sums is one longer than the array, so that\n * the first partial sum is always 0, and the last partial sum is the sum of the\n * entire array.\n */\nclass PrefixIntervalTree {\n private _size: number;\n /**\n * Half the size of the heap. It is also the number of non-leaf nodes, and the\n * index of the first element in the heap. Always a power of 2.\n */\n private _half: number;\n private _heap: number[];\n\n private _actualSize: number;\n\n private _onUpdateItemLayout: Function;\n private _onUpdateIntervalTree: Function;\n\n constructor(\n xs: number[] | number,\n opts?: {\n onUpdateItemLayout?: Function;\n onUpdateIntervalTree?: Function;\n }\n ) {\n if (typeof xs === 'number') this.initWithNumber(xs);\n if (Array.isArray(xs)) this.initWithArray(xs);\n\n const { onUpdateItemLayout, onUpdateIntervalTree } = opts || {};\n this._onUpdateIntervalTree = onUpdateIntervalTree;\n this._onUpdateItemLayout = onUpdateItemLayout;\n }\n\n initWithNumber(length: number) {\n this._half = ceilLog2(length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n this._actualSize = 0;\n }\n\n initWithArray(arr: number[]) {\n this._half = ceilLog2(arr.length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n let i;\n for (i = 0; i < this._size; ++i) {\n this._heap[this._half + i] = arr[i];\n }\n\n for (i = this._half - 1; i > 0; --i) {\n this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];\n }\n this._actualSize = arr.length;\n }\n\n static uniform(size: number, initialValue: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = initialValue;\n }\n\n return new PrefixIntervalTree(xs);\n }\n\n static empty(size: number) {\n return PrefixIntervalTree.uniform(size, 0);\n }\n\n /**\n * the length should be 2\n */\n stretch() {\n const nextHeap = createArray(2 * this._half * 2);\n const nextHeapHalf = this._half * 2;\n\n // copy old value to new one\n for (let i = 0; i < this._size; i++) {\n nextHeap[nextHeapHalf + i] = this._heap[this._half + i] || 0;\n }\n\n // sum old value to create new sum value\n for (let i = nextHeapHalf - 1; i > 0; i--) {\n nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];\n }\n\n this._half = nextHeapHalf;\n this._size = nextHeapHalf;\n this._heap = nextHeap;\n }\n\n isValidIndex(index: number) {\n return typeof index === 'number' && index >= 0 && index < this._actualSize;\n }\n\n reflowHeap(startIndex: number, endIndex = this._half * 2 - 2) {\n const len = Math.log2(this._size);\n\n Array.from({ length: len }, (v, i) => i).reduce(\n (acc) => {\n const { startIndex, endIndex } = acc;\n const _nextStart = parent(startIndex);\n const _nextEnd = parent(endIndex);\n\n for (let idx = _nextStart; idx <= _nextEnd; idx++) {\n this._heap[idx] = this._heap[2 * idx] + this._heap[2 * idx + 1];\n }\n\n return {\n startIndex: _nextStart,\n endIndex: _nextEnd,\n };\n },\n {\n startIndex,\n endIndex,\n }\n );\n }\n\n remove(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n\n this.batchRemove([index]);\n }\n\n batchRemove(indices: number[]) {\n indices.sort((a, b) => a - b);\n\n indices.forEach((index) => {\n if (!this.isValidIndex(index)) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n this._heap.splice(this._half + index, 1);\n this._heap.push(0);\n this._actualSize = this._actualSize - 1;\n });\n\n this.reflowHeap(indices[0] + this._half);\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n for (let idx = indices[0]; idx < this._half; idx++) {\n this._onUpdateItemLayout(idx, this.get(idx));\n }\n }\n }\n\n removeV0(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n if (!this.isValidIndex(index)) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n const nextHeap = createArray(this._half * 2);\n const copy = this._heap.slice(this._half);\n copy.splice(index, 1);\n\n for (let index = this._half; index < this._half * 2; index++) {\n nextHeap[index] = copy[index - this._half] || 0;\n }\n\n for (let index = this._half - 1; index > 0; index--) {\n nextHeap[index] = nextHeap[2 * index] + nextHeap[2 * index + 1];\n }\n\n this._actualSize = this._actualSize - 1;\n this._heap = nextHeap;\n }\n\n set(index: number, value: number) {\n if (typeof index !== 'number' || index < 0) return false;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return false;\n }\n\n while (index >= this._half) {\n this.stretch();\n }\n\n let node = this._half + index;\n this._heap[node] = value;\n\n node = parent(node);\n for (; node !== 0; node = parent(node)) {\n this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];\n }\n\n if (index + 1 > this._actualSize) {\n this._actualSize = index + 1;\n }\n\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n this._onUpdateItemLayout(index, value);\n }\n return true;\n }\n\n getMaxUsefulLength() {\n return this.getActualSize();\n }\n\n getActualSize() {\n return this._actualSize;\n }\n\n get(index: number) {\n // invariant(index >= 0 && index < this._size, 'Index out of range %s', index);\n const node = this._half + index;\n return this._heap[node];\n }\n\n getSize() {\n return this._size;\n }\n\n getHalf() {\n return this._half;\n }\n\n getHeap() {\n return this._heap;\n }\n\n getMaxValue() {\n return this._heap[1];\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(end - 1).\n * End is not included. if end less than 0, then return 0\n */\n sumUntil(end: number) {\n // invariant(end >= 0 && end < this._size + 1, 'Index out of range %s', end);\n\n if (end <= 0) {\n return 0;\n }\n\n let node = this._half + end - 1;\n let sum = this._heap[node];\n\n for (; node !== 1; node = parent(node)) {\n if (node % 2 === 1) {\n sum += this._heap[node - 1];\n }\n }\n\n return sum;\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(inclusiveEnd).\n */\n sumTo(inclusiveEnd: number) {\n // invariant(\n // inclusiveEnd >= 0 && inclusiveEnd < this._size,\n // 'Index out of range %s',\n // inclusiveEnd\n // );\n return this.sumUntil(inclusiveEnd + 1);\n }\n\n /**\n * Returns the sum get(begin) + get(begin + 1) + ... + get(end - 1).\n * end length is not included\n */\n sum(begin: number, end: number) {\n // invariant(begin <= end, 'Begin must precede end');\n return this.sumUntil(end) - this.sumUntil(begin);\n }\n\n /**\n * return the biggest i, sumUntil(i) === t\n * return the biggest i, subUntil(i) < t\n */\n greatestLowerBound(t: number) {\n if (t < 0) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n // not use this._size;this._size always be a big value\n return Math.max(this._actualSize - 1, 0);\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t < leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._actualSize - 1);\n }\n\n /**\n * Return the biggest i, subUntil(i) < t\n * or -1 if no such i exists.\n */\n greatestStrictLowerBound(t: number) {\n if (t <= 0) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n return Math.max(this._actualSize - 1, 0);\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t <= leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._actualSize - 1);\n }\n\n /**\n *\n * @param minOffset\n * @param maxOffset\n * @returns\n *\n * pending issue:\n * when item with length list [100, 0, 100, 0, 0, 100].\n * then computeRange(100, 200) => { startIndex: 2, endIndex: 6 }\n *\n * item index in viewport will be [2, 3, 4, 5], index 6 is not\n * included just like Array.slice(start, end)\n *\n */\n computeRange(minOffset: number, maxOffset: number) {\n if (this.getHeap()[1] < minOffset) {\n return {\n startIndex: this._actualSize,\n endIndex: this._actualSize,\n };\n }\n\n return {\n // the biggest item, value <= minOffset\n startIndex: this.greatestLowerBound(minOffset),\n\n // the smallest item, value > maxOffset\n endIndex: this.leastStrictUpperBound(maxOffset),\n };\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and t <= sumUntil(i), or\n * size + 1 if no such i exists.\n */\n leastUpperBound(t: number) {\n return this.greatestStrictLowerBound(t) + 1;\n }\n\n /**\n * Returns the smallest i, t < sumUntil(i), it should be used as range end\n * size + 1 if no such i exists.\n */\n leastStrictUpperBound(t: number) {\n return this.greatestLowerBound(t) + 1;\n }\n}\n\nexport default PrefixIntervalTree;\n"],"names":["parent","node","Math","floor","createArray","size","xs","i","ceilLog2","x","y","PrefixIntervalTree","opts","this","initWithNumber","Array","isArray","initWithArray","_ref","onUpdateItemLayout","_onUpdateIntervalTree","onUpdateIntervalTree","_onUpdateItemLayout","_proto","prototype","length","_half","_size","_heap","_actualSize","arr","uniform","initialValue","empty","stretch","nextHeap","nextHeapHalf","isValidIndex","index","reflowHeap","startIndex","endIndex","len","log2","from","v","reduce","acc","_nextStart","_nextEnd","idx","_this","remove","batchRemove","indices","sort","a","b","forEach","_this2","isNaN","console","warn","splice","push","get","removeV0","copy","slice","set","value","getMaxUsefulLength","getActualSize","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","max","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","leastStrictUpperBound","leastUpperBound"],"mappings":"oEAAA,IAAMA,EAAS,SAACC,GAAY,OAAKC,KAAKC,MAAMF,EAAO,IAE7CG,EAAc,SAAUC,GAE5B,IADA,IAAMC,EAAK,GACFC,EAAIF,EAAO,EAAGE,GAAK,IAAKA,EAC/BD,EAAGC,GAAK,EAEV,OAAOD,GAMT,SAASE,EAASC,GAEhB,IADA,IAAIC,EAAI,EACDA,EAAID,GACTC,GAAK,EAGP,OAAOA,6BA+BP,SAAAC,EACEL,EACAM,GAKkB,iBAAPN,GAAiBO,KAAKC,eAAeR,GAC5CS,MAAMC,QAAQV,IAAKO,KAAKI,cAAcX,GAE1C,IAAAY,EAAqDN,GAAQ,GAArDO,EAAkBD,EAAlBC,mBACRN,KAAKO,sBAD2CF,EAApBG,qBAE5BR,KAAKS,oBAAsBH,EAC5B,IAAAI,EAAAZ,EAAAa,UAgWA,OAhWAD,EAEDT,eAAA,SAAeW,GACbZ,KAAKa,MAAQlB,EAASiB,GACtBZ,KAAKc,MAAQd,KAAKa,MAClBb,KAAKe,MAAQxB,EAAY,EAAIS,KAAKa,OAClCb,KAAKgB,YAAc,GACpBN,EAEDN,cAAA,SAAca,GAIZ,IAAIvB,EACJ,IAJAM,KAAKa,MAAQlB,EAASsB,EAAIL,QAC1BZ,KAAKc,MAAQd,KAAKa,MAClBb,KAAKe,MAAQxB,EAAY,EAAIS,KAAKa,OAE7BnB,EAAI,EAAGA,EAAIM,KAAKc,QAASpB,EAC5BM,KAAKe,MAAMf,KAAKa,MAAQnB,GAAKuB,EAAIvB,GAGnC,IAAKA,EAAIM,KAAKa,MAAQ,EAAGnB,EAAI,IAAKA,EAChCM,KAAKe,MAAMrB,GAAKM,KAAKe,MAAM,EAAIrB,GAAKM,KAAKe,MAAM,EAAIrB,EAAI,GAEzDM,KAAKgB,YAAcC,EAAIL,QACxBd,EAEMoB,QAAP,SAAe1B,EAAc2B,GAE3B,IADA,IAAM1B,EAAK,GACFC,EAAIF,EAAO,EAAGE,GAAK,IAAKA,EAC/BD,EAAGC,GAAKyB,EAGV,OAAO,IAAIrB,EAAmBL,IAC/BK,EAEMsB,MAAP,SAAa5B,GACX,OAAOM,EAAmBoB,QAAQ1B,EAAM,IACzCkB,EAKDW,QAAA,WAKE,IAJA,IAAMC,EAAW/B,EAAY,EAAIS,KAAKa,MAAQ,GACxCU,EAA4B,EAAbvB,KAAKa,MAGjBnB,EAAI,EAAGA,EAAIM,KAAKc,MAAOpB,IAC9B4B,EAASC,EAAe7B,GAAKM,KAAKe,MAAMf,KAAKa,MAAQnB,IAAM,EAI7D,IAAK,IAAIA,EAAI6B,EAAe,EAAG7B,EAAI,EAAGA,IACpC4B,EAAS5B,GAAK4B,EAAS,EAAI5B,GAAK4B,EAAS,EAAI5B,EAAI,GAGnDM,KAAKa,MAAQU,EACbvB,KAAKc,MAAQS,EACbvB,KAAKe,MAAQO,GACdZ,EAEDc,aAAA,SAAaC,GACX,MAAwB,iBAAVA,GAAsBA,GAAS,GAAKA,EAAQzB,KAAKgB,aAChEN,EAEDgB,WAAA,SAAWC,EAAoBC,uBAAAA,IAAAA,EAAwB,EAAb5B,KAAKa,MAAY,GACzD,IAAMgB,EAAMxC,KAAKyC,KAAK9B,KAAKc,OAE3BZ,MAAM6B,KAAK,CAAEnB,OAAQiB,IAAO,SAACG,EAAGtC,GAAC,OAAKA,KAAGuC,QACvC,SAACC,GAKC,IAJA,IAAoBN,EAAaM,EAAbN,SACdO,EAAahD,EADc+C,EAAzBP,YAEFS,EAAWjD,EAAOyC,GAEfS,EAAMF,EAAYE,GAAOD,EAAUC,IAC1CC,EAAKvB,MAAMsB,GAAOC,EAAKvB,MAAM,EAAIsB,GAAOC,EAAKvB,MAAM,EAAIsB,EAAM,GAG/D,MAAO,CACLV,WAAYQ,EACZP,SAAUQ,KAGd,CACET,WAAAA,EACAC,SAAAA,KAGLlB,EAED6B,OAAA,SAAOd,GAGLzB,KAAKwC,YAAY,CAACf,KACnBf,EAED8B,YAAA,SAAYC,cAoBV,GAnBAA,EAAQC,MAAK,SAACC,EAAGC,GAAC,OAAKD,EAAIC,KAE3BH,EAAQI,SAAQ,SAACpB,GACVqB,EAAKtB,aAAaC,KACnBsB,MAAMtB,GACRuB,QAAQC,KAAK,+CAIfH,EAAK/B,MAAMmC,OAAOJ,EAAKjC,MAAQY,EAAO,GACtCqB,EAAK/B,MAAMoC,KAAK,GAChBL,EAAK9B,YAAc8B,EAAK9B,YAAc,OAGxChB,KAAK0B,WAAWe,EAAQ,GAAKzC,KAAKa,OACQ,mBAA/Bb,KAAKO,uBACdP,KAAKO,sBAAsBP,KAAKe,OAGM,mBAA7Bf,KAAKS,oBACd,IAAK,IAAI4B,EAAMI,EAAQ,GAAIJ,EAAMrC,KAAKa,MAAOwB,IAC3CrC,KAAKS,oBAAoB4B,EAAKrC,KAAKoD,IAAIf,KAG5C3B,EAED2C,SAAA,SAAS5B,GAEP,GAAKzB,KAAKwB,aAAaC,GACvB,GAAIsB,MAAMtB,GACRuB,QAAQC,KAAK,kDADf,CAKA,IAAM3B,EAAW/B,EAAyB,EAAbS,KAAKa,OAC5ByC,EAAOtD,KAAKe,MAAMwC,MAAMvD,KAAKa,OACnCyC,EAAKJ,OAAOzB,EAAO,GAEnB,IAAK,IAAIA,EAAQzB,KAAKa,MAAOY,EAAqB,EAAbzB,KAAKa,MAAWY,IACnDH,EAASG,GAAS6B,EAAK7B,EAAQzB,KAAKa,QAAU,EAGhD,IAAK,IAAIY,EAAQzB,KAAKa,MAAQ,EAAGY,EAAQ,EAAGA,IAC1CH,EAASG,GAASH,EAAS,EAAIG,GAASH,EAAS,EAAIG,EAAQ,GAG/DzB,KAAKgB,YAAchB,KAAKgB,YAAc,EACtChB,KAAKe,MAAQO,IACdZ,EAED8C,IAAA,SAAI/B,EAAegC,GACjB,GAAqB,iBAAVhC,GAAsBA,EAAQ,EAAG,OAAO,EACnD,GAAIsB,MAAMtB,GAER,OADAuB,QAAQC,KAAK,+CACN,EAGT,KAAOxB,GAASzB,KAAKa,OACnBb,KAAKqB,UAGP,IAAIjC,EAAOY,KAAKa,MAAQY,EAIxB,IAHAzB,KAAKe,MAAM3B,GAAQqE,EAEnBrE,EAAOD,EAAOC,GACE,IAATA,EAAYA,EAAOD,EAAOC,GAC/BY,KAAKe,MAAM3B,GAAQY,KAAKe,MAAM,EAAI3B,GAAQY,KAAKe,MAAM,EAAI3B,EAAO,GAclE,OAXIqC,EAAQ,EAAIzB,KAAKgB,cACnBhB,KAAKgB,YAAcS,EAAQ,GAGa,mBAA/BzB,KAAKO,uBACdP,KAAKO,sBAAsBP,KAAKe,OAGM,mBAA7Bf,KAAKS,qBACdT,KAAKS,oBAAoBgB,EAAOgC,IAE3B,GACR/C,EAEDgD,mBAAA,WACE,OAAO1D,KAAK2D,iBACbjD,EAEDiD,cAAA,WACE,OAAO3D,KAAKgB,aACbN,EAED0C,IAAA,SAAI3B,GAGF,OAAOzB,KAAKe,MADCf,KAAKa,MAAQY,IAE3Bf,EAEDkD,QAAA,WACE,OAAO5D,KAAKc,OACbJ,EAEDmD,QAAA,WACE,OAAO7D,KAAKa,OACbH,EAEDoD,QAAA,WACE,OAAO9D,KAAKe,OACbL,EAEDqD,YAAA,WACE,OAAO/D,KAAKe,MAAM,IACnBL,EAMDsD,SAAA,SAASC,GAGP,GAAIA,GAAO,EACT,OAAO,EAMT,IAHA,IAAI7E,EAAOY,KAAKa,MAAQoD,EAAM,EAC1BC,EAAMlE,KAAKe,MAAM3B,GAEL,IAATA,EAAYA,EAAOD,EAAOC,GAC3BA,EAAO,GAAM,IACf8E,GAAOlE,KAAKe,MAAM3B,EAAO,IAI7B,OAAO8E,GACRxD,EAKDyD,MAAA,SAAMC,GAMJ,OAAOpE,KAAKgE,SAASI,EAAe,IACrC1D,EAMDwD,IAAA,SAAIG,EAAeJ,GAEjB,OAAOjE,KAAKgE,SAASC,GAAOjE,KAAKgE,SAASK,IAC3C3D,EAMD4D,mBAAA,SAAmBC,GACjB,GAAIA,EAAI,EACN,OAAQ,EAGV,IAAInF,EAAO,EACX,GAAIY,KAAKe,MAAM3B,GAAQmF,EAErB,OAAOlF,KAAKmF,IAAIxE,KAAKgB,YAAc,EAAG,GAGxC,KAAO5B,EAAOY,KAAKa,OAAO,CACxB,IAAM4D,EAAUzE,KAAKe,MAAM,EAAI3B,GAC3BmF,EAAIE,EACNrF,GAAO,GAEPA,EAAO,EAAIA,EAAO,EAClBmF,GAAKE,GAIT,OAAOpF,KAAKqF,IAAItF,EAAOY,KAAKa,MAAOb,KAAKgB,YAAc,IACvDN,EAMDiE,yBAAA,SAAyBJ,GACvB,GAAIA,GAAK,EACP,OAAQ,EAGV,IAAInF,EAAO,EACX,GAAIY,KAAKe,MAAM3B,GAAQmF,EACrB,OAAOlF,KAAKmF,IAAIxE,KAAKgB,YAAc,EAAG,GAGxC,KAAO5B,EAAOY,KAAKa,OAAO,CACxB,IAAM4D,EAAUzE,KAAKe,MAAM,EAAI3B,GAC3BmF,GAAKE,EACPrF,GAAO,GAEPA,EAAO,EAAIA,EAAO,EAClBmF,GAAKE,GAIT,OAAOpF,KAAKqF,IAAItF,EAAOY,KAAKa,MAAOb,KAAKgB,YAAc,IACvDN,EAgBDkE,aAAA,SAAaC,EAAmBC,GAC9B,OAAI9E,KAAK8D,UAAU,GAAKe,EACf,CACLlD,WAAY3B,KAAKgB,YACjBY,SAAU5B,KAAKgB,aAIZ,CAELW,WAAY3B,KAAKsE,mBAAmBO,GAGpCjD,SAAU5B,KAAK+E,sBAAsBD,KAExCpE,EAMDsE,gBAAA,SAAgBT,GACd,OAAOvE,KAAK2E,yBAAyBJ,GAAK,GAC3C7D,EAMDqE,sBAAA,SAAsBR,GACpB,OAAOvE,KAAKsE,mBAAmBC,GAAK,GACrCzE"}
|
|
1
|
+
{"version":3,"file":"prefix-interval-tree.cjs.production.min.js","sources":["../src/index.ts"],"sourcesContent":["const parent = (node: number) => Math.floor(node / 2);\n\nconst createArray = function (size: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = 0;\n }\n return xs;\n};\n\n/**\n * Computes the next power of 2 after or equal to x.\n */\nfunction ceilLog2(x: number) {\n let y = 1;\n while (y < x) {\n y *= 2;\n }\n\n return y;\n}\n\n/**\n * A prefix interval tree stores an numeric array and the partial sums of that\n * array. It is optimized for updating the values of the array without\n * recomputing all of the partial sums.\n *\n * - O(ln n) update\n * - O(1) lookup\n * - O(ln n) compute a partial sum\n * - O(n) space\n *\n * Note that the sequence of partial sums is one longer than the array, so that\n * the first partial sum is always 0, and the last partial sum is the sum of the\n * entire array.\n */\nclass PrefixIntervalTree {\n private _size: number;\n /**\n * Half the size of the heap. It is also the number of non-leaf nodes, and the\n * index of the first element in the heap. Always a power of 2.\n */\n private _half: number;\n private _heap: number[];\n\n private _actualSize: number;\n\n private _onUpdateItemLayout: Function;\n private _onUpdateIntervalTree: Function;\n\n constructor(\n xs: number[] | number,\n opts?: {\n onUpdateItemLayout?: Function;\n onUpdateIntervalTree?: Function;\n }\n ) {\n if (typeof xs === 'number') this.initWithNumber(xs);\n if (Array.isArray(xs)) this.initWithArray(xs);\n\n const { onUpdateItemLayout, onUpdateIntervalTree } = opts || {};\n this._onUpdateIntervalTree = onUpdateIntervalTree;\n this._onUpdateItemLayout = onUpdateItemLayout;\n }\n\n initWithNumber(length: number) {\n this._half = ceilLog2(length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n this._actualSize = 0;\n }\n\n initWithArray(arr: number[]) {\n this._half = ceilLog2(arr.length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n let i;\n for (i = 0; i < this._size; ++i) {\n this._heap[this._half + i] = arr[i];\n }\n\n for (i = this._half - 1; i > 0; --i) {\n this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];\n }\n this._actualSize = arr.length;\n }\n\n static uniform(size: number, initialValue: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = initialValue;\n }\n\n return new PrefixIntervalTree(xs);\n }\n\n static empty(size: number) {\n return PrefixIntervalTree.uniform(size, 0);\n }\n\n /**\n * the length should be 2\n */\n stretch() {\n const nextHeap = createArray(2 * this._half * 2);\n const nextHeapHalf = this._half * 2;\n\n // copy old value to new one\n for (let i = 0; i < this._size; i++) {\n nextHeap[nextHeapHalf + i] = this._heap[this._half + i] || 0;\n }\n\n // sum old value to create new sum value\n for (let i = nextHeapHalf - 1; i > 0; i--) {\n nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];\n }\n\n this._half = nextHeapHalf;\n this._size = nextHeapHalf;\n this._heap = nextHeap;\n }\n\n isValidIndex(index: number) {\n return typeof index === 'number' && index >= 0 && index < this._actualSize;\n }\n\n reflowHeap(startIndex: number, endIndex = this._half * 2 - 2) {\n const len = Math.log2(this._size);\n\n Array.from({ length: len }, (v, i) => i).reduce(\n (acc) => {\n const { startIndex, endIndex } = acc;\n const _nextStart = parent(startIndex);\n const _nextEnd = parent(endIndex);\n\n for (let idx = _nextStart; idx <= _nextEnd; idx++) {\n this._heap[idx] = this._heap[2 * idx] + this._heap[2 * idx + 1];\n }\n\n return {\n startIndex: _nextStart,\n endIndex: _nextEnd,\n };\n },\n {\n startIndex,\n endIndex,\n }\n );\n }\n\n remove(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n\n this.batchRemove([index]);\n }\n\n batchRemove(indices: number[]) {\n indices.sort((a, b) => a - b);\n\n indices.forEach((index) => {\n if (!this.isValidIndex(index)) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n this._heap.splice(this._half + index, 1);\n this._heap.push(0);\n this._actualSize = this._actualSize - 1;\n });\n\n this.reflowHeap(indices[0] + this._half);\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n for (let idx = indices[0]; idx < this._half; idx++) {\n this._onUpdateItemLayout(idx, this.get(idx));\n }\n }\n }\n\n removeV0(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n if (!this.isValidIndex(index)) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n const nextHeap = createArray(this._half * 2);\n const copy = this._heap.slice(this._half);\n copy.splice(index, 1);\n\n for (let index = this._half; index < this._half * 2; index++) {\n nextHeap[index] = copy[index - this._half] || 0;\n }\n\n for (let index = this._half - 1; index > 0; index--) {\n nextHeap[index] = nextHeap[2 * index] + nextHeap[2 * index + 1];\n }\n\n this._actualSize = this._actualSize - 1;\n this._heap = nextHeap;\n }\n\n set(index: number, value: number) {\n if (typeof index !== 'number' || index < 0) return false;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return false;\n }\n\n while (index >= this._half) {\n this.stretch();\n }\n\n let node = this._half + index;\n this._heap[node] = value;\n\n node = parent(node);\n for (; node !== 0; node = parent(node)) {\n this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];\n }\n\n if (index + 1 > this._actualSize) {\n this._actualSize = index + 1;\n }\n\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n this._onUpdateItemLayout(index, value);\n }\n return true;\n }\n\n getMaxUsefulLength() {\n return this.getActualSize();\n }\n\n getActualSize() {\n return this._actualSize;\n }\n\n get(index: number) {\n // invariant(index >= 0 && index < this._size, 'Index out of range %s', index);\n const node = this._half + index;\n return this._heap[node];\n }\n\n getSize() {\n return this._size;\n }\n\n getHalf() {\n return this._half;\n }\n\n getHeap() {\n return this._heap;\n }\n\n getMaxValue() {\n return this._heap[1];\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(end - 1).\n * End is not included. if end less than 0, then return 0\n */\n sumUntil(end: number) {\n // invariant(end >= 0 && end < this._size + 1, 'Index out of range %s', end);\n\n if (end <= 0) {\n return 0;\n }\n\n let node = this._half + end - 1;\n let sum = this._heap[node];\n\n for (; node !== 1; node = parent(node)) {\n if (node % 2 === 1) {\n sum += this._heap[node - 1];\n }\n }\n\n return sum;\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(inclusiveEnd).\n */\n sumTo(inclusiveEnd: number) {\n // invariant(\n // inclusiveEnd >= 0 && inclusiveEnd < this._size,\n // 'Index out of range %s',\n // inclusiveEnd\n // );\n return this.sumUntil(inclusiveEnd + 1);\n }\n\n /**\n * Returns the sum get(begin) + get(begin + 1) + ... + get(end - 1).\n * end length is not included\n */\n sum(begin: number, end: number) {\n // invariant(begin <= end, 'Begin must precede end');\n return this.sumUntil(end) - this.sumUntil(begin);\n }\n\n /**\n * return the biggest i, sumUntil(i) === t\n * return the biggest i, subUntil(i) < t\n */\n greatestLowerBound(t: number) {\n if (t < 0 || !this._actualSize) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n // not use this._size;this._size always be a big value\n return this._actualSize;\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t < leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._actualSize);\n }\n\n /**\n * Return the biggest i, subUntil(i) < t\n * or -1 if no such i exists.\n */\n greatestStrictLowerBound(t: number) {\n if (t <= 0 || !this._actualSize) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n return this._actualSize;\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t <= leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._actualSize);\n }\n\n /**\n *\n * @param minOffset\n * @param maxOffset\n * @returns\n *\n * pending issue:\n * when item with length list [100, 0, 100, 0, 0, 100].\n * then computeRange(100, 200) => { startIndex: 2, endIndex: 6 }\n *\n * item index in viewport will be [2, 3, 4, 5], index 6 is not\n * included just like Array.slice(start, end)\n *\n */\n computeRange(minOffset: number, maxOffset: number) {\n if (this.getHeap()[1] < minOffset) {\n return {\n startIndex: this._actualSize,\n endIndex: this._actualSize,\n };\n }\n\n return {\n // the biggest item, value <= minOffset\n startIndex: this.greatestLowerBound(minOffset),\n\n // the smallest item, value > maxOffset\n endIndex: this.leastStrictUpperBound(maxOffset),\n };\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and t <= sumUntil(i), or\n * size + 1 if no such i exists.\n */\n leastUpperBound(t: number) {\n return Math.min(this.greatestStrictLowerBound(t) + 1, this._actualSize);\n }\n\n /**\n * Returns the smallest i, t < sumUntil(i), it should be used as range end\n * size + 1 if no such i exists.\n */\n leastStrictUpperBound(t: number) {\n return Math.min(this.greatestLowerBound(t) + 1, this._actualSize);\n }\n}\n\nexport default PrefixIntervalTree;\n"],"names":["parent","node","Math","floor","createArray","size","xs","i","ceilLog2","x","y","PrefixIntervalTree","opts","this","initWithNumber","Array","isArray","initWithArray","_ref","onUpdateItemLayout","_onUpdateIntervalTree","onUpdateIntervalTree","_onUpdateItemLayout","_proto","prototype","length","_half","_size","_heap","_actualSize","arr","uniform","initialValue","empty","stretch","nextHeap","nextHeapHalf","isValidIndex","index","reflowHeap","startIndex","endIndex","len","log2","from","v","reduce","acc","_nextStart","_nextEnd","idx","_this","remove","batchRemove","indices","sort","a","b","forEach","_this2","isNaN","console","warn","splice","push","get","removeV0","copy","slice","set","value","getMaxUsefulLength","getActualSize","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
|
|
@@ -212,12 +212,12 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
|
|
|
212
212
|
return this.sumUntil(end) - this.sumUntil(begin);
|
|
213
213
|
};
|
|
214
214
|
_proto.greatestLowerBound = function greatestLowerBound(t) {
|
|
215
|
-
if (t < 0) {
|
|
215
|
+
if (t < 0 || !this._actualSize) {
|
|
216
216
|
return -1;
|
|
217
217
|
}
|
|
218
218
|
var node = 1;
|
|
219
219
|
if (this._heap[node] < t) {
|
|
220
|
-
return
|
|
220
|
+
return this._actualSize;
|
|
221
221
|
}
|
|
222
222
|
while (node < this._half) {
|
|
223
223
|
var leftSum = this._heap[2 * node];
|
|
@@ -228,15 +228,15 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
|
|
|
228
228
|
t -= leftSum;
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
|
-
return Math.min(node - this._half, this._actualSize
|
|
231
|
+
return Math.min(node - this._half, this._actualSize);
|
|
232
232
|
};
|
|
233
233
|
_proto.greatestStrictLowerBound = function greatestStrictLowerBound(t) {
|
|
234
|
-
if (t <= 0) {
|
|
234
|
+
if (t <= 0 || !this._actualSize) {
|
|
235
235
|
return -1;
|
|
236
236
|
}
|
|
237
237
|
var node = 1;
|
|
238
238
|
if (this._heap[node] < t) {
|
|
239
|
-
return
|
|
239
|
+
return this._actualSize;
|
|
240
240
|
}
|
|
241
241
|
while (node < this._half) {
|
|
242
242
|
var leftSum = this._heap[2 * node];
|
|
@@ -247,7 +247,7 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
|
|
|
247
247
|
t -= leftSum;
|
|
248
248
|
}
|
|
249
249
|
}
|
|
250
|
-
return Math.min(node - this._half, this._actualSize
|
|
250
|
+
return Math.min(node - this._half, this._actualSize);
|
|
251
251
|
};
|
|
252
252
|
_proto.computeRange = function computeRange(minOffset, maxOffset) {
|
|
253
253
|
if (this.getHeap()[1] < minOffset) {
|
|
@@ -262,10 +262,10 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
|
|
|
262
262
|
};
|
|
263
263
|
};
|
|
264
264
|
_proto.leastUpperBound = function leastUpperBound(t) {
|
|
265
|
-
return this.greatestStrictLowerBound(t) + 1;
|
|
265
|
+
return Math.min(this.greatestStrictLowerBound(t) + 1, this._actualSize);
|
|
266
266
|
};
|
|
267
267
|
_proto.leastStrictUpperBound = function leastStrictUpperBound(t) {
|
|
268
|
-
return this.greatestLowerBound(t) + 1;
|
|
268
|
+
return Math.min(this.greatestLowerBound(t) + 1, this._actualSize);
|
|
269
269
|
};
|
|
270
270
|
return PrefixIntervalTree;
|
|
271
271
|
}();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefix-interval-tree.esm.js","sources":["../src/index.ts"],"sourcesContent":["const parent = (node: number) => Math.floor(node / 2);\n\nconst createArray = function (size: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = 0;\n }\n return xs;\n};\n\n/**\n * Computes the next power of 2 after or equal to x.\n */\nfunction ceilLog2(x: number) {\n let y = 1;\n while (y < x) {\n y *= 2;\n }\n\n return y;\n}\n\n/**\n * A prefix interval tree stores an numeric array and the partial sums of that\n * array. It is optimized for updating the values of the array without\n * recomputing all of the partial sums.\n *\n * - O(ln n) update\n * - O(1) lookup\n * - O(ln n) compute a partial sum\n * - O(n) space\n *\n * Note that the sequence of partial sums is one longer than the array, so that\n * the first partial sum is always 0, and the last partial sum is the sum of the\n * entire array.\n */\nclass PrefixIntervalTree {\n private _size: number;\n /**\n * Half the size of the heap. It is also the number of non-leaf nodes, and the\n * index of the first element in the heap. Always a power of 2.\n */\n private _half: number;\n private _heap: number[];\n\n private _actualSize: number;\n\n private _onUpdateItemLayout: Function;\n private _onUpdateIntervalTree: Function;\n\n constructor(\n xs: number[] | number,\n opts?: {\n onUpdateItemLayout?: Function;\n onUpdateIntervalTree?: Function;\n }\n ) {\n if (typeof xs === 'number') this.initWithNumber(xs);\n if (Array.isArray(xs)) this.initWithArray(xs);\n\n const { onUpdateItemLayout, onUpdateIntervalTree } = opts || {};\n this._onUpdateIntervalTree = onUpdateIntervalTree;\n this._onUpdateItemLayout = onUpdateItemLayout;\n }\n\n initWithNumber(length: number) {\n this._half = ceilLog2(length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n this._actualSize = 0;\n }\n\n initWithArray(arr: number[]) {\n this._half = ceilLog2(arr.length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n let i;\n for (i = 0; i < this._size; ++i) {\n this._heap[this._half + i] = arr[i];\n }\n\n for (i = this._half - 1; i > 0; --i) {\n this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];\n }\n this._actualSize = arr.length;\n }\n\n static uniform(size: number, initialValue: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = initialValue;\n }\n\n return new PrefixIntervalTree(xs);\n }\n\n static empty(size: number) {\n return PrefixIntervalTree.uniform(size, 0);\n }\n\n /**\n * the length should be 2\n */\n stretch() {\n const nextHeap = createArray(2 * this._half * 2);\n const nextHeapHalf = this._half * 2;\n\n // copy old value to new one\n for (let i = 0; i < this._size; i++) {\n nextHeap[nextHeapHalf + i] = this._heap[this._half + i] || 0;\n }\n\n // sum old value to create new sum value\n for (let i = nextHeapHalf - 1; i > 0; i--) {\n nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];\n }\n\n this._half = nextHeapHalf;\n this._size = nextHeapHalf;\n this._heap = nextHeap;\n }\n\n isValidIndex(index: number) {\n return typeof index === 'number' && index >= 0 && index < this._actualSize;\n }\n\n reflowHeap(startIndex: number, endIndex = this._half * 2 - 2) {\n const len = Math.log2(this._size);\n\n Array.from({ length: len }, (v, i) => i).reduce(\n (acc) => {\n const { startIndex, endIndex } = acc;\n const _nextStart = parent(startIndex);\n const _nextEnd = parent(endIndex);\n\n for (let idx = _nextStart; idx <= _nextEnd; idx++) {\n this._heap[idx] = this._heap[2 * idx] + this._heap[2 * idx + 1];\n }\n\n return {\n startIndex: _nextStart,\n endIndex: _nextEnd,\n };\n },\n {\n startIndex,\n endIndex,\n }\n );\n }\n\n remove(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n\n this.batchRemove([index]);\n }\n\n batchRemove(indices: number[]) {\n indices.sort((a, b) => a - b);\n\n indices.forEach((index) => {\n if (!this.isValidIndex(index)) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n this._heap.splice(this._half + index, 1);\n this._heap.push(0);\n this._actualSize = this._actualSize - 1;\n });\n\n this.reflowHeap(indices[0] + this._half);\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n for (let idx = indices[0]; idx < this._half; idx++) {\n this._onUpdateItemLayout(idx, this.get(idx));\n }\n }\n }\n\n removeV0(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n if (!this.isValidIndex(index)) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n const nextHeap = createArray(this._half * 2);\n const copy = this._heap.slice(this._half);\n copy.splice(index, 1);\n\n for (let index = this._half; index < this._half * 2; index++) {\n nextHeap[index] = copy[index - this._half] || 0;\n }\n\n for (let index = this._half - 1; index > 0; index--) {\n nextHeap[index] = nextHeap[2 * index] + nextHeap[2 * index + 1];\n }\n\n this._actualSize = this._actualSize - 1;\n this._heap = nextHeap;\n }\n\n set(index: number, value: number) {\n if (typeof index !== 'number' || index < 0) return false;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return false;\n }\n\n while (index >= this._half) {\n this.stretch();\n }\n\n let node = this._half + index;\n this._heap[node] = value;\n\n node = parent(node);\n for (; node !== 0; node = parent(node)) {\n this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];\n }\n\n if (index + 1 > this._actualSize) {\n this._actualSize = index + 1;\n }\n\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n this._onUpdateItemLayout(index, value);\n }\n return true;\n }\n\n getMaxUsefulLength() {\n return this.getActualSize();\n }\n\n getActualSize() {\n return this._actualSize;\n }\n\n get(index: number) {\n // invariant(index >= 0 && index < this._size, 'Index out of range %s', index);\n const node = this._half + index;\n return this._heap[node];\n }\n\n getSize() {\n return this._size;\n }\n\n getHalf() {\n return this._half;\n }\n\n getHeap() {\n return this._heap;\n }\n\n getMaxValue() {\n return this._heap[1];\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(end - 1).\n * End is not included. if end less than 0, then return 0\n */\n sumUntil(end: number) {\n // invariant(end >= 0 && end < this._size + 1, 'Index out of range %s', end);\n\n if (end <= 0) {\n return 0;\n }\n\n let node = this._half + end - 1;\n let sum = this._heap[node];\n\n for (; node !== 1; node = parent(node)) {\n if (node % 2 === 1) {\n sum += this._heap[node - 1];\n }\n }\n\n return sum;\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(inclusiveEnd).\n */\n sumTo(inclusiveEnd: number) {\n // invariant(\n // inclusiveEnd >= 0 && inclusiveEnd < this._size,\n // 'Index out of range %s',\n // inclusiveEnd\n // );\n return this.sumUntil(inclusiveEnd + 1);\n }\n\n /**\n * Returns the sum get(begin) + get(begin + 1) + ... + get(end - 1).\n * end length is not included\n */\n sum(begin: number, end: number) {\n // invariant(begin <= end, 'Begin must precede end');\n return this.sumUntil(end) - this.sumUntil(begin);\n }\n\n /**\n * return the biggest i, sumUntil(i) === t\n * return the biggest i, subUntil(i) < t\n */\n greatestLowerBound(t: number) {\n if (t < 0) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n // not use this._size;this._size always be a big value\n return Math.max(this._actualSize - 1, 0);\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t < leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._actualSize - 1);\n }\n\n /**\n * Return the biggest i, subUntil(i) < t\n * or -1 if no such i exists.\n */\n greatestStrictLowerBound(t: number) {\n if (t <= 0) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n return Math.max(this._actualSize - 1, 0);\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t <= leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._actualSize - 1);\n }\n\n /**\n *\n * @param minOffset\n * @param maxOffset\n * @returns\n *\n * pending issue:\n * when item with length list [100, 0, 100, 0, 0, 100].\n * then computeRange(100, 200) => { startIndex: 2, endIndex: 6 }\n *\n * item index in viewport will be [2, 3, 4, 5], index 6 is not\n * included just like Array.slice(start, end)\n *\n */\n computeRange(minOffset: number, maxOffset: number) {\n if (this.getHeap()[1] < minOffset) {\n return {\n startIndex: this._actualSize,\n endIndex: this._actualSize,\n };\n }\n\n return {\n // the biggest item, value <= minOffset\n startIndex: this.greatestLowerBound(minOffset),\n\n // the smallest item, value > maxOffset\n endIndex: this.leastStrictUpperBound(maxOffset),\n };\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and t <= sumUntil(i), or\n * size + 1 if no such i exists.\n */\n leastUpperBound(t: number) {\n return this.greatestStrictLowerBound(t) + 1;\n }\n\n /**\n * Returns the smallest i, t < sumUntil(i), it should be used as range end\n * size + 1 if no such i exists.\n */\n leastStrictUpperBound(t: number) {\n return this.greatestLowerBound(t) + 1;\n }\n}\n\nexport default PrefixIntervalTree;\n"],"names":["parent","node","Math","floor","createArray","size","xs","i","ceilLog2","x","y","PrefixIntervalTree","opts","initWithNumber","Array","isArray","initWithArray","_ref","onUpdateItemLayout","onUpdateIntervalTree","_onUpdateIntervalTree","_onUpdateItemLayout","_proto","prototype","length","_half","_size","_heap","_actualSize","arr","uniform","initialValue","empty","stretch","nextHeap","nextHeapHalf","isValidIndex","index","reflowHeap","startIndex","endIndex","len","log2","from","v","reduce","acc","_nextStart","_nextEnd","idx","_this","remove","batchRemove","indices","sort","a","b","forEach","_this2","isNaN","console","warn","splice","push","get","removeV0","copy","slice","set","value","getMaxUsefulLength","getActualSize","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","max","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prefix-interval-tree.esm.js","sources":["../src/index.ts"],"sourcesContent":["const parent = (node: number) => Math.floor(node / 2);\n\nconst createArray = function (size: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = 0;\n }\n return xs;\n};\n\n/**\n * Computes the next power of 2 after or equal to x.\n */\nfunction ceilLog2(x: number) {\n let y = 1;\n while (y < x) {\n y *= 2;\n }\n\n return y;\n}\n\n/**\n * A prefix interval tree stores an numeric array and the partial sums of that\n * array. It is optimized for updating the values of the array without\n * recomputing all of the partial sums.\n *\n * - O(ln n) update\n * - O(1) lookup\n * - O(ln n) compute a partial sum\n * - O(n) space\n *\n * Note that the sequence of partial sums is one longer than the array, so that\n * the first partial sum is always 0, and the last partial sum is the sum of the\n * entire array.\n */\nclass PrefixIntervalTree {\n private _size: number;\n /**\n * Half the size of the heap. It is also the number of non-leaf nodes, and the\n * index of the first element in the heap. Always a power of 2.\n */\n private _half: number;\n private _heap: number[];\n\n private _actualSize: number;\n\n private _onUpdateItemLayout: Function;\n private _onUpdateIntervalTree: Function;\n\n constructor(\n xs: number[] | number,\n opts?: {\n onUpdateItemLayout?: Function;\n onUpdateIntervalTree?: Function;\n }\n ) {\n if (typeof xs === 'number') this.initWithNumber(xs);\n if (Array.isArray(xs)) this.initWithArray(xs);\n\n const { onUpdateItemLayout, onUpdateIntervalTree } = opts || {};\n this._onUpdateIntervalTree = onUpdateIntervalTree;\n this._onUpdateItemLayout = onUpdateItemLayout;\n }\n\n initWithNumber(length: number) {\n this._half = ceilLog2(length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n this._actualSize = 0;\n }\n\n initWithArray(arr: number[]) {\n this._half = ceilLog2(arr.length);\n this._size = this._half;\n this._heap = createArray(2 * this._half);\n let i;\n for (i = 0; i < this._size; ++i) {\n this._heap[this._half + i] = arr[i];\n }\n\n for (i = this._half - 1; i > 0; --i) {\n this._heap[i] = this._heap[2 * i] + this._heap[2 * i + 1];\n }\n this._actualSize = arr.length;\n }\n\n static uniform(size: number, initialValue: number) {\n const xs = [];\n for (let i = size - 1; i >= 0; --i) {\n xs[i] = initialValue;\n }\n\n return new PrefixIntervalTree(xs);\n }\n\n static empty(size: number) {\n return PrefixIntervalTree.uniform(size, 0);\n }\n\n /**\n * the length should be 2\n */\n stretch() {\n const nextHeap = createArray(2 * this._half * 2);\n const nextHeapHalf = this._half * 2;\n\n // copy old value to new one\n for (let i = 0; i < this._size; i++) {\n nextHeap[nextHeapHalf + i] = this._heap[this._half + i] || 0;\n }\n\n // sum old value to create new sum value\n for (let i = nextHeapHalf - 1; i > 0; i--) {\n nextHeap[i] = nextHeap[2 * i] + nextHeap[2 * i + 1];\n }\n\n this._half = nextHeapHalf;\n this._size = nextHeapHalf;\n this._heap = nextHeap;\n }\n\n isValidIndex(index: number) {\n return typeof index === 'number' && index >= 0 && index < this._actualSize;\n }\n\n reflowHeap(startIndex: number, endIndex = this._half * 2 - 2) {\n const len = Math.log2(this._size);\n\n Array.from({ length: len }, (v, i) => i).reduce(\n (acc) => {\n const { startIndex, endIndex } = acc;\n const _nextStart = parent(startIndex);\n const _nextEnd = parent(endIndex);\n\n for (let idx = _nextStart; idx <= _nextEnd; idx++) {\n this._heap[idx] = this._heap[2 * idx] + this._heap[2 * idx + 1];\n }\n\n return {\n startIndex: _nextStart,\n endIndex: _nextEnd,\n };\n },\n {\n startIndex,\n endIndex,\n }\n );\n }\n\n remove(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n\n this.batchRemove([index]);\n }\n\n batchRemove(indices: number[]) {\n indices.sort((a, b) => a - b);\n\n indices.forEach((index) => {\n if (!this.isValidIndex(index)) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n this._heap.splice(this._half + index, 1);\n this._heap.push(0);\n this._actualSize = this._actualSize - 1;\n });\n\n this.reflowHeap(indices[0] + this._half);\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n for (let idx = indices[0]; idx < this._half; idx++) {\n this._onUpdateItemLayout(idx, this.get(idx));\n }\n }\n }\n\n removeV0(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n if (!this.isValidIndex(index)) return;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return;\n }\n\n const nextHeap = createArray(this._half * 2);\n const copy = this._heap.slice(this._half);\n copy.splice(index, 1);\n\n for (let index = this._half; index < this._half * 2; index++) {\n nextHeap[index] = copy[index - this._half] || 0;\n }\n\n for (let index = this._half - 1; index > 0; index--) {\n nextHeap[index] = nextHeap[2 * index] + nextHeap[2 * index + 1];\n }\n\n this._actualSize = this._actualSize - 1;\n this._heap = nextHeap;\n }\n\n set(index: number, value: number) {\n if (typeof index !== 'number' || index < 0) return false;\n if (isNaN(index)) {\n console.warn('Passing a NaN value as interval tree index');\n return false;\n }\n\n while (index >= this._half) {\n this.stretch();\n }\n\n let node = this._half + index;\n this._heap[node] = value;\n\n node = parent(node);\n for (; node !== 0; node = parent(node)) {\n this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];\n }\n\n if (index + 1 > this._actualSize) {\n this._actualSize = index + 1;\n }\n\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n\n if (typeof this._onUpdateItemLayout === 'function') {\n this._onUpdateItemLayout(index, value);\n }\n return true;\n }\n\n getMaxUsefulLength() {\n return this.getActualSize();\n }\n\n getActualSize() {\n return this._actualSize;\n }\n\n get(index: number) {\n // invariant(index >= 0 && index < this._size, 'Index out of range %s', index);\n const node = this._half + index;\n return this._heap[node];\n }\n\n getSize() {\n return this._size;\n }\n\n getHalf() {\n return this._half;\n }\n\n getHeap() {\n return this._heap;\n }\n\n getMaxValue() {\n return this._heap[1];\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(end - 1).\n * End is not included. if end less than 0, then return 0\n */\n sumUntil(end: number) {\n // invariant(end >= 0 && end < this._size + 1, 'Index out of range %s', end);\n\n if (end <= 0) {\n return 0;\n }\n\n let node = this._half + end - 1;\n let sum = this._heap[node];\n\n for (; node !== 1; node = parent(node)) {\n if (node % 2 === 1) {\n sum += this._heap[node - 1];\n }\n }\n\n return sum;\n }\n\n /**\n * Returns the sum get(0) + get(1) + ... + get(inclusiveEnd).\n */\n sumTo(inclusiveEnd: number) {\n // invariant(\n // inclusiveEnd >= 0 && inclusiveEnd < this._size,\n // 'Index out of range %s',\n // inclusiveEnd\n // );\n return this.sumUntil(inclusiveEnd + 1);\n }\n\n /**\n * Returns the sum get(begin) + get(begin + 1) + ... + get(end - 1).\n * end length is not included\n */\n sum(begin: number, end: number) {\n // invariant(begin <= end, 'Begin must precede end');\n return this.sumUntil(end) - this.sumUntil(begin);\n }\n\n /**\n * return the biggest i, sumUntil(i) === t\n * return the biggest i, subUntil(i) < t\n */\n greatestLowerBound(t: number) {\n if (t < 0 || !this._actualSize) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n // not use this._size;this._size always be a big value\n return this._actualSize;\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t < leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._actualSize);\n }\n\n /**\n * Return the biggest i, subUntil(i) < t\n * or -1 if no such i exists.\n */\n greatestStrictLowerBound(t: number) {\n if (t <= 0 || !this._actualSize) {\n return -1;\n }\n\n let node = 1;\n if (this._heap[node] < t) {\n return this._actualSize;\n }\n\n while (node < this._half) {\n const leftSum = this._heap[2 * node];\n if (t <= leftSum) {\n node = 2 * node;\n } else {\n node = 2 * node + 1;\n t -= leftSum;\n }\n }\n\n return Math.min(node - this._half, this._actualSize);\n }\n\n /**\n *\n * @param minOffset\n * @param maxOffset\n * @returns\n *\n * pending issue:\n * when item with length list [100, 0, 100, 0, 0, 100].\n * then computeRange(100, 200) => { startIndex: 2, endIndex: 6 }\n *\n * item index in viewport will be [2, 3, 4, 5], index 6 is not\n * included just like Array.slice(start, end)\n *\n */\n computeRange(minOffset: number, maxOffset: number) {\n if (this.getHeap()[1] < minOffset) {\n return {\n startIndex: this._actualSize,\n endIndex: this._actualSize,\n };\n }\n\n return {\n // the biggest item, value <= minOffset\n startIndex: this.greatestLowerBound(minOffset),\n\n // the smallest item, value > maxOffset\n endIndex: this.leastStrictUpperBound(maxOffset),\n };\n }\n\n /**\n * Returns the smallest i such that 0 <= i <= size and t <= sumUntil(i), or\n * size + 1 if no such i exists.\n */\n leastUpperBound(t: number) {\n return Math.min(this.greatestStrictLowerBound(t) + 1, this._actualSize);\n }\n\n /**\n * Returns the smallest i, t < sumUntil(i), it should be used as range end\n * size + 1 if no such i exists.\n */\n leastStrictUpperBound(t: number) {\n return Math.min(this.greatestLowerBound(t) + 1, this._actualSize);\n }\n}\n\nexport default PrefixIntervalTree;\n"],"names":["parent","node","Math","floor","createArray","size","xs","i","ceilLog2","x","y","PrefixIntervalTree","opts","initWithNumber","Array","isArray","initWithArray","_ref","onUpdateItemLayout","onUpdateIntervalTree","_onUpdateIntervalTree","_onUpdateItemLayout","_proto","prototype","length","_half","_size","_heap","_actualSize","arr","uniform","initialValue","empty","stretch","nextHeap","nextHeapHalf","isValidIndex","index","reflowHeap","startIndex","endIndex","len","log2","from","v","reduce","acc","_nextStart","_nextEnd","idx","_this","remove","batchRemove","indices","sort","a","b","forEach","_this2","isNaN","console","warn","splice","push","get","removeV0","copy","slice","set","value","getMaxUsefulLength","getActualSize","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","leftSum","min","greatestStrictLowerBound","computeRange","minOffset","maxOffset","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -318,14 +318,14 @@ class PrefixIntervalTree {
|
|
|
318
318
|
* return the biggest i, subUntil(i) < t
|
|
319
319
|
*/
|
|
320
320
|
greatestLowerBound(t: number) {
|
|
321
|
-
if (t < 0) {
|
|
321
|
+
if (t < 0 || !this._actualSize) {
|
|
322
322
|
return -1;
|
|
323
323
|
}
|
|
324
324
|
|
|
325
325
|
let node = 1;
|
|
326
326
|
if (this._heap[node] < t) {
|
|
327
327
|
// not use this._size;this._size always be a big value
|
|
328
|
-
return
|
|
328
|
+
return this._actualSize;
|
|
329
329
|
}
|
|
330
330
|
|
|
331
331
|
while (node < this._half) {
|
|
@@ -338,7 +338,7 @@ class PrefixIntervalTree {
|
|
|
338
338
|
}
|
|
339
339
|
}
|
|
340
340
|
|
|
341
|
-
return Math.min(node - this._half, this._actualSize
|
|
341
|
+
return Math.min(node - this._half, this._actualSize);
|
|
342
342
|
}
|
|
343
343
|
|
|
344
344
|
/**
|
|
@@ -346,13 +346,13 @@ class PrefixIntervalTree {
|
|
|
346
346
|
* or -1 if no such i exists.
|
|
347
347
|
*/
|
|
348
348
|
greatestStrictLowerBound(t: number) {
|
|
349
|
-
if (t <= 0) {
|
|
349
|
+
if (t <= 0 || !this._actualSize) {
|
|
350
350
|
return -1;
|
|
351
351
|
}
|
|
352
352
|
|
|
353
353
|
let node = 1;
|
|
354
354
|
if (this._heap[node] < t) {
|
|
355
|
-
return
|
|
355
|
+
return this._actualSize;
|
|
356
356
|
}
|
|
357
357
|
|
|
358
358
|
while (node < this._half) {
|
|
@@ -365,7 +365,7 @@ class PrefixIntervalTree {
|
|
|
365
365
|
}
|
|
366
366
|
}
|
|
367
367
|
|
|
368
|
-
return Math.min(node - this._half, this._actualSize
|
|
368
|
+
return Math.min(node - this._half, this._actualSize);
|
|
369
369
|
}
|
|
370
370
|
|
|
371
371
|
/**
|
|
@@ -404,7 +404,7 @@ class PrefixIntervalTree {
|
|
|
404
404
|
* size + 1 if no such i exists.
|
|
405
405
|
*/
|
|
406
406
|
leastUpperBound(t: number) {
|
|
407
|
-
return this.greatestStrictLowerBound(t) + 1;
|
|
407
|
+
return Math.min(this.greatestStrictLowerBound(t) + 1, this._actualSize);
|
|
408
408
|
}
|
|
409
409
|
|
|
410
410
|
/**
|
|
@@ -412,7 +412,7 @@ class PrefixIntervalTree {
|
|
|
412
412
|
* size + 1 if no such i exists.
|
|
413
413
|
*/
|
|
414
414
|
leastStrictUpperBound(t: number) {
|
|
415
|
-
return this.greatestLowerBound(t) + 1;
|
|
415
|
+
return Math.min(this.greatestLowerBound(t) + 1, this._actualSize);
|
|
416
416
|
}
|
|
417
417
|
}
|
|
418
418
|
|