@x-oasis/prefix-interval-tree 0.2.2 → 0.2.4

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/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ declare type OperationType = 'set' | 'remove';
1
2
  declare class PrefixIntervalTree {
2
3
  private _size;
3
4
  private _half;
@@ -5,7 +6,10 @@ declare class PrefixIntervalTree {
5
6
  private _actualSize;
6
7
  private _onUpdateItemLayout;
7
8
  private _onUpdateIntervalTree;
8
- constructor(xs: number[] | number, opts?: {
9
+ private _affectedIndicesMap;
10
+ private _affectedMinimalIndex;
11
+ private _cachedSumUntilValues;
12
+ constructor(xs?: number[] | number, opts?: {
9
13
  onUpdateItemLayout?: Function;
10
14
  onUpdateIntervalTree?: Function;
11
15
  });
@@ -14,12 +18,21 @@ declare class PrefixIntervalTree {
14
18
  static uniform(size: number, initialValue: number): PrefixIntervalTree;
15
19
  static empty(size: number): PrefixIntervalTree;
16
20
  stretch(): void;
21
+ indexKey(index: number): string;
22
+ resolveKeyIndex(key: string): number;
17
23
  isValidIndex(index: number): boolean;
18
- reflowHeap(startIndex: number, endIndex?: number): void;
24
+ reflowDirectParent(index: number): void;
25
+ reflowHeap(_startIndex: number, endIndex?: number): void;
26
+ dryRemove(index: number): void;
19
27
  remove(index: number): void;
20
- batchRemove(indices: number[]): void;
28
+ removeIndices(indices: number[]): void;
21
29
  removeV0(index: number): void;
30
+ resetAffected(): void;
31
+ updateAffectedIndices(index: number, type: OperationType, value?: number): void;
32
+ onUpdateIntervalTree(): void;
33
+ drySet(index: number, value: number): boolean;
22
34
  set(index: number, value: number): boolean;
35
+ applyUpdate(): void;
23
36
  getMaxUsefulLength(): number;
24
37
  getActualSize(): number;
25
38
  get(index: number): number;
@@ -21,6 +21,12 @@ function ceilLog2(x) {
21
21
  }
22
22
  var PrefixIntervalTree = /*#__PURE__*/function () {
23
23
  function PrefixIntervalTree(xs, opts) {
24
+ if (xs === void 0) {
25
+ xs = 10;
26
+ }
27
+ this._affectedIndicesMap = {};
28
+ this._affectedMinimalIndex = undefined;
29
+ this._cachedSumUntilValues = {};
24
30
  if (typeof xs === 'number') this.initWithNumber(xs);
25
31
  if (Array.isArray(xs)) this.initWithArray(xs);
26
32
  var _ref = opts || {},
@@ -72,17 +78,33 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
72
78
  this._size = nextHeapHalf;
73
79
  this._heap = nextHeap;
74
80
  };
81
+ _proto.indexKey = function indexKey(index) {
82
+ return "" + index;
83
+ };
84
+ _proto.resolveKeyIndex = function resolveKeyIndex(key) {
85
+ return parseInt(key, 10);
86
+ };
75
87
  _proto.isValidIndex = function isValidIndex(index) {
76
88
  return typeof index === 'number' && index >= 0 && index < this._actualSize;
77
89
  };
78
- _proto.reflowHeap = function reflowHeap(startIndex, endIndex) {
90
+ _proto.reflowDirectParent = function reflowDirectParent(index) {
91
+ this.resetAffected();
92
+ var node = this._half + index;
93
+ node = parent(node);
94
+ for (; node !== 0; node = parent(node)) {
95
+ this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];
96
+ }
97
+ };
98
+ _proto.reflowHeap = function reflowHeap(_startIndex, endIndex) {
79
99
  var _this = this;
80
100
  if (endIndex === void 0) {
81
101
  endIndex = this._half * 2 - 2;
82
102
  }
83
- var len = Math.log2(this._size);
103
+ this.resetAffected();
104
+ var depth = Math.log2(this._size);
105
+ var startIndex = _startIndex + this._half;
84
106
  Array.from({
85
- length: len
107
+ length: depth
86
108
  }, function (v, i) {
87
109
  return i;
88
110
  }).reduce(function (acc) {
@@ -102,28 +124,30 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
102
124
  endIndex: endIndex
103
125
  });
104
126
  };
127
+ _proto.dryRemove = function dryRemove(index) {
128
+ if (!this.isValidIndex(index)) return;
129
+ if (isNaN(index)) {
130
+ console.warn('Passing a NaN value as interval tree index');
131
+ return;
132
+ }
133
+ this._heap.splice(this._half + index, 1);
134
+ this._heap.push(0);
135
+ this._actualSize = this._actualSize - 1;
136
+ this.updateAffectedIndices(index, 'remove');
137
+ };
105
138
  _proto.remove = function remove(index) {
106
- this.batchRemove([index]);
139
+ this.removeIndices([index]);
107
140
  };
108
- _proto.batchRemove = function batchRemove(indices) {
141
+ _proto.removeIndices = function removeIndices(indices) {
109
142
  var _this2 = this;
110
143
  indices.sort(function (a, b) {
111
144
  return a - b;
112
145
  });
113
146
  indices.forEach(function (index) {
114
- if (!_this2.isValidIndex(index)) return;
115
- if (isNaN(index)) {
116
- console.warn('Passing a NaN value as interval tree index');
117
- return;
118
- }
119
- _this2._heap.splice(_this2._half + index, 1);
120
- _this2._heap.push(0);
121
- _this2._actualSize = _this2._actualSize - 1;
147
+ return _this2.dryRemove(index);
122
148
  });
123
- this.reflowHeap(indices[0] + this._half);
124
- if (typeof this._onUpdateIntervalTree === 'function') {
125
- this._onUpdateIntervalTree(this._heap);
126
- }
149
+ this.reflowHeap(indices[0]);
150
+ this.onUpdateIntervalTree();
127
151
  if (typeof this._onUpdateItemLayout === 'function') {
128
152
  for (var idx = indices[0]; idx < this._half; idx++) {
129
153
  this._onUpdateItemLayout(idx, this.get(idx));
@@ -148,7 +172,26 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
148
172
  this._actualSize = this._actualSize - 1;
149
173
  this._heap = nextHeap;
150
174
  };
151
- _proto.set = function set(index, value) {
175
+ _proto.resetAffected = function resetAffected() {
176
+ this._affectedIndicesMap = {};
177
+ this._affectedMinimalIndex = undefined;
178
+ };
179
+ _proto.updateAffectedIndices = function updateAffectedIndices(index, type, value) {
180
+ if (typeof index === 'number') {
181
+ this._affectedMinimalIndex = typeof this._affectedMinimalIndex === 'number' ? Math.min(this._affectedMinimalIndex, index) : index;
182
+ this._affectedIndicesMap[this.indexKey(index)] = {
183
+ value: value,
184
+ type: type
185
+ };
186
+ }
187
+ };
188
+ _proto.onUpdateIntervalTree = function onUpdateIntervalTree() {
189
+ this._cachedSumUntilValues = {};
190
+ if (typeof this._onUpdateIntervalTree === 'function') {
191
+ this._onUpdateIntervalTree(this._heap);
192
+ }
193
+ };
194
+ _proto.drySet = function drySet(index, value) {
152
195
  if (typeof index !== 'number' || index < 0) return false;
153
196
  if (isNaN(index)) {
154
197
  console.warn('Passing a NaN value as interval tree index');
@@ -159,21 +202,45 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
159
202
  }
160
203
  var node = this._half + index;
161
204
  this._heap[node] = value;
162
- node = parent(node);
163
- for (; node !== 0; node = parent(node)) {
164
- this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];
165
- }
205
+ this.updateAffectedIndices(index, 'set', value);
166
206
  if (index + 1 > this._actualSize) {
167
207
  this._actualSize = index + 1;
168
208
  }
169
- if (typeof this._onUpdateIntervalTree === 'function') {
170
- this._onUpdateIntervalTree(this._heap);
171
- }
209
+ return true;
210
+ };
211
+ _proto.set = function set(index, value) {
212
+ this.drySet(index, value);
213
+ this.reflowDirectParent(index);
214
+ this.onUpdateIntervalTree();
172
215
  if (typeof this._onUpdateItemLayout === 'function') {
173
216
  this._onUpdateItemLayout(index, value);
174
217
  }
175
218
  return true;
176
219
  };
220
+ _proto.applyUpdate = function applyUpdate() {
221
+ var _this3 = this;
222
+ if (typeof this._affectedMinimalIndex === 'number') {
223
+ var index = this._affectedMinimalIndex;
224
+ var keys = Object.keys(this._affectedIndicesMap);
225
+ var hasRemoveItem = keys.some(function (key) {
226
+ return _this3._affectedIndicesMap[key].type === 'remove';
227
+ });
228
+ if (hasRemoveItem) {
229
+ return this.reflowHeap(index);
230
+ }
231
+ var depth = Math.log2(this._size);
232
+ var itemLength = keys.length;
233
+ var reflowTimes = this._half - index - 1;
234
+ if (depth * itemLength > reflowTimes) {
235
+ return this.reflowHeap(index);
236
+ }
237
+ keys.forEach(function (key) {
238
+ return _this3.reflowDirectParent(_this3.resolveKeyIndex(key));
239
+ });
240
+ this.onUpdateIntervalTree();
241
+ this.resetAffected();
242
+ }
243
+ };
177
244
  _proto.getMaxUsefulLength = function getMaxUsefulLength() {
178
245
  return this.getActualSize();
179
246
  };
@@ -197,6 +264,7 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
197
264
  return this._heap[1];
198
265
  };
199
266
  _proto.sumUntil = function sumUntil(end) {
267
+ if (this._cachedSumUntilValues["" + end] != null) return this._cachedSumUntilValues["" + end];
200
268
  if (end <= 0) {
201
269
  return 0;
202
270
  }
@@ -216,12 +284,12 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
216
284
  return this.sumUntil(end) - this.sumUntil(begin);
217
285
  };
218
286
  _proto.greatestLowerBound = function greatestLowerBound(t) {
219
- if (t < 0) {
287
+ if (t < 0 || !this._actualSize) {
220
288
  return -1;
221
289
  }
222
290
  var node = 1;
223
291
  if (this._heap[node] < t) {
224
- return Math.max(this._actualSize - 1, 0);
292
+ return this._actualSize;
225
293
  }
226
294
  while (node < this._half) {
227
295
  var leftSum = this._heap[2 * node];
@@ -232,15 +300,15 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
232
300
  t -= leftSum;
233
301
  }
234
302
  }
235
- return Math.min(node - this._half, this._actualSize - 1);
303
+ return Math.min(node - this._half, this._actualSize);
236
304
  };
237
305
  _proto.greatestStrictLowerBound = function greatestStrictLowerBound(t) {
238
- if (t <= 0) {
306
+ if (t <= 0 || !this._actualSize) {
239
307
  return -1;
240
308
  }
241
309
  var node = 1;
242
310
  if (this._heap[node] < t) {
243
- return Math.max(this._actualSize - 1, 0);
311
+ return this._actualSize;
244
312
  }
245
313
  while (node < this._half) {
246
314
  var leftSum = this._heap[2 * node];
@@ -251,7 +319,7 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
251
319
  t -= leftSum;
252
320
  }
253
321
  }
254
- return Math.min(node - this._half, this._actualSize - 1);
322
+ return Math.min(node - this._half, this._actualSize);
255
323
  };
256
324
  _proto.computeRange = function computeRange(minOffset, maxOffset) {
257
325
  if (this.getHeap()[1] < minOffset) {
@@ -266,10 +334,10 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
266
334
  };
267
335
  };
268
336
  _proto.leastUpperBound = function leastUpperBound(t) {
269
- return this.greatestStrictLowerBound(t) + 1;
337
+ return Math.min(this.greatestStrictLowerBound(t) + 1, this._actualSize);
270
338
  };
271
339
  _proto.leastStrictUpperBound = function leastStrictUpperBound(t) {
272
- return this.greatestLowerBound(t) + 1;
340
+ return Math.min(this.greatestLowerBound(t) + 1, this._actualSize);
273
341
  };
274
342
  return PrefixIntervalTree;
275
343
  }();
@@ -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\ntype OperationType = 'set' | 'remove';\n\ntype Operation = {\n type: OperationType;\n value: any;\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 private _affectedIndicesMap: {\n [key: string]: Operation;\n } = {};\n private _affectedMinimalIndex: number = undefined;\n private _cachedSumUntilValues: {\n [key: string]: number;\n } = {};\n\n constructor(\n xs: number[] | number = 10,\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 * it will cause calculation of\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 indexKey(index: number) {\n return `${index}`;\n }\n\n resolveKeyIndex(key: string) {\n return parseInt(key, 10);\n }\n\n isValidIndex(index: number) {\n return typeof index === 'number' && index >= 0 && index < this._actualSize;\n }\n\n reflowDirectParent(index: number) {\n this.resetAffected();\n let node = this._half + index;\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\n // recalculate parent value from startIndex to endIndex\n reflowHeap(_startIndex: number, endIndex = this._half * 2 - 2) {\n this.resetAffected();\n const depth = Math.log2(this._size);\n const startIndex = _startIndex + this._half;\n\n Array.from({ length: depth }, (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 /**\n *\n * @param index index to remove\n * @returns\n *\n * update heap only, but not recalculate interval tree value\n */\n dryRemove(index: number) {\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 this.updateAffectedIndices(index, 'remove');\n }\n\n remove(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n\n this.removeIndices([index]);\n }\n\n removeIndices(indices: number[]) {\n indices.sort((a, b) => a - b);\n\n indices.forEach((index) => this.dryRemove(index));\n\n this.reflowHeap(indices[0]);\n this.onUpdateIntervalTree();\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 resetAffected() {\n this._affectedIndicesMap = {};\n this._affectedMinimalIndex = undefined;\n }\n\n updateAffectedIndices(index: number, type: OperationType, value?: number) {\n if (typeof index === 'number') {\n this._affectedMinimalIndex =\n typeof this._affectedMinimalIndex === 'number'\n ? Math.min(this._affectedMinimalIndex, index)\n : index;\n this._affectedIndicesMap[this.indexKey(index)] = {\n value,\n type,\n };\n }\n }\n\n onUpdateIntervalTree() {\n // reset cached value\n this._cachedSumUntilValues = {};\n\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n }\n\n drySet(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 const node = this._half + index;\n this._heap[node] = value;\n\n this.updateAffectedIndices(index, 'set', value);\n\n if (index + 1 > this._actualSize) {\n this._actualSize = index + 1;\n }\n return true;\n }\n\n set(index: number, value: number) {\n this.drySet(index, value);\n this.reflowDirectParent(index);\n this.onUpdateIntervalTree();\n if (typeof this._onUpdateItemLayout === 'function') {\n this._onUpdateItemLayout(index, value);\n }\n return true;\n }\n\n applyUpdate() {\n if (typeof this._affectedMinimalIndex === 'number') {\n const index = this._affectedMinimalIndex;\n\n const keys = Object.keys(this._affectedIndicesMap);\n const hasRemoveItem = keys.some(\n (key) => this._affectedIndicesMap[key].type === 'remove'\n );\n\n if (hasRemoveItem) {\n return this.reflowHeap(index);\n }\n\n const depth = Math.log2(this._size);\n const itemLength = keys.length;\n\n const reflowTimes = this._half - index - 1;\n\n if (depth * itemLength > reflowTimes) {\n return this.reflowHeap(index);\n }\n\n keys.forEach((key) => this.reflowDirectParent(this.resolveKeyIndex(key)));\n\n this.onUpdateIntervalTree();\n\n this.resetAffected();\n }\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 (this._cachedSumUntilValues[`${end}`] != null)\n return this._cachedSumUntilValues[`${end}`];\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","undefined","initWithNumber","Array","isArray","initWithArray","_ref","onUpdateItemLayout","onUpdateIntervalTree","_onUpdateIntervalTree","_onUpdateItemLayout","_proto","prototype","length","_half","_size","_heap","_actualSize","arr","uniform","initialValue","empty","stretch","nextHeap","nextHeapHalf","indexKey","index","resolveKeyIndex","key","parseInt","isValidIndex","reflowDirectParent","resetAffected","reflowHeap","_startIndex","endIndex","depth","log2","startIndex","from","v","reduce","acc","_nextStart","_nextEnd","idx","_this","dryRemove","isNaN","console","warn","splice","push","updateAffectedIndices","remove","removeIndices","indices","sort","a","b","forEach","_this2","get","removeV0","copy","slice","_affectedIndicesMap","_affectedMinimalIndex","type","value","min","_cachedSumUntilValues","drySet","set","applyUpdate","keys","Object","hasRemoveItem","some","_this3","itemLength","reflowTimes","getMaxUsefulLength","getActualSize","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","leftSum","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 Math.max(this._actualSize-1,0);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-1)},n.greatestStrictLowerBound=function(t){if(t<=0)return-1;var e=1;if(this._heap[e]<t)return Math.max(this._actualSize-1,0);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-1)},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 this.greatestStrictLowerBound(t)+1},n.leastStrictUpperBound=function(t){return this.greatestLowerBound(t)+1},a}();
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 n(t,e){void 0===t&&(t=10),this._affectedIndicesMap={},this._affectedMinimalIndex=void 0,this._cachedSumUntilValues={},"number"==typeof t&&this.initWithNumber(t),Array.isArray(t)&&this.initWithArray(t);var i=e||{},n=i.onUpdateItemLayout;this._onUpdateIntervalTree=i.onUpdateIntervalTree,this._onUpdateItemLayout=n}var a=n.prototype;return a.initWithNumber=function(t){this._half=i(t),this._size=this._half,this._heap=e(2*this._half),this._actualSize=0},a.initWithArray=function(t){var n;for(this._half=i(t.length),this._size=this._half,this._heap=e(2*this._half),n=0;n<this._size;++n)this._heap[this._half+n]=t[n];for(n=this._half-1;n>0;--n)this._heap[n]=this._heap[2*n]+this._heap[2*n+1];this._actualSize=t.length},n.uniform=function(t,e){for(var i=[],a=t-1;a>=0;--a)i[a]=e;return new n(i)},n.empty=function(t){return n.uniform(t,0)},a.stretch=function(){for(var t=e(2*this._half*2),i=2*this._half,n=0;n<this._size;n++)t[i+n]=this._heap[this._half+n]||0;for(var a=i-1;a>0;a--)t[a]=t[2*a]+t[2*a+1];this._half=i,this._size=i,this._heap=t},a.indexKey=function(t){return""+t},a.resolveKeyIndex=function(t){return parseInt(t,10)},a.isValidIndex=function(t){return"number"==typeof t&&t>=0&&t<this._actualSize},a.reflowDirectParent=function(e){this.resetAffected();var i=this._half+e;for(i=t(i);0!==i;i=t(i))this._heap[i]=this._heap[2*i]+this._heap[2*i+1]},a.reflowHeap=function(e,i){var n=this;void 0===i&&(i=2*this._half-2),this.resetAffected();var a=Math.log2(this._size),r=e+this._half;Array.from({length:a},(function(t,e){return e})).reduce((function(e){for(var i=e.endIndex,a=t(e.startIndex),r=t(i),h=a;h<=r;h++)n._heap[h]=n._heap[2*h]+n._heap[2*h+1];return{startIndex:a,endIndex:r}}),{startIndex:r,endIndex:i})},a.dryRemove=function(t){this.isValidIndex(t)&&(isNaN(t)?console.warn("Passing a NaN value as interval tree index"):(this._heap.splice(this._half+t,1),this._heap.push(0),this._actualSize=this._actualSize-1,this.updateAffectedIndices(t,"remove")))},a.remove=function(t){this.removeIndices([t])},a.removeIndices=function(t){var e=this;if(t.sort((function(t,e){return t-e})),t.forEach((function(t){return e.dryRemove(t)})),this.reflowHeap(t[0]),this.onUpdateIntervalTree(),"function"==typeof this._onUpdateItemLayout)for(var i=t[0];i<this._half;i++)this._onUpdateItemLayout(i,this.get(i))},a.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),n=this._heap.slice(this._half);n.splice(t,1);for(var a=this._half;a<2*this._half;a++)i[a]=n[a-this._half]||0;for(var r=this._half-1;r>0;r--)i[r]=i[2*r]+i[2*r+1];this._actualSize=this._actualSize-1,this._heap=i}},a.resetAffected=function(){this._affectedIndicesMap={},this._affectedMinimalIndex=void 0},a.updateAffectedIndices=function(t,e,i){"number"==typeof t&&(this._affectedMinimalIndex="number"==typeof this._affectedMinimalIndex?Math.min(this._affectedMinimalIndex,t):t,this._affectedIndicesMap[this.indexKey(t)]={value:i,type:e})},a.onUpdateIntervalTree=function(){this._cachedSumUntilValues={},"function"==typeof this._onUpdateIntervalTree&&this._onUpdateIntervalTree(this._heap)},a.drySet=function(t,e){if("number"!=typeof t||t<0)return!1;if(isNaN(t))return console.warn("Passing a NaN value as interval tree index"),!1;for(;t>=this._half;)this.stretch();return this._heap[this._half+t]=e,this.updateAffectedIndices(t,"set",e),t+1>this._actualSize&&(this._actualSize=t+1),!0},a.set=function(t,e){return this.drySet(t,e),this.reflowDirectParent(t),this.onUpdateIntervalTree(),"function"==typeof this._onUpdateItemLayout&&this._onUpdateItemLayout(t,e),!0},a.applyUpdate=function(){var t=this;if("number"==typeof this._affectedMinimalIndex){var e=this._affectedMinimalIndex,i=Object.keys(this._affectedIndicesMap);if(i.some((function(e){return"remove"===t._affectedIndicesMap[e].type})))return this.reflowHeap(e);if(Math.log2(this._size)*i.length>this._half-e-1)return this.reflowHeap(e);i.forEach((function(e){return t.reflowDirectParent(t.resolveKeyIndex(e))})),this.onUpdateIntervalTree(),this.resetAffected()}},a.getMaxUsefulLength=function(){return this.getActualSize()},a.getActualSize=function(){return this._actualSize},a.get=function(t){return this._heap[this._half+t]},a.getSize=function(){return this._size},a.getHalf=function(){return this._half},a.getHeap=function(){return this._heap},a.getMaxValue=function(){return this._heap[1]},a.sumUntil=function(e){if(null!=this._cachedSumUntilValues[""+e])return this._cachedSumUntilValues[""+e];if(e<=0)return 0;for(var i=this._half+e-1,n=this._heap[i];1!==i;i=t(i))i%2==1&&(n+=this._heap[i-1]);return n},a.sumTo=function(t){return this.sumUntil(t+1)},a.sum=function(t,e){return this.sumUntil(e)-this.sumUntil(t)},a.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)},a.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)},a.computeRange=function(t,e){return this.getHeap()[1]<t?{startIndex:this._actualSize,endIndex:this._actualSize}:{startIndex:this.greatestLowerBound(t),endIndex:this.leastStrictUpperBound(e)}},a.leastUpperBound=function(t){return Math.min(this.greatestStrictLowerBound(t)+1,this._actualSize)},a.leastStrictUpperBound=function(t){return Math.min(this.greatestLowerBound(t)+1,this._actualSize)},n}();
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":"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"}
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\ntype OperationType = 'set' | 'remove';\n\ntype Operation = {\n type: OperationType;\n value: any;\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 private _affectedIndicesMap: {\n [key: string]: Operation;\n } = {};\n private _affectedMinimalIndex: number = undefined;\n private _cachedSumUntilValues: {\n [key: string]: number;\n } = {};\n\n constructor(\n xs: number[] | number = 10,\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 * it will cause calculation of\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 indexKey(index: number) {\n return `${index}`;\n }\n\n resolveKeyIndex(key: string) {\n return parseInt(key, 10);\n }\n\n isValidIndex(index: number) {\n return typeof index === 'number' && index >= 0 && index < this._actualSize;\n }\n\n reflowDirectParent(index: number) {\n this.resetAffected();\n let node = this._half + index;\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\n // recalculate parent value from startIndex to endIndex\n reflowHeap(_startIndex: number, endIndex = this._half * 2 - 2) {\n this.resetAffected();\n const depth = Math.log2(this._size);\n const startIndex = _startIndex + this._half;\n\n Array.from({ length: depth }, (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 /**\n *\n * @param index index to remove\n * @returns\n *\n * update heap only, but not recalculate interval tree value\n */\n dryRemove(index: number) {\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 this.updateAffectedIndices(index, 'remove');\n }\n\n remove(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n\n this.removeIndices([index]);\n }\n\n removeIndices(indices: number[]) {\n indices.sort((a, b) => a - b);\n\n indices.forEach((index) => this.dryRemove(index));\n\n this.reflowHeap(indices[0]);\n this.onUpdateIntervalTree();\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 resetAffected() {\n this._affectedIndicesMap = {};\n this._affectedMinimalIndex = undefined;\n }\n\n updateAffectedIndices(index: number, type: OperationType, value?: number) {\n if (typeof index === 'number') {\n this._affectedMinimalIndex =\n typeof this._affectedMinimalIndex === 'number'\n ? Math.min(this._affectedMinimalIndex, index)\n : index;\n this._affectedIndicesMap[this.indexKey(index)] = {\n value,\n type,\n };\n }\n }\n\n onUpdateIntervalTree() {\n // reset cached value\n this._cachedSumUntilValues = {};\n\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n }\n\n drySet(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 const node = this._half + index;\n this._heap[node] = value;\n\n this.updateAffectedIndices(index, 'set', value);\n\n if (index + 1 > this._actualSize) {\n this._actualSize = index + 1;\n }\n return true;\n }\n\n set(index: number, value: number) {\n this.drySet(index, value);\n this.reflowDirectParent(index);\n this.onUpdateIntervalTree();\n if (typeof this._onUpdateItemLayout === 'function') {\n this._onUpdateItemLayout(index, value);\n }\n return true;\n }\n\n applyUpdate() {\n if (typeof this._affectedMinimalIndex === 'number') {\n const index = this._affectedMinimalIndex;\n\n const keys = Object.keys(this._affectedIndicesMap);\n const hasRemoveItem = keys.some(\n (key) => this._affectedIndicesMap[key].type === 'remove'\n );\n\n if (hasRemoveItem) {\n return this.reflowHeap(index);\n }\n\n const depth = Math.log2(this._size);\n const itemLength = keys.length;\n\n const reflowTimes = this._half - index - 1;\n\n if (depth * itemLength > reflowTimes) {\n return this.reflowHeap(index);\n }\n\n keys.forEach((key) => this.reflowDirectParent(this.resolveKeyIndex(key)));\n\n this.onUpdateIntervalTree();\n\n this.resetAffected();\n }\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 (this._cachedSumUntilValues[`${end}`] != null)\n return this._cachedSumUntilValues[`${end}`];\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","undefined","initWithNumber","Array","isArray","initWithArray","_ref","onUpdateItemLayout","_onUpdateIntervalTree","onUpdateIntervalTree","_onUpdateItemLayout","_proto","prototype","length","_half","_size","_heap","_actualSize","arr","uniform","initialValue","empty","stretch","nextHeap","nextHeapHalf","indexKey","index","resolveKeyIndex","key","parseInt","isValidIndex","reflowDirectParent","resetAffected","reflowHeap","_startIndex","endIndex","depth","log2","startIndex","from","v","reduce","acc","_nextStart","_nextEnd","idx","_this","dryRemove","isNaN","console","warn","splice","push","updateAffectedIndices","remove","removeIndices","indices","sort","a","b","forEach","_this2","get","removeV0","copy","slice","_affectedIndicesMap","_affectedMinimalIndex","type","value","min","_cachedSumUntilValues","drySet","set","applyUpdate","keys","Object","some","_this3","getMaxUsefulLength","getActualSize","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","leftSum","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,6BA8CP,SAAAC,EACEL,EACAM,YADAN,IAAAA,EAAwB,IATlBO,yBAEJ,GACIA,gCAAgCC,EAChCD,2BAEJ,GASgB,iBAAPP,GAAiBO,KAAKE,eAAeT,GAC5CU,MAAMC,QAAQX,IAAKO,KAAKK,cAAcZ,GAE1C,IAAAa,EAAqDP,GAAQ,GAArDQ,EAAkBD,EAAlBC,mBACRP,KAAKQ,sBAD2CF,EAApBG,qBAE5BT,KAAKU,oBAAsBH,EAC5B,IAAAI,EAAAb,EAAAc,UAybA,OAzbAD,EAEDT,eAAA,SAAeW,GACbb,KAAKc,MAAQnB,EAASkB,GACtBb,KAAKe,MAAQf,KAAKc,MAClBd,KAAKgB,MAAQzB,EAAY,EAAIS,KAAKc,OAClCd,KAAKiB,YAAc,GACpBN,EAEDN,cAAA,SAAca,GAIZ,IAAIxB,EACJ,IAJAM,KAAKc,MAAQnB,EAASuB,EAAIL,QAC1Bb,KAAKe,MAAQf,KAAKc,MAClBd,KAAKgB,MAAQzB,EAAY,EAAIS,KAAKc,OAE7BpB,EAAI,EAAGA,EAAIM,KAAKe,QAASrB,EAC5BM,KAAKgB,MAAMhB,KAAKc,MAAQpB,GAAKwB,EAAIxB,GAGnC,IAAKA,EAAIM,KAAKc,MAAQ,EAAGpB,EAAI,IAAKA,EAChCM,KAAKgB,MAAMtB,GAAKM,KAAKgB,MAAM,EAAItB,GAAKM,KAAKgB,MAAM,EAAItB,EAAI,GAEzDM,KAAKiB,YAAcC,EAAIL,QACxBf,EAEMqB,QAAP,SAAe3B,EAAc4B,GAE3B,IADA,IAAM3B,EAAK,GACFC,EAAIF,EAAO,EAAGE,GAAK,IAAKA,EAC/BD,EAAGC,GAAK0B,EAGV,OAAO,IAAItB,EAAmBL,IAC/BK,EAEMuB,MAAP,SAAa7B,GACX,OAAOM,EAAmBqB,QAAQ3B,EAAM,IACzCmB,EAMDW,QAAA,WAKE,IAJA,IAAMC,EAAWhC,EAAY,EAAIS,KAAKc,MAAQ,GACxCU,EAA4B,EAAbxB,KAAKc,MAGjBpB,EAAI,EAAGA,EAAIM,KAAKe,MAAOrB,IAC9B6B,EAASC,EAAe9B,GAAKM,KAAKgB,MAAMhB,KAAKc,MAAQpB,IAAM,EAI7D,IAAK,IAAIA,EAAI8B,EAAe,EAAG9B,EAAI,EAAGA,IACpC6B,EAAS7B,GAAK6B,EAAS,EAAI7B,GAAK6B,EAAS,EAAI7B,EAAI,GAGnDM,KAAKc,MAAQU,EACbxB,KAAKe,MAAQS,EACbxB,KAAKgB,MAAQO,GACdZ,EAEDc,SAAA,SAASC,GACP,SAAUA,GACXf,EAEDgB,gBAAA,SAAgBC,GACd,OAAOC,SAASD,EAAK,KACtBjB,EAEDmB,aAAA,SAAaJ,GACX,MAAwB,iBAAVA,GAAsBA,GAAS,GAAKA,EAAQ1B,KAAKiB,aAChEN,EAEDoB,mBAAA,SAAmBL,GACjB1B,KAAKgC,gBACL,IAAI5C,EAAOY,KAAKc,MAAQY,EAGxB,IADAtC,EAAOD,EAAOC,GACE,IAATA,EAAYA,EAAOD,EAAOC,GAC/BY,KAAKgB,MAAM5B,GAAQY,KAAKgB,MAAM,EAAI5B,GAAQY,KAAKgB,MAAM,EAAI5B,EAAO,IAEnEuB,EAGDsB,WAAA,SAAWC,EAAqBC,uBAAAA,IAAAA,EAAwB,EAAbnC,KAAKc,MAAY,GAC1Dd,KAAKgC,gBACL,IAAMI,EAAQ/C,KAAKgD,KAAKrC,KAAKe,OACvBuB,EAAaJ,EAAclC,KAAKc,MAEtCX,MAAMoC,KAAK,CAAE1B,OAAQuB,IAAS,SAACI,EAAG9C,GAAC,OAAKA,KAAG+C,QACzC,SAACC,GAKC,IAJA,IAAoBP,EAAaO,EAAbP,SACdQ,EAAaxD,EADcuD,EAAzBJ,YAEFM,EAAWzD,EAAOgD,GAEfU,EAAMF,EAAYE,GAAOD,EAAUC,IAC1CC,EAAK9B,MAAM6B,GAAOC,EAAK9B,MAAM,EAAI6B,GAAOC,EAAK9B,MAAM,EAAI6B,EAAM,GAG/D,MAAO,CACLP,WAAYK,EACZR,SAAUS,KAGd,CACEN,WAAAA,EACAH,SAAAA,KAGLxB,EASDoC,UAAA,SAAUrB,GACH1B,KAAK8B,aAAaJ,KACnBsB,MAAMtB,GACRuB,QAAQC,KAAK,+CAIflD,KAAKgB,MAAMmC,OAAOnD,KAAKc,MAAQY,EAAO,GACtC1B,KAAKgB,MAAMoC,KAAK,GAChBpD,KAAKiB,YAAcjB,KAAKiB,YAAc,EAEtCjB,KAAKqD,sBAAsB3B,EAAO,aACnCf,EAED2C,OAAA,SAAO5B,GAGL1B,KAAKuD,cAAc,CAAC7B,KACrBf,EAED4C,cAAA,SAAcC,cAQZ,GAPAA,EAAQC,MAAK,SAACC,EAAGC,GAAC,OAAKD,EAAIC,KAE3BH,EAAQI,SAAQ,SAAClC,GAAK,OAAKmC,EAAKd,UAAUrB,MAE1C1B,KAAKiC,WAAWuB,EAAQ,IACxBxD,KAAKS,uBAEmC,mBAA7BT,KAAKU,oBACd,IAAK,IAAImC,EAAMW,EAAQ,GAAIX,EAAM7C,KAAKc,MAAO+B,IAC3C7C,KAAKU,oBAAoBmC,EAAK7C,KAAK8D,IAAIjB,KAG5ClC,EAEDoD,SAAA,SAASrC,GAEP,GAAK1B,KAAK8B,aAAaJ,GACvB,GAAIsB,MAAMtB,GACRuB,QAAQC,KAAK,kDADf,CAKA,IAAM3B,EAAWhC,EAAyB,EAAbS,KAAKc,OAC5BkD,EAAOhE,KAAKgB,MAAMiD,MAAMjE,KAAKc,OACnCkD,EAAKb,OAAOzB,EAAO,GAEnB,IAAK,IAAIA,EAAQ1B,KAAKc,MAAOY,EAAqB,EAAb1B,KAAKc,MAAWY,IACnDH,EAASG,GAASsC,EAAKtC,EAAQ1B,KAAKc,QAAU,EAGhD,IAAK,IAAIY,EAAQ1B,KAAKc,MAAQ,EAAGY,EAAQ,EAAGA,IAC1CH,EAASG,GAASH,EAAS,EAAIG,GAASH,EAAS,EAAIG,EAAQ,GAG/D1B,KAAKiB,YAAcjB,KAAKiB,YAAc,EACtCjB,KAAKgB,MAAQO,IACdZ,EAEDqB,cAAA,WACEhC,KAAKkE,oBAAsB,GAC3BlE,KAAKmE,2BAAwBlE,GAC9BU,EAED0C,sBAAA,SAAsB3B,EAAe0C,EAAqBC,GACnC,iBAAV3C,IACT1B,KAAKmE,sBACmC,iBAA/BnE,KAAKmE,sBACR9E,KAAKiF,IAAItE,KAAKmE,sBAAuBzC,GACrCA,EACN1B,KAAKkE,oBAAoBlE,KAAKyB,SAASC,IAAU,CAC/C2C,MAAAA,EACAD,KAAAA,KAGLzD,EAEDF,qBAAA,WAEET,KAAKuE,sBAAwB,GAEa,mBAA/BvE,KAAKQ,uBACdR,KAAKQ,sBAAsBR,KAAKgB,QAEnCL,EAED6D,OAAA,SAAO9C,EAAe2C,GACpB,GAAqB,iBAAV3C,GAAsBA,EAAQ,EAAG,OAAO,EACnD,GAAIsB,MAAMtB,GAER,OADAuB,QAAQC,KAAK,+CACN,EAGT,KAAOxB,GAAS1B,KAAKc,OACnBd,KAAKsB,UAWP,OAPAtB,KAAKgB,MADQhB,KAAKc,MAAQY,GACP2C,EAEnBrE,KAAKqD,sBAAsB3B,EAAO,MAAO2C,GAErC3C,EAAQ,EAAI1B,KAAKiB,cACnBjB,KAAKiB,YAAcS,EAAQ,IAEtB,GACRf,EAED8D,IAAA,SAAI/C,EAAe2C,GAOjB,OANArE,KAAKwE,OAAO9C,EAAO2C,GACnBrE,KAAK+B,mBAAmBL,GACxB1B,KAAKS,uBACmC,mBAA7BT,KAAKU,qBACdV,KAAKU,oBAAoBgB,EAAO2C,IAE3B,GACR1D,EAED+D,YAAA,sBACE,GAA0C,iBAA/B1E,KAAKmE,sBAAoC,CAClD,IAAMzC,EAAQ1B,KAAKmE,sBAEbQ,EAAOC,OAAOD,KAAK3E,KAAKkE,qBAK9B,GAJsBS,EAAKE,MACzB,SAACjD,GAAG,MAA4C,WAAvCkD,EAAKZ,oBAAoBtC,GAAKwC,QAIvC,OAAOpE,KAAKiC,WAAWP,GAQzB,GALcrC,KAAKgD,KAAKrC,KAAKe,OACV4D,EAAK9D,OAEJb,KAAKc,MAAQY,EAAQ,EAGvC,OAAO1B,KAAKiC,WAAWP,GAGzBiD,EAAKf,SAAQ,SAAChC,GAAG,OAAKkD,EAAK/C,mBAAmB+C,EAAKnD,gBAAgBC,OAEnE5B,KAAKS,uBAELT,KAAKgC,kBAERrB,EAEDoE,mBAAA,WACE,OAAO/E,KAAKgF,iBACbrE,EAEDqE,cAAA,WACE,OAAOhF,KAAKiB,aACbN,EAEDmD,IAAA,SAAIpC,GAGF,OAAO1B,KAAKgB,MADChB,KAAKc,MAAQY,IAE3Bf,EAEDsE,QAAA,WACE,OAAOjF,KAAKe,OACbJ,EAEDuE,QAAA,WACE,OAAOlF,KAAKc,OACbH,EAEDwE,QAAA,WACE,OAAOnF,KAAKgB,OACbL,EAEDyE,YAAA,WACE,OAAOpF,KAAKgB,MAAM,IACnBL,EAMD0E,SAAA,SAASC,GAGP,GAA4C,MAAxCtF,KAAKuE,yBAAyBe,GAChC,OAAOtF,KAAKuE,yBAAyBe,GACvC,GAAIA,GAAO,EACT,OAAO,EAMT,IAHA,IAAIlG,EAAOY,KAAKc,MAAQwE,EAAM,EAC1BC,EAAMvF,KAAKgB,MAAM5B,GAEL,IAATA,EAAYA,EAAOD,EAAOC,GAC3BA,EAAO,GAAM,IACfmG,GAAOvF,KAAKgB,MAAM5B,EAAO,IAI7B,OAAOmG,GACR5E,EAKD6E,MAAA,SAAMC,GAMJ,OAAOzF,KAAKqF,SAASI,EAAe,IACrC9E,EAMD4E,IAAA,SAAIG,EAAeJ,GAEjB,OAAOtF,KAAKqF,SAASC,GAAOtF,KAAKqF,SAASK,IAC3C/E,EAMDgF,mBAAA,SAAmBC,GACjB,GAAIA,EAAI,IAAM5F,KAAKiB,YACjB,OAAQ,EAGV,IAAI7B,EAAO,EACX,GAAIY,KAAKgB,MAAM5B,GAAQwG,EAErB,OAAO5F,KAAKiB,YAGd,KAAO7B,EAAOY,KAAKc,OAAO,CACxB,IAAM+E,EAAU7F,KAAKgB,MAAM,EAAI5B,GAC3BwG,EAAIC,EACNzG,GAAO,GAEPA,EAAO,EAAIA,EAAO,EAClBwG,GAAKC,GAIT,OAAOxG,KAAKiF,IAAIlF,EAAOY,KAAKc,MAAOd,KAAKiB,cACzCN,EAMDmF,yBAAA,SAAyBF,GACvB,GAAIA,GAAK,IAAM5F,KAAKiB,YAClB,OAAQ,EAGV,IAAI7B,EAAO,EACX,GAAIY,KAAKgB,MAAM5B,GAAQwG,EACrB,OAAO5F,KAAKiB,YAGd,KAAO7B,EAAOY,KAAKc,OAAO,CACxB,IAAM+E,EAAU7F,KAAKgB,MAAM,EAAI5B,GAC3BwG,GAAKC,EACPzG,GAAO,GAEPA,EAAO,EAAIA,EAAO,EAClBwG,GAAKC,GAIT,OAAOxG,KAAKiF,IAAIlF,EAAOY,KAAKc,MAAOd,KAAKiB,cACzCN,EAgBDoF,aAAA,SAAaC,EAAmBC,GAC9B,OAAIjG,KAAKmF,UAAU,GAAKa,EACf,CACL1D,WAAYtC,KAAKiB,YACjBkB,SAAUnC,KAAKiB,aAIZ,CAELqB,WAAYtC,KAAK2F,mBAAmBK,GAGpC7D,SAAUnC,KAAKkG,sBAAsBD,KAExCtF,EAMDwF,gBAAA,SAAgBP,GACd,OAAOvG,KAAKiF,IAAItE,KAAK8F,yBAAyBF,GAAK,EAAG5F,KAAKiB,cAC5DN,EAMDuF,sBAAA,SAAsBN,GACpB,OAAOvG,KAAKiF,IAAItE,KAAK2F,mBAAmBC,GAAK,EAAG5F,KAAKiB,cACtDnB"}
@@ -17,6 +17,12 @@ function ceilLog2(x) {
17
17
  }
18
18
  var PrefixIntervalTree = /*#__PURE__*/function () {
19
19
  function PrefixIntervalTree(xs, opts) {
20
+ if (xs === void 0) {
21
+ xs = 10;
22
+ }
23
+ this._affectedIndicesMap = {};
24
+ this._affectedMinimalIndex = undefined;
25
+ this._cachedSumUntilValues = {};
20
26
  if (typeof xs === 'number') this.initWithNumber(xs);
21
27
  if (Array.isArray(xs)) this.initWithArray(xs);
22
28
  var _ref = opts || {},
@@ -68,17 +74,33 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
68
74
  this._size = nextHeapHalf;
69
75
  this._heap = nextHeap;
70
76
  };
77
+ _proto.indexKey = function indexKey(index) {
78
+ return "" + index;
79
+ };
80
+ _proto.resolveKeyIndex = function resolveKeyIndex(key) {
81
+ return parseInt(key, 10);
82
+ };
71
83
  _proto.isValidIndex = function isValidIndex(index) {
72
84
  return typeof index === 'number' && index >= 0 && index < this._actualSize;
73
85
  };
74
- _proto.reflowHeap = function reflowHeap(startIndex, endIndex) {
86
+ _proto.reflowDirectParent = function reflowDirectParent(index) {
87
+ this.resetAffected();
88
+ var node = this._half + index;
89
+ node = parent(node);
90
+ for (; node !== 0; node = parent(node)) {
91
+ this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];
92
+ }
93
+ };
94
+ _proto.reflowHeap = function reflowHeap(_startIndex, endIndex) {
75
95
  var _this = this;
76
96
  if (endIndex === void 0) {
77
97
  endIndex = this._half * 2 - 2;
78
98
  }
79
- var len = Math.log2(this._size);
99
+ this.resetAffected();
100
+ var depth = Math.log2(this._size);
101
+ var startIndex = _startIndex + this._half;
80
102
  Array.from({
81
- length: len
103
+ length: depth
82
104
  }, function (v, i) {
83
105
  return i;
84
106
  }).reduce(function (acc) {
@@ -98,28 +120,30 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
98
120
  endIndex: endIndex
99
121
  });
100
122
  };
123
+ _proto.dryRemove = function dryRemove(index) {
124
+ if (!this.isValidIndex(index)) return;
125
+ if (isNaN(index)) {
126
+ console.warn('Passing a NaN value as interval tree index');
127
+ return;
128
+ }
129
+ this._heap.splice(this._half + index, 1);
130
+ this._heap.push(0);
131
+ this._actualSize = this._actualSize - 1;
132
+ this.updateAffectedIndices(index, 'remove');
133
+ };
101
134
  _proto.remove = function remove(index) {
102
- this.batchRemove([index]);
135
+ this.removeIndices([index]);
103
136
  };
104
- _proto.batchRemove = function batchRemove(indices) {
137
+ _proto.removeIndices = function removeIndices(indices) {
105
138
  var _this2 = this;
106
139
  indices.sort(function (a, b) {
107
140
  return a - b;
108
141
  });
109
142
  indices.forEach(function (index) {
110
- if (!_this2.isValidIndex(index)) return;
111
- if (isNaN(index)) {
112
- console.warn('Passing a NaN value as interval tree index');
113
- return;
114
- }
115
- _this2._heap.splice(_this2._half + index, 1);
116
- _this2._heap.push(0);
117
- _this2._actualSize = _this2._actualSize - 1;
143
+ return _this2.dryRemove(index);
118
144
  });
119
- this.reflowHeap(indices[0] + this._half);
120
- if (typeof this._onUpdateIntervalTree === 'function') {
121
- this._onUpdateIntervalTree(this._heap);
122
- }
145
+ this.reflowHeap(indices[0]);
146
+ this.onUpdateIntervalTree();
123
147
  if (typeof this._onUpdateItemLayout === 'function') {
124
148
  for (var idx = indices[0]; idx < this._half; idx++) {
125
149
  this._onUpdateItemLayout(idx, this.get(idx));
@@ -144,7 +168,26 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
144
168
  this._actualSize = this._actualSize - 1;
145
169
  this._heap = nextHeap;
146
170
  };
147
- _proto.set = function set(index, value) {
171
+ _proto.resetAffected = function resetAffected() {
172
+ this._affectedIndicesMap = {};
173
+ this._affectedMinimalIndex = undefined;
174
+ };
175
+ _proto.updateAffectedIndices = function updateAffectedIndices(index, type, value) {
176
+ if (typeof index === 'number') {
177
+ this._affectedMinimalIndex = typeof this._affectedMinimalIndex === 'number' ? Math.min(this._affectedMinimalIndex, index) : index;
178
+ this._affectedIndicesMap[this.indexKey(index)] = {
179
+ value: value,
180
+ type: type
181
+ };
182
+ }
183
+ };
184
+ _proto.onUpdateIntervalTree = function onUpdateIntervalTree() {
185
+ this._cachedSumUntilValues = {};
186
+ if (typeof this._onUpdateIntervalTree === 'function') {
187
+ this._onUpdateIntervalTree(this._heap);
188
+ }
189
+ };
190
+ _proto.drySet = function drySet(index, value) {
148
191
  if (typeof index !== 'number' || index < 0) return false;
149
192
  if (isNaN(index)) {
150
193
  console.warn('Passing a NaN value as interval tree index');
@@ -155,21 +198,45 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
155
198
  }
156
199
  var node = this._half + index;
157
200
  this._heap[node] = value;
158
- node = parent(node);
159
- for (; node !== 0; node = parent(node)) {
160
- this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];
161
- }
201
+ this.updateAffectedIndices(index, 'set', value);
162
202
  if (index + 1 > this._actualSize) {
163
203
  this._actualSize = index + 1;
164
204
  }
165
- if (typeof this._onUpdateIntervalTree === 'function') {
166
- this._onUpdateIntervalTree(this._heap);
167
- }
205
+ return true;
206
+ };
207
+ _proto.set = function set(index, value) {
208
+ this.drySet(index, value);
209
+ this.reflowDirectParent(index);
210
+ this.onUpdateIntervalTree();
168
211
  if (typeof this._onUpdateItemLayout === 'function') {
169
212
  this._onUpdateItemLayout(index, value);
170
213
  }
171
214
  return true;
172
215
  };
216
+ _proto.applyUpdate = function applyUpdate() {
217
+ var _this3 = this;
218
+ if (typeof this._affectedMinimalIndex === 'number') {
219
+ var index = this._affectedMinimalIndex;
220
+ var keys = Object.keys(this._affectedIndicesMap);
221
+ var hasRemoveItem = keys.some(function (key) {
222
+ return _this3._affectedIndicesMap[key].type === 'remove';
223
+ });
224
+ if (hasRemoveItem) {
225
+ return this.reflowHeap(index);
226
+ }
227
+ var depth = Math.log2(this._size);
228
+ var itemLength = keys.length;
229
+ var reflowTimes = this._half - index - 1;
230
+ if (depth * itemLength > reflowTimes) {
231
+ return this.reflowHeap(index);
232
+ }
233
+ keys.forEach(function (key) {
234
+ return _this3.reflowDirectParent(_this3.resolveKeyIndex(key));
235
+ });
236
+ this.onUpdateIntervalTree();
237
+ this.resetAffected();
238
+ }
239
+ };
173
240
  _proto.getMaxUsefulLength = function getMaxUsefulLength() {
174
241
  return this.getActualSize();
175
242
  };
@@ -193,6 +260,7 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
193
260
  return this._heap[1];
194
261
  };
195
262
  _proto.sumUntil = function sumUntil(end) {
263
+ if (this._cachedSumUntilValues["" + end] != null) return this._cachedSumUntilValues["" + end];
196
264
  if (end <= 0) {
197
265
  return 0;
198
266
  }
@@ -212,12 +280,12 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
212
280
  return this.sumUntil(end) - this.sumUntil(begin);
213
281
  };
214
282
  _proto.greatestLowerBound = function greatestLowerBound(t) {
215
- if (t < 0) {
283
+ if (t < 0 || !this._actualSize) {
216
284
  return -1;
217
285
  }
218
286
  var node = 1;
219
287
  if (this._heap[node] < t) {
220
- return Math.max(this._actualSize - 1, 0);
288
+ return this._actualSize;
221
289
  }
222
290
  while (node < this._half) {
223
291
  var leftSum = this._heap[2 * node];
@@ -228,15 +296,15 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
228
296
  t -= leftSum;
229
297
  }
230
298
  }
231
- return Math.min(node - this._half, this._actualSize - 1);
299
+ return Math.min(node - this._half, this._actualSize);
232
300
  };
233
301
  _proto.greatestStrictLowerBound = function greatestStrictLowerBound(t) {
234
- if (t <= 0) {
302
+ if (t <= 0 || !this._actualSize) {
235
303
  return -1;
236
304
  }
237
305
  var node = 1;
238
306
  if (this._heap[node] < t) {
239
- return Math.max(this._actualSize - 1, 0);
307
+ return this._actualSize;
240
308
  }
241
309
  while (node < this._half) {
242
310
  var leftSum = this._heap[2 * node];
@@ -247,7 +315,7 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
247
315
  t -= leftSum;
248
316
  }
249
317
  }
250
- return Math.min(node - this._half, this._actualSize - 1);
318
+ return Math.min(node - this._half, this._actualSize);
251
319
  };
252
320
  _proto.computeRange = function computeRange(minOffset, maxOffset) {
253
321
  if (this.getHeap()[1] < minOffset) {
@@ -262,10 +330,10 @@ var PrefixIntervalTree = /*#__PURE__*/function () {
262
330
  };
263
331
  };
264
332
  _proto.leastUpperBound = function leastUpperBound(t) {
265
- return this.greatestStrictLowerBound(t) + 1;
333
+ return Math.min(this.greatestStrictLowerBound(t) + 1, this._actualSize);
266
334
  };
267
335
  _proto.leastStrictUpperBound = function leastStrictUpperBound(t) {
268
- return this.greatestLowerBound(t) + 1;
336
+ return Math.min(this.greatestLowerBound(t) + 1, this._actualSize);
269
337
  };
270
338
  return PrefixIntervalTree;
271
339
  }();
@@ -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\ntype OperationType = 'set' | 'remove';\n\ntype Operation = {\n type: OperationType;\n value: any;\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 private _affectedIndicesMap: {\n [key: string]: Operation;\n } = {};\n private _affectedMinimalIndex: number = undefined;\n private _cachedSumUntilValues: {\n [key: string]: number;\n } = {};\n\n constructor(\n xs: number[] | number = 10,\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 * it will cause calculation of\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 indexKey(index: number) {\n return `${index}`;\n }\n\n resolveKeyIndex(key: string) {\n return parseInt(key, 10);\n }\n\n isValidIndex(index: number) {\n return typeof index === 'number' && index >= 0 && index < this._actualSize;\n }\n\n reflowDirectParent(index: number) {\n this.resetAffected();\n let node = this._half + index;\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\n // recalculate parent value from startIndex to endIndex\n reflowHeap(_startIndex: number, endIndex = this._half * 2 - 2) {\n this.resetAffected();\n const depth = Math.log2(this._size);\n const startIndex = _startIndex + this._half;\n\n Array.from({ length: depth }, (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 /**\n *\n * @param index index to remove\n * @returns\n *\n * update heap only, but not recalculate interval tree value\n */\n dryRemove(index: number) {\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 this.updateAffectedIndices(index, 'remove');\n }\n\n remove(index: number) {\n // if typeof index === 'undefined', then it will go into looooooooop\n\n this.removeIndices([index]);\n }\n\n removeIndices(indices: number[]) {\n indices.sort((a, b) => a - b);\n\n indices.forEach((index) => this.dryRemove(index));\n\n this.reflowHeap(indices[0]);\n this.onUpdateIntervalTree();\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 resetAffected() {\n this._affectedIndicesMap = {};\n this._affectedMinimalIndex = undefined;\n }\n\n updateAffectedIndices(index: number, type: OperationType, value?: number) {\n if (typeof index === 'number') {\n this._affectedMinimalIndex =\n typeof this._affectedMinimalIndex === 'number'\n ? Math.min(this._affectedMinimalIndex, index)\n : index;\n this._affectedIndicesMap[this.indexKey(index)] = {\n value,\n type,\n };\n }\n }\n\n onUpdateIntervalTree() {\n // reset cached value\n this._cachedSumUntilValues = {};\n\n if (typeof this._onUpdateIntervalTree === 'function') {\n this._onUpdateIntervalTree(this._heap);\n }\n }\n\n drySet(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 const node = this._half + index;\n this._heap[node] = value;\n\n this.updateAffectedIndices(index, 'set', value);\n\n if (index + 1 > this._actualSize) {\n this._actualSize = index + 1;\n }\n return true;\n }\n\n set(index: number, value: number) {\n this.drySet(index, value);\n this.reflowDirectParent(index);\n this.onUpdateIntervalTree();\n if (typeof this._onUpdateItemLayout === 'function') {\n this._onUpdateItemLayout(index, value);\n }\n return true;\n }\n\n applyUpdate() {\n if (typeof this._affectedMinimalIndex === 'number') {\n const index = this._affectedMinimalIndex;\n\n const keys = Object.keys(this._affectedIndicesMap);\n const hasRemoveItem = keys.some(\n (key) => this._affectedIndicesMap[key].type === 'remove'\n );\n\n if (hasRemoveItem) {\n return this.reflowHeap(index);\n }\n\n const depth = Math.log2(this._size);\n const itemLength = keys.length;\n\n const reflowTimes = this._half - index - 1;\n\n if (depth * itemLength > reflowTimes) {\n return this.reflowHeap(index);\n }\n\n keys.forEach((key) => this.reflowDirectParent(this.resolveKeyIndex(key)));\n\n this.onUpdateIntervalTree();\n\n this.resetAffected();\n }\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 (this._cachedSumUntilValues[`${end}`] != null)\n return this._cachedSumUntilValues[`${end}`];\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","undefined","initWithNumber","Array","isArray","initWithArray","_ref","onUpdateItemLayout","onUpdateIntervalTree","_onUpdateIntervalTree","_onUpdateItemLayout","_proto","prototype","length","_half","_size","_heap","_actualSize","arr","uniform","initialValue","empty","stretch","nextHeap","nextHeapHalf","indexKey","index","resolveKeyIndex","key","parseInt","isValidIndex","reflowDirectParent","resetAffected","reflowHeap","_startIndex","endIndex","depth","log2","startIndex","from","v","reduce","acc","_nextStart","_nextEnd","idx","_this","dryRemove","isNaN","console","warn","splice","push","updateAffectedIndices","remove","removeIndices","indices","sort","a","b","forEach","_this2","get","removeV0","copy","slice","_affectedIndicesMap","_affectedMinimalIndex","type","value","min","_cachedSumUntilValues","drySet","set","applyUpdate","keys","Object","hasRemoveItem","some","_this3","itemLength","reflowTimes","getMaxUsefulLength","getActualSize","getSize","getHalf","getHeap","getMaxValue","sumUntil","end","sum","sumTo","inclusiveEnd","begin","greatestLowerBound","t","leftSum","greatestStrictLowerBound","computeRange","minOffset","maxOffset","leastStrictUpperBound","leastUpperBound"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x-oasis/prefix-interval-tree",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "prefix interval tree function",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
package/src/index.ts CHANGED
@@ -20,6 +20,13 @@ function ceilLog2(x: number) {
20
20
  return y;
21
21
  }
22
22
 
23
+ type OperationType = 'set' | 'remove';
24
+
25
+ type Operation = {
26
+ type: OperationType;
27
+ value: any;
28
+ };
29
+
23
30
  /**
24
31
  * A prefix interval tree stores an numeric array and the partial sums of that
25
32
  * array. It is optimized for updating the values of the array without
@@ -48,8 +55,16 @@ class PrefixIntervalTree {
48
55
  private _onUpdateItemLayout: Function;
49
56
  private _onUpdateIntervalTree: Function;
50
57
 
58
+ private _affectedIndicesMap: {
59
+ [key: string]: Operation;
60
+ } = {};
61
+ private _affectedMinimalIndex: number = undefined;
62
+ private _cachedSumUntilValues: {
63
+ [key: string]: number;
64
+ } = {};
65
+
51
66
  constructor(
52
- xs: number[] | number,
67
+ xs: number[] | number = 10,
53
68
  opts?: {
54
69
  onUpdateItemLayout?: Function;
55
70
  onUpdateIntervalTree?: Function;
@@ -100,6 +115,7 @@ class PrefixIntervalTree {
100
115
 
101
116
  /**
102
117
  * the length should be 2
118
+ * it will cause calculation of
103
119
  */
104
120
  stretch() {
105
121
  const nextHeap = createArray(2 * this._half * 2);
@@ -120,14 +136,35 @@ class PrefixIntervalTree {
120
136
  this._heap = nextHeap;
121
137
  }
122
138
 
139
+ indexKey(index: number) {
140
+ return `${index}`;
141
+ }
142
+
143
+ resolveKeyIndex(key: string) {
144
+ return parseInt(key, 10);
145
+ }
146
+
123
147
  isValidIndex(index: number) {
124
148
  return typeof index === 'number' && index >= 0 && index < this._actualSize;
125
149
  }
126
150
 
127
- reflowHeap(startIndex: number, endIndex = this._half * 2 - 2) {
128
- const len = Math.log2(this._size);
151
+ reflowDirectParent(index: number) {
152
+ this.resetAffected();
153
+ let node = this._half + index;
129
154
 
130
- Array.from({ length: len }, (v, i) => i).reduce(
155
+ node = parent(node);
156
+ for (; node !== 0; node = parent(node)) {
157
+ this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];
158
+ }
159
+ }
160
+
161
+ // recalculate parent value from startIndex to endIndex
162
+ reflowHeap(_startIndex: number, endIndex = this._half * 2 - 2) {
163
+ this.resetAffected();
164
+ const depth = Math.log2(this._size);
165
+ const startIndex = _startIndex + this._half;
166
+
167
+ Array.from({ length: depth }, (v, i) => i).reduce(
131
168
  (acc) => {
132
169
  const { startIndex, endIndex } = acc;
133
170
  const _nextStart = parent(startIndex);
@@ -149,31 +186,40 @@ class PrefixIntervalTree {
149
186
  );
150
187
  }
151
188
 
189
+ /**
190
+ *
191
+ * @param index index to remove
192
+ * @returns
193
+ *
194
+ * update heap only, but not recalculate interval tree value
195
+ */
196
+ dryRemove(index: number) {
197
+ if (!this.isValidIndex(index)) return;
198
+ if (isNaN(index)) {
199
+ console.warn('Passing a NaN value as interval tree index');
200
+ return;
201
+ }
202
+
203
+ this._heap.splice(this._half + index, 1);
204
+ this._heap.push(0);
205
+ this._actualSize = this._actualSize - 1;
206
+
207
+ this.updateAffectedIndices(index, 'remove');
208
+ }
209
+
152
210
  remove(index: number) {
153
211
  // if typeof index === 'undefined', then it will go into looooooooop
154
212
 
155
- this.batchRemove([index]);
213
+ this.removeIndices([index]);
156
214
  }
157
215
 
158
- batchRemove(indices: number[]) {
216
+ removeIndices(indices: number[]) {
159
217
  indices.sort((a, b) => a - b);
160
218
 
161
- indices.forEach((index) => {
162
- if (!this.isValidIndex(index)) return;
163
- if (isNaN(index)) {
164
- console.warn('Passing a NaN value as interval tree index');
165
- return;
166
- }
219
+ indices.forEach((index) => this.dryRemove(index));
167
220
 
168
- this._heap.splice(this._half + index, 1);
169
- this._heap.push(0);
170
- this._actualSize = this._actualSize - 1;
171
- });
172
-
173
- this.reflowHeap(indices[0] + this._half);
174
- if (typeof this._onUpdateIntervalTree === 'function') {
175
- this._onUpdateIntervalTree(this._heap);
176
- }
221
+ this.reflowHeap(indices[0]);
222
+ this.onUpdateIntervalTree();
177
223
 
178
224
  if (typeof this._onUpdateItemLayout === 'function') {
179
225
  for (let idx = indices[0]; idx < this._half; idx++) {
@@ -206,7 +252,34 @@ class PrefixIntervalTree {
206
252
  this._heap = nextHeap;
207
253
  }
208
254
 
209
- set(index: number, value: number) {
255
+ resetAffected() {
256
+ this._affectedIndicesMap = {};
257
+ this._affectedMinimalIndex = undefined;
258
+ }
259
+
260
+ updateAffectedIndices(index: number, type: OperationType, value?: number) {
261
+ if (typeof index === 'number') {
262
+ this._affectedMinimalIndex =
263
+ typeof this._affectedMinimalIndex === 'number'
264
+ ? Math.min(this._affectedMinimalIndex, index)
265
+ : index;
266
+ this._affectedIndicesMap[this.indexKey(index)] = {
267
+ value,
268
+ type,
269
+ };
270
+ }
271
+ }
272
+
273
+ onUpdateIntervalTree() {
274
+ // reset cached value
275
+ this._cachedSumUntilValues = {};
276
+
277
+ if (typeof this._onUpdateIntervalTree === 'function') {
278
+ this._onUpdateIntervalTree(this._heap);
279
+ }
280
+ }
281
+
282
+ drySet(index: number, value: number) {
210
283
  if (typeof index !== 'number' || index < 0) return false;
211
284
  if (isNaN(index)) {
212
285
  console.warn('Passing a NaN value as interval tree index');
@@ -217,28 +290,57 @@ class PrefixIntervalTree {
217
290
  this.stretch();
218
291
  }
219
292
 
220
- let node = this._half + index;
293
+ const node = this._half + index;
221
294
  this._heap[node] = value;
222
295
 
223
- node = parent(node);
224
- for (; node !== 0; node = parent(node)) {
225
- this._heap[node] = this._heap[2 * node] + this._heap[2 * node + 1];
226
- }
296
+ this.updateAffectedIndices(index, 'set', value);
227
297
 
228
298
  if (index + 1 > this._actualSize) {
229
299
  this._actualSize = index + 1;
230
300
  }
301
+ return true;
302
+ }
231
303
 
232
- if (typeof this._onUpdateIntervalTree === 'function') {
233
- this._onUpdateIntervalTree(this._heap);
234
- }
235
-
304
+ set(index: number, value: number) {
305
+ this.drySet(index, value);
306
+ this.reflowDirectParent(index);
307
+ this.onUpdateIntervalTree();
236
308
  if (typeof this._onUpdateItemLayout === 'function') {
237
309
  this._onUpdateItemLayout(index, value);
238
310
  }
239
311
  return true;
240
312
  }
241
313
 
314
+ applyUpdate() {
315
+ if (typeof this._affectedMinimalIndex === 'number') {
316
+ const index = this._affectedMinimalIndex;
317
+
318
+ const keys = Object.keys(this._affectedIndicesMap);
319
+ const hasRemoveItem = keys.some(
320
+ (key) => this._affectedIndicesMap[key].type === 'remove'
321
+ );
322
+
323
+ if (hasRemoveItem) {
324
+ return this.reflowHeap(index);
325
+ }
326
+
327
+ const depth = Math.log2(this._size);
328
+ const itemLength = keys.length;
329
+
330
+ const reflowTimes = this._half - index - 1;
331
+
332
+ if (depth * itemLength > reflowTimes) {
333
+ return this.reflowHeap(index);
334
+ }
335
+
336
+ keys.forEach((key) => this.reflowDirectParent(this.resolveKeyIndex(key)));
337
+
338
+ this.onUpdateIntervalTree();
339
+
340
+ this.resetAffected();
341
+ }
342
+ }
343
+
242
344
  getMaxUsefulLength() {
243
345
  return this.getActualSize();
244
346
  }
@@ -276,6 +378,8 @@ class PrefixIntervalTree {
276
378
  sumUntil(end: number) {
277
379
  // invariant(end >= 0 && end < this._size + 1, 'Index out of range %s', end);
278
380
 
381
+ if (this._cachedSumUntilValues[`${end}`] != null)
382
+ return this._cachedSumUntilValues[`${end}`];
279
383
  if (end <= 0) {
280
384
  return 0;
281
385
  }
@@ -318,14 +422,14 @@ class PrefixIntervalTree {
318
422
  * return the biggest i, subUntil(i) < t
319
423
  */
320
424
  greatestLowerBound(t: number) {
321
- if (t < 0) {
425
+ if (t < 0 || !this._actualSize) {
322
426
  return -1;
323
427
  }
324
428
 
325
429
  let node = 1;
326
430
  if (this._heap[node] < t) {
327
431
  // not use this._size;this._size always be a big value
328
- return Math.max(this._actualSize - 1, 0);
432
+ return this._actualSize;
329
433
  }
330
434
 
331
435
  while (node < this._half) {
@@ -338,7 +442,7 @@ class PrefixIntervalTree {
338
442
  }
339
443
  }
340
444
 
341
- return Math.min(node - this._half, this._actualSize - 1);
445
+ return Math.min(node - this._half, this._actualSize);
342
446
  }
343
447
 
344
448
  /**
@@ -346,13 +450,13 @@ class PrefixIntervalTree {
346
450
  * or -1 if no such i exists.
347
451
  */
348
452
  greatestStrictLowerBound(t: number) {
349
- if (t <= 0) {
453
+ if (t <= 0 || !this._actualSize) {
350
454
  return -1;
351
455
  }
352
456
 
353
457
  let node = 1;
354
458
  if (this._heap[node] < t) {
355
- return Math.max(this._actualSize - 1, 0);
459
+ return this._actualSize;
356
460
  }
357
461
 
358
462
  while (node < this._half) {
@@ -365,7 +469,7 @@ class PrefixIntervalTree {
365
469
  }
366
470
  }
367
471
 
368
- return Math.min(node - this._half, this._actualSize - 1);
472
+ return Math.min(node - this._half, this._actualSize);
369
473
  }
370
474
 
371
475
  /**
@@ -404,7 +508,7 @@ class PrefixIntervalTree {
404
508
  * size + 1 if no such i exists.
405
509
  */
406
510
  leastUpperBound(t: number) {
407
- return this.greatestStrictLowerBound(t) + 1;
511
+ return Math.min(this.greatestStrictLowerBound(t) + 1, this._actualSize);
408
512
  }
409
513
 
410
514
  /**
@@ -412,7 +516,7 @@ class PrefixIntervalTree {
412
516
  * size + 1 if no such i exists.
413
517
  */
414
518
  leastStrictUpperBound(t: number) {
415
- return this.greatestLowerBound(t) + 1;
519
+ return Math.min(this.greatestLowerBound(t) + 1, this._actualSize);
416
520
  }
417
521
  }
418
522