@x-oasis/integer-buffer-set 0.1.23 → 0.1.24

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
@@ -19,13 +19,14 @@ declare class IntegerBufferSet<Meta = any> {
19
19
  private _lastUpdatedMS;
20
20
  constructor(props?: IntegerBufferSetProps<Meta>);
21
21
  get bufferSize(): number;
22
+ isThresholdMeta(meta: any): boolean;
22
23
  setIsOnTheFlyFull(val: any): void;
24
+ resetOnTheFlies(): void;
23
25
  get isBufferFull(): boolean;
24
26
  getOnTheFlyUncriticalPosition(safeRange: SafeRange): number;
25
27
  initialize(): {
26
28
  smallValues: Heap<any>;
27
29
  largeValues: Heap<any>;
28
- valueToPositionObject: {};
29
30
  };
30
31
  getIndexMeta(index: number): Meta;
31
32
  getMetaIndex(meta: Meta): number;
@@ -36,8 +37,7 @@ declare class IntegerBufferSet<Meta = any> {
36
37
  getNewPositionForIndex(index: number): number;
37
38
  getMinValue(): number;
38
39
  getMaxValue(): number;
39
- replacePositionInFliedIndices(newIndex: number, safeRange: SafeRange): number;
40
- getFliedPosition(newIndex: number, safeRange: SafeRange): any;
40
+ getFliedPosition(newIndex: number, safeRange: SafeRange): number;
41
41
  getPosition(newIndex: number, safeRange?: SafeRange): any;
42
42
  replaceFurthestIndexPosition(newIndex: number, safeRange?: {
43
43
  startIndex: number;
@@ -47,16 +47,21 @@ declare class IntegerBufferSet<Meta = any> {
47
47
  startIndex: number;
48
48
  endIndex: number;
49
49
  }): any;
50
- shuffle(): any[];
51
- getIndices(): any[];
50
+ shuffle(): any;
51
+ getIndices(): any;
52
52
  _pushToHeaps(position: number, value: number): void;
53
53
  _setMetaPosition(meta: Meta, position: number): void;
54
+ commitPosition(props: {
55
+ newIndex: number;
56
+ position: number;
57
+ meta: Meta;
58
+ safeRange: SafeRange;
59
+ }): number;
54
60
  _setMetaIndex(meta: Meta, index: number): boolean;
55
61
  readyToStartNextLoop(): void;
56
62
  prepare(): void;
57
63
  _cleanHeaps(): void;
58
64
  _recreateHeaps(): void;
59
- _cleanHeap(heap: Heap<HeapItem>): void;
60
65
  _smallerComparator(lhs: HeapItem, rhs: HeapItem): boolean;
61
66
  _greaterComparator(lhs: HeapItem, rhs: HeapItem): boolean;
62
67
  }
@@ -45,6 +45,7 @@ var defaultMetaExtractor = function defaultMetaExtractor(value) {
45
45
  return value;
46
46
  };
47
47
  var defaultBufferSize = 10;
48
+ var thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;
48
49
  var IntegerBufferSet = /*#__PURE__*/function () {
49
50
  function IntegerBufferSet(props) {
50
51
  if (props === void 0) {
@@ -71,27 +72,34 @@ var IntegerBufferSet = /*#__PURE__*/function () {
71
72
  this._largeValues = new Heap([], this._greaterComparator);
72
73
  this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);
73
74
  this.getIndexPosition = this.getIndexPosition.bind(this);
74
- this.replacePositionInFliedIndices = this.replacePositionInFliedIndices.bind(this);
75
75
  this.replaceFurthestIndexPosition = this.replaceFurthestIndexPosition.bind(this);
76
76
  this._isOnTheFlyFullReturnHook = returnHook(this.setIsOnTheFlyFull.bind(this));
77
77
  this._loopMS = Date.now();
78
78
  this._lastUpdatedMS = this._loopMS;
79
79
  }
80
80
  var _proto = IntegerBufferSet.prototype;
81
+ _proto.isThresholdMeta = function isThresholdMeta(meta) {
82
+ if (typeof meta === 'number' && meta > thresholdNumber) return true;
83
+ return false;
84
+ };
81
85
  _proto.setIsOnTheFlyFull = function setIsOnTheFlyFull(val) {
82
86
  if (val != null) {
83
87
  var data = this._onTheFlyIndices.filter(function (v) {
84
- return v;
88
+ return v != null;
85
89
  });
86
90
  this._isOnTheFlyFull = data.length === this._bufferSize;
87
91
  }
88
92
  };
93
+ _proto.resetOnTheFlies = function resetOnTheFlies() {
94
+ this._isOnTheFlyFull = false;
95
+ this._onTheFlyIndices = [];
96
+ };
89
97
  _proto.getOnTheFlyUncriticalPosition = function getOnTheFlyUncriticalPosition(safeRange) {
90
98
  var startIndex = safeRange.startIndex,
91
99
  endIndex = safeRange.endIndex;
92
100
  for (var idx = 0; idx < this._onTheFlyIndices.length; idx++) {
93
101
  var meta = this._onTheFlyIndices[idx];
94
- var metaIndex = this._metaToIndexMap.get(meta);
102
+ var metaIndex = this.getMetaIndex(meta);
95
103
  if (!isClamped(startIndex, metaIndex, endIndex)) {
96
104
  return idx;
97
105
  }
@@ -101,14 +109,16 @@ var IntegerBufferSet = /*#__PURE__*/function () {
101
109
  _proto.initialize = function initialize() {
102
110
  return {
103
111
  smallValues: new Heap([], this._smallerComparator),
104
- largeValues: new Heap([], this._greaterComparator),
105
- valueToPositionObject: {}
112
+ largeValues: new Heap([], this._greaterComparator)
106
113
  };
107
114
  };
108
115
  _proto.getIndexMeta = function getIndexMeta(index) {
116
+ if (index == null || index < 0) return null;
109
117
  return this._metaExtractor(index);
110
118
  };
111
119
  _proto.getMetaIndex = function getMetaIndex(meta) {
120
+ if (meta == null) return -1;
121
+ if (this.isThresholdMeta(meta)) return -1;
112
122
  if (this._indexExtractor) return this._indexExtractor(meta);
113
123
  return this._metaToIndexMap.get(meta);
114
124
  };
@@ -147,66 +157,53 @@ var IntegerBufferSet = /*#__PURE__*/function () {
147
157
  var _this$_largeValues$pe;
148
158
  return (_this$_largeValues$pe = this._largeValues.peek()) == null ? void 0 : _this$_largeValues$pe.value;
149
159
  };
150
- _proto.replacePositionInFliedIndices = function replacePositionInFliedIndices(newIndex, safeRange) {
151
- var startIndex = safeRange.startIndex,
152
- endIndex = safeRange.endIndex;
160
+ _proto.getFliedPosition = function getFliedPosition(newIndex, safeRange) {
153
161
  if (this._isOnTheFlyFull) {
154
- if (!isClamped(startIndex, newIndex, endIndex)) {
155
- return null;
162
+ if (safeRange && isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)) {
163
+ return this.getOnTheFlyUncriticalPosition(safeRange);
156
164
  }
157
- var pos = this.getOnTheFlyUncriticalPosition(safeRange);
158
- if (pos != null) return pos;
159
- }
160
- return null;
161
- };
162
- _proto.getFliedPosition = function getFliedPosition(newIndex, safeRange) {
163
- var pos = this.replacePositionInFliedIndices(newIndex, safeRange);
164
- if (pos != null) {
165
- var meta = this.getIndexMeta(newIndex);
166
- this._onTheFlyIndices[pos] = meta;
167
- this._setMetaIndex(meta, newIndex);
168
- return this._isOnTheFlyFullReturnHook(pos);
169
165
  }
170
166
  return null;
171
167
  };
172
168
  _proto.getPosition = function getPosition(newIndex, safeRange) {
173
169
  this.prepare();
174
170
  var meta = this.getIndexMeta(newIndex);
175
- var prevMetaPosition = this._metaToPositionMap.get(meta);
176
- if (prevMetaPosition !== undefined) {
177
- var onTheFlyPositionMeta = this._onTheFlyIndices[prevMetaPosition];
178
- if (onTheFlyPositionMeta) {
179
- if (onTheFlyPositionMeta === meta) {
180
- return prevMetaPosition;
181
- }
182
- var _positionToReplace = this._replaceFurthestIndexPosition(newIndex, safeRange);
183
- if (this._isOnTheFlyFull) return this.getFliedPosition(newIndex, safeRange);
184
- while (this._onTheFlyIndices[_positionToReplace]) {
185
- _positionToReplace = this._replaceFurthestIndexPosition(newIndex, safeRange);
186
- }
187
- if (_positionToReplace != null) {
188
- this._setMetaIndex(meta, newIndex);
189
- this._onTheFlyIndices[_positionToReplace] = onTheFlyPositionMeta;
190
- return this._isOnTheFlyFullReturnHook(_positionToReplace);
191
- }
192
- }
193
- this._onTheFlyIndices[prevMetaPosition] = meta;
194
- return this._isOnTheFlyFullReturnHook(prevMetaPosition);
195
- }
196
- if (!this.isBufferFull) return this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(newIndex));
197
- if (this._isOnTheFlyFull) return this.getFliedPosition(newIndex, safeRange);
198
- var positionToReplace;
199
- var prevIndexMeta = this._indexToMetaMap.get(newIndex);
200
- if (!prevIndexMeta) {
201
- this._cleanHeaps();
202
- positionToReplace = this._replaceFurthestIndexPosition(newIndex, safeRange);
171
+ var metaPosition = this._metaToPositionMap.get(meta);
172
+ var position, indexMeta;
173
+ if (metaPosition !== undefined) {
174
+ position = this.commitPosition({
175
+ newIndex: newIndex,
176
+ meta: meta,
177
+ safeRange: safeRange,
178
+ position: metaPosition
179
+ });
180
+ } else if (!this.isBufferFull) {
181
+ position = this.getNewPositionForIndex(newIndex);
182
+ } else if (this._isOnTheFlyFull) {
183
+ position = this.getFliedPosition(newIndex, safeRange);
184
+ } else if ((indexMeta = this._indexToMetaMap.get(newIndex)) && this._metaToPositionMap.get(indexMeta)) {
185
+ position = this.commitPosition({
186
+ newIndex: newIndex,
187
+ meta: meta,
188
+ safeRange: safeRange,
189
+ position: this._metaToPositionMap.get(indexMeta)
190
+ });
203
191
  } else {
204
- positionToReplace = this._metaToPositionMap.get(prevIndexMeta);
192
+ this._cleanHeaps();
193
+ position = this.commitPosition({
194
+ newIndex: newIndex,
195
+ meta: meta,
196
+ safeRange: safeRange,
197
+ position: this._replaceFurthestIndexPosition(newIndex, safeRange)
198
+ });
205
199
  }
206
- this._onTheFlyIndices[positionToReplace] = meta;
207
- this._setMetaIndex(meta, newIndex);
208
- this._setMetaPosition(meta, positionToReplace);
209
- return this._isOnTheFlyFullReturnHook(positionToReplace);
200
+ if (position != null) {
201
+ this._onTheFlyIndices[position] = meta;
202
+ this._setMetaIndex(meta, newIndex);
203
+ this._metaToPositionMap.set(meta, position);
204
+ return this._isOnTheFlyFullReturnHook(position);
205
+ }
206
+ return null;
210
207
  };
211
208
  _proto.replaceFurthestIndexPosition = function replaceFurthestIndexPosition(newIndex, safeRange) {
212
209
  if (!this.isBufferFull) {
@@ -218,9 +215,16 @@ var IntegerBufferSet = /*#__PURE__*/function () {
218
215
  if (this._largeValues.empty() || this._smallValues.empty()) {
219
216
  return this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(newIndex));
220
217
  }
218
+ var indexToReplace;
221
219
  var minValue = this._smallValues.peek().value;
222
220
  var maxValue = this._largeValues.peek().value;
223
- var indexToReplace;
221
+ if (maxValue > thresholdNumber) {
222
+ indexToReplace = maxValue;
223
+ this._largeValues.pop();
224
+ var _replacedMeta = this._indexToMetaMap.get(indexToReplace);
225
+ var _position = this._metaToPositionMap.get(_replacedMeta);
226
+ return _position;
227
+ }
224
228
  if (!safeRange) {
225
229
  if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {
226
230
  indexToReplace = minValue;
@@ -229,9 +233,9 @@ var IntegerBufferSet = /*#__PURE__*/function () {
229
233
  indexToReplace = maxValue;
230
234
  this._largeValues.pop();
231
235
  }
232
- var _replacedMeta = this._indexToMetaMap.get(indexToReplace);
233
- var _position = this._metaToPositionMap.get(_replacedMeta);
234
- return _position;
236
+ var _replacedMeta2 = this._indexToMetaMap.get(indexToReplace);
237
+ var _position2 = this._metaToPositionMap.get(_replacedMeta2);
238
+ return _position2;
235
239
  }
236
240
  var lowValue = safeRange.startIndex,
237
241
  highValue = safeRange.endIndex;
@@ -266,7 +270,6 @@ var IntegerBufferSet = /*#__PURE__*/function () {
266
270
  var _available = [];
267
271
  var indexToMetaMap = new Map();
268
272
  var metaToIndexMap = new Map();
269
- var metaToPositionMap = new Map();
270
273
  var _loop = function _loop() {
271
274
  var currentIndex = indices[_idx];
272
275
  var currentMeta = _this._metaExtractor(currentIndex);
@@ -290,71 +293,43 @@ var IntegerBufferSet = /*#__PURE__*/function () {
290
293
  var _ret = _loop();
291
294
  if (_ret === "continue") continue;
292
295
  }
293
- var _this$initialize = this.initialize(),
294
- smallValues = _this$initialize.smallValues,
295
- largeValues = _this$initialize.largeValues;
296
296
  var positionToMetaList = [];
297
+ this._indexToMetaMap = indexToMetaMap;
298
+ this.replaceMetaToIndexMap(metaToIndexMap);
297
299
  for (var position = 0; position < indices.length; position++) {
298
- var value = indices[position];
299
300
  if (_arr[position] != null) {
300
301
  positionToMetaList[position] = _arr[position];
301
- metaToPositionMap.set(_arr[position], position);
302
- var element = {
303
- position: position,
304
- value: value
305
- };
306
- smallValues.push(element);
307
- largeValues.push(element);
308
302
  continue;
309
303
  }
310
304
  var _meta = _available.shift();
311
305
  if (_meta != null) {
312
306
  positionToMetaList[position] = _meta;
313
- metaToPositionMap.set(_meta, position);
314
- var _element = {
315
- position: position,
316
- value: value
317
- };
318
- smallValues.push(_element);
319
- largeValues.push(_element);
320
307
  }
321
308
  }
322
309
  this._positionToMetaList = positionToMetaList;
323
- this._smallValues = smallValues;
324
- this._largeValues = largeValues;
325
- this._indexToMetaMap = indexToMetaMap;
326
- this.replaceMetaToIndexMap(metaToIndexMap);
327
- this._metaToPositionMap = metaToPositionMap;
328
- this._onTheFlyIndices = [];
329
- try {
330
- var _indices = new Array(this.bufferSize);
331
- for (var _idx2 = 0; _idx2 < _indices.length; _idx2++) {
332
- var _meta2 = this._onTheFlyIndices[_idx2] || this._positionToMetaList[_idx2];
333
- var _targetIndex = this.getMetaIndex(_meta2);
334
- if (_meta2 != null) {
335
- _indices[_idx2] = {
336
- meta: _meta2,
337
- targetIndex: _targetIndex,
338
- recyclerKey: this._name + "_" + _idx2
339
- };
340
- }
341
- }
342
- return _indices;
343
- } catch (err) {
344
- this.readyToStartNextLoop();
345
- return this._positionToMetaList;
346
- }
310
+ return this.getIndices();
347
311
  };
348
312
  _proto.getIndices = function getIndices() {
313
+ var _this$initialize = this.initialize(),
314
+ smallValues = _this$initialize.smallValues,
315
+ largeValues = _this$initialize.largeValues;
349
316
  try {
350
- var indices = new Array(this.bufferSize);
317
+ var indices = new Array(this._positionToMetaList.length);
318
+ var metaToPositionMap = new Map();
351
319
  for (var idx = 0; idx < indices.length; idx++) {
352
320
  var meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
353
321
  var targetIndex = this.getMetaIndex(meta);
354
- if (meta !== this.getIndexMeta(targetIndex)) {
322
+ if (!this.isThresholdMeta(meta) && meta != this.getIndexMeta(targetIndex)) {
355
323
  return this.shuffle();
356
324
  }
357
- if (meta != null) {
325
+ if (meta != null && !this.isThresholdMeta(meta)) {
326
+ var element = {
327
+ position: idx,
328
+ value: targetIndex
329
+ };
330
+ smallValues.push(element);
331
+ largeValues.push(element);
332
+ metaToPositionMap.set(meta, idx);
358
333
  indices[idx] = {
359
334
  meta: meta,
360
335
  targetIndex: targetIndex,
@@ -362,11 +337,19 @@ var IntegerBufferSet = /*#__PURE__*/function () {
362
337
  };
363
338
  }
364
339
  }
365
- this._onTheFlyIndices = [];
340
+ this._smallValues = smallValues;
341
+ this._largeValues = largeValues;
342
+ this._metaToPositionMap = metaToPositionMap;
343
+ this._positionToMetaList = indices.map(function (v) {
344
+ return v == null ? void 0 : v.meta;
345
+ });
346
+ this.resetOnTheFlies();
366
347
  return indices;
367
348
  } catch (err) {
368
- this.readyToStartNextLoop();
349
+ console.log('err ', err);
369
350
  return this._positionToMetaList;
351
+ } finally {
352
+ this.readyToStartNextLoop();
370
353
  }
371
354
  };
372
355
  _proto._pushToHeaps = function _pushToHeaps(position, value) {
@@ -378,11 +361,26 @@ var IntegerBufferSet = /*#__PURE__*/function () {
378
361
  this._largeValues.push(element);
379
362
  };
380
363
  _proto._setMetaPosition = function _setMetaPosition(meta, position) {
381
- var prevMetaOnPosition = this._positionToMetaList[position];
382
- if (prevMetaOnPosition) this._metaToPositionMap["delete"](prevMetaOnPosition);
383
364
  this._positionToMetaList[position] = meta;
384
365
  this._metaToPositionMap.set(meta, position);
385
366
  };
367
+ _proto.commitPosition = function commitPosition(props) {
368
+ var newIndex = props.newIndex,
369
+ safeRange = props.safeRange,
370
+ position = props.position,
371
+ meta = props.meta;
372
+ var onTheFlyPositionMeta = this._onTheFlyIndices[position];
373
+ var positionToReplace = position;
374
+ if (onTheFlyPositionMeta) {
375
+ if (onTheFlyPositionMeta === meta) return position;
376
+ if (this._isOnTheFlyFull) return this.getFliedPosition(newIndex, safeRange);
377
+ positionToReplace = this._replaceFurthestIndexPosition(newIndex, safeRange);
378
+ while (this._onTheFlyIndices[positionToReplace]) {
379
+ positionToReplace = this._replaceFurthestIndexPosition(newIndex, safeRange);
380
+ }
381
+ }
382
+ return positionToReplace;
383
+ };
386
384
  _proto._setMetaIndex = function _setMetaIndex(meta, index) {
387
385
  var prevMetaIndex = this.getMetaIndex(meta);
388
386
  if (prevMetaIndex !== undefined) {
@@ -402,8 +400,12 @@ var IntegerBufferSet = /*#__PURE__*/function () {
402
400
  this._isOnTheFlyFull = false;
403
401
  };
404
402
  _proto._cleanHeaps = function _cleanHeaps() {
405
- this._cleanHeap(this._smallValues);
406
- this._cleanHeap(this._largeValues);
403
+ for (var idx = 0; idx < this._positionToMetaList.length; idx++) {
404
+ if (this._positionToMetaList[idx] == null) {
405
+ this._recreateHeaps();
406
+ return;
407
+ }
408
+ }
407
409
  var minHeapSize = Math.min(this._smallValues.size(), this._largeValues.size());
408
410
  var maxHeapSize = Math.max(this._smallValues.size(), this._largeValues.size());
409
411
  if (maxHeapSize > 10 * minHeapSize) {
@@ -411,23 +413,29 @@ var IntegerBufferSet = /*#__PURE__*/function () {
411
413
  }
412
414
  };
413
415
  _proto._recreateHeaps = function _recreateHeaps() {
414
- var sourceHeap = this._smallValues.size() < this._largeValues.size() ? this._smallValues : this._largeValues;
415
- var newSmallValues = new Heap([], this._smallerComparator);
416
- var newLargeValues = new Heap([], this._greaterComparator);
417
- while (!sourceHeap.empty()) {
418
- var element = sourceHeap.pop();
419
- if (this._metaToPositionMap.get(this._indexToMetaMap.get(element.value)) != null) {
420
- newSmallValues.push(element);
421
- newLargeValues.push(element);
416
+ var _this$initialize2 = this.initialize(),
417
+ smallValues = _this$initialize2.smallValues,
418
+ largeValues = _this$initialize2.largeValues;
419
+ for (var position = 0; position < this._positionToMetaList.length; position++) {
420
+ var meta = this._positionToMetaList[position];
421
+ var value = this.getMetaIndex(meta);
422
+ if (!meta || value === -1 || value == null) {
423
+ value = Number.MAX_SAFE_INTEGER - position;
424
+ }
425
+ var element = {
426
+ position: position,
427
+ value: value
428
+ };
429
+ smallValues.push(element);
430
+ largeValues.push(element);
431
+ if (value > thresholdNumber) {
432
+ this._setMetaPosition(value, position);
433
+ this._setMetaIndex(value, value);
422
434
  }
423
435
  }
424
- this._smallValues = newSmallValues;
425
- this._largeValues = newLargeValues;
426
- };
427
- _proto._cleanHeap = function _cleanHeap(heap) {
428
- while (!heap.empty() && this._metaToPositionMap.get(this._indexToMetaMap.get(heap.peek().value)) == null) {
429
- heap.pop();
430
- }
436
+ this._largeValues.peek().value;
437
+ this._smallValues = smallValues;
438
+ this._largeValues = largeValues;
431
439
  };
432
440
  _proto._smallerComparator = function _smallerComparator(lhs, rhs) {
433
441
  return lhs.value < rhs.value;
@@ -1 +1 @@
1
- {"version":3,"file":"integer-buffer-set.cjs.development.js","sources":["../src/index.ts"],"sourcesContent":["import Heap from '@x-oasis/heap';\nimport isClamped from '@x-oasis/is-clamped';\nimport invariant from '@x-oasis/invariant';\nimport returnHook, { ReturnHook } from '@x-oasis/return-hook';\nimport {\n HeapItem,\n SafeRange,\n MetaExtractor,\n IndexExtractor,\n IntegerBufferSetProps,\n MetaToIndexMap,\n MetaToPositionMap,\n IndexToMetaMap,\n} from './types';\n\nconst defaultMetaExtractor = (value) => value;\nexport const defaultBufferSize = 10;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _name: string;\n private _bufferSize: number;\n\n private _indexToMetaMap: IndexToMetaMap<Meta>;\n private _metaToPositionMap: MetaToPositionMap<Meta>;\n private _positionToMetaList: Array<Meta>;\n private _metaToIndexMap: MetaToIndexMap<Meta>;\n\n private _smallValues: Heap<HeapItem>;\n private _largeValues: Heap<HeapItem>;\n private _metaExtractor: MetaExtractor<Meta>;\n private _indexExtractor: IndexExtractor<Meta>;\n\n private _onTheFlyIndices: Array<Meta>;\n\n private _isOnTheFlyFull: boolean;\n private _isOnTheFlyFullReturnHook: ReturnHook;\n\n private _loopMS: number;\n private _lastUpdatedMS: number;\n\n constructor(props: IntegerBufferSetProps<Meta> = {}) {\n const {\n name = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._name = name;\n\n /**\n * this._indexToMetaMap is used to find the prev meta when finding a position for index.\n */\n this._indexToMetaMap = new Map();\n this._metaToPositionMap = new Map();\n this._positionToMetaList = [];\n this._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n\n this._bufferSize = bufferSize;\n\n this._smallValues = new Heap([], this._smallerComparator);\n this._largeValues = new Heap([], this._greaterComparator);\n\n this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);\n this.getIndexPosition = this.getIndexPosition.bind(this);\n this.replacePositionInFliedIndices =\n this.replacePositionInFliedIndices.bind(this);\n this.replaceFurthestIndexPosition =\n this.replaceFurthestIndexPosition.bind(this);\n this._isOnTheFlyFullReturnHook = returnHook(\n this.setIsOnTheFlyFull.bind(this)\n );\n\n this._loopMS = Date.now();\n this._lastUpdatedMS = this._loopMS;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n setIsOnTheFlyFull(val: any) {\n if (val != null) {\n const data = this._onTheFlyIndices.filter((v) => v);\n this._isOnTheFlyFull = data.length === this._bufferSize;\n }\n }\n\n get isBufferFull() {\n return this._positionToMetaList.length >= this._bufferSize;\n }\n\n getOnTheFlyUncriticalPosition(safeRange: SafeRange) {\n const { startIndex, endIndex } = safeRange;\n for (let idx = 0; idx < this._onTheFlyIndices.length; idx++) {\n const meta = this._onTheFlyIndices[idx];\n const metaIndex = this._metaToIndexMap.get(meta);\n if (!isClamped(startIndex, metaIndex, endIndex)) {\n return idx;\n }\n }\n return null;\n }\n\n initialize() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n valueToPositionObject: {},\n };\n }\n\n getIndexMeta(index: number) {\n return this._metaExtractor(index);\n }\n\n getMetaIndex(meta: Meta) {\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n getMinValue() {\n return this._smallValues.peek()?.value;\n }\n\n getMaxValue() {\n return this._largeValues.peek()?.value;\n }\n\n replacePositionInFliedIndices(newIndex: number, safeRange: SafeRange) {\n const { startIndex, endIndex } = safeRange;\n\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (!isClamped(startIndex, newIndex, endIndex)) {\n return null;\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n if (pos != null) return pos;\n }\n return null;\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n const pos = this.replacePositionInFliedIndices(newIndex, safeRange);\n if (pos != null) {\n const meta = this.getIndexMeta(newIndex);\n this._onTheFlyIndices[pos] = meta;\n this._setMetaIndex(meta, newIndex);\n return this._isOnTheFlyFullReturnHook(pos);\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const prevMetaPosition = this._metaToPositionMap.get(meta);\n\n if (prevMetaPosition !== undefined) {\n const onTheFlyPositionMeta = this._onTheFlyIndices[prevMetaPosition];\n // the occupied meta should change position\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) {\n return prevMetaPosition;\n }\n let positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n\n if (positionToReplace != null) {\n this._setMetaIndex(meta, newIndex);\n this._onTheFlyIndices[positionToReplace] = onTheFlyPositionMeta;\n return this._isOnTheFlyFullReturnHook(positionToReplace);\n }\n }\n this._onTheFlyIndices[prevMetaPosition] = meta;\n return this._isOnTheFlyFullReturnHook(prevMetaPosition);\n }\n\n // placed on new buffered position\n if (!this.isBufferFull)\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n\n if (this._isOnTheFlyFull) return this.getFliedPosition(newIndex, safeRange);\n\n let positionToReplace;\n const prevIndexMeta = this._indexToMetaMap.get(newIndex);\n\n // Index has already been stored, but we cant use its old position directly...\n // 1:index -> meta, meta may be reused later\n\n // 2: temp use index -> meta -> position, this issue should exist for follows...\n if (!prevIndexMeta) {\n this._cleanHeaps();\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n } else {\n positionToReplace = this._metaToPositionMap.get(prevIndexMeta);\n }\n\n this._onTheFlyIndices[positionToReplace] = meta;\n this._setMetaIndex(meta, newIndex);\n this._setMetaPosition(meta, positionToReplace);\n // should not push to heap, pop only\n // this._pushToHeaps(positionToReplace, newIndex)\n\n return this._isOnTheFlyFullReturnHook(positionToReplace);\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n const minValue = this._smallValues.peek()!.value;\n const maxValue = this._largeValues.peek()!.value;\n\n let indexToReplace;\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n shuffle() {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n const metaToPositionMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n if (currentMeta == null) continue;\n\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const { smallValues, largeValues } = this.initialize();\n const positionToMetaList = [];\n\n for (let position = 0; position < indices.length; position++) {\n const value = indices[position];\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n metaToPositionMap.set(_arr[position], position);\n const element = { position, value };\n smallValues.push(element);\n largeValues.push(element);\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n metaToPositionMap.set(meta, position);\n\n const element = { position, value };\n smallValues.push(element);\n largeValues.push(element);\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n this._metaToPositionMap = metaToPositionMap;\n this._onTheFlyIndices = [];\n\n try {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta =\n this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n if (meta != null) {\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._name}_${idx}`,\n };\n }\n }\n return indices;\n } catch (err) {\n this.readyToStartNextLoop();\n return this._positionToMetaList;\n }\n }\n\n // key point: `meta` should be preserved..\n getIndices() {\n try {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta =\n this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one element has been deleted\n if (meta !== this.getIndexMeta(targetIndex)) {\n return this.shuffle();\n }\n if (meta != null) {\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._name}_${idx}`,\n };\n }\n }\n // clear on the fly indices after return indices.\n this._onTheFlyIndices = [];\n\n return indices;\n } catch (err) {\n this.readyToStartNextLoop();\n return this._positionToMetaList;\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const element = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._smallValues.push(element);\n this._largeValues.push(element);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n const prevMetaOnPosition = this._positionToMetaList[position];\n if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n this._cleanHeap(this._smallValues);\n this._cleanHeap(this._largeValues);\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const sourceHeap =\n this._smallValues.size() < this._largeValues.size()\n ? this._smallValues\n : this._largeValues;\n const newSmallValues = new Heap<HeapItem>(\n [], // Initial data in the heap\n this._smallerComparator\n );\n const newLargeValues = new Heap<HeapItem>(\n [], // Initial datat in the heap\n this._greaterComparator\n );\n while (!sourceHeap.empty()) {\n const element = sourceHeap.pop()!;\n // Push all still valid elements to new heaps\n if (\n this._metaToPositionMap.get(this._indexToMetaMap.get(element.value)) !=\n null\n ) {\n newSmallValues.push(element);\n newLargeValues.push(element);\n }\n }\n this._smallValues = newSmallValues;\n this._largeValues = newLargeValues;\n }\n\n _cleanHeap(heap: Heap<HeapItem>) {\n while (\n !heap.empty() &&\n this._metaToPositionMap.get(\n this._indexToMetaMap.get(heap.peek()!.value)\n ) == null\n ) {\n heap.pop();\n }\n }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","defaultBufferSize","IntegerBufferSet","props","_props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replacePositionInFliedIndices","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","val","data","filter","v","_isOnTheFlyFull","length","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","meta","metaIndex","get","isClamped","initialize","smallValues","largeValues","valueToPositionObject","getIndexMeta","index","getMetaIndex","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","getMinValue","_this$_smallValues$pe","peek","getMaxValue","_this$_largeValues$pe","newIndex","pos","getFliedPosition","getPosition","prepare","prevMetaPosition","onTheFlyPositionMeta","positionToReplace","_replaceFurthestIndexPosition","isBufferFull","prevIndexMeta","_cleanHeaps","empty","minValue","maxValue","indexToReplace","Math","abs","pop","replacedMeta","position","lowValue","highValue","shuffle","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","metaToPositionMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","_ret","_this$initialize","positionToMetaList","element","shift","recyclerKey","err","readyToStartNextLoop","getIndices","prevMetaOnPosition","prevMetaIndex","_cleanHeap","minHeapSize","min","size","maxHeapSize","max","_recreateHeaps","sourceHeap","newSmallValues","newLargeValues","heap","lhs","rhs","_createClass","key"],"mappings":"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"}
1
+ {"version":3,"file":"integer-buffer-set.cjs.development.js","sources":["../src/index.ts"],"sourcesContent":["import Heap from '@x-oasis/heap';\nimport isClamped from '@x-oasis/is-clamped';\nimport invariant from '@x-oasis/invariant';\nimport returnHook, { ReturnHook } from '@x-oasis/return-hook';\nimport {\n HeapItem,\n SafeRange,\n MetaExtractor,\n IndexExtractor,\n IntegerBufferSetProps,\n MetaToIndexMap,\n MetaToPositionMap,\n IndexToMetaMap,\n} from './types';\n\nconst defaultMetaExtractor = (value) => value;\nexport const defaultBufferSize = 10;\nconst thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _name: string;\n private _bufferSize: number;\n\n private _indexToMetaMap: IndexToMetaMap<Meta>;\n private _metaToPositionMap: MetaToPositionMap<Meta>;\n private _positionToMetaList: Array<Meta>;\n private _metaToIndexMap: MetaToIndexMap<Meta>;\n\n private _smallValues: Heap<HeapItem>;\n private _largeValues: Heap<HeapItem>;\n private _metaExtractor: MetaExtractor<Meta>;\n private _indexExtractor: IndexExtractor<Meta>;\n\n private _onTheFlyIndices: Array<Meta>;\n\n private _isOnTheFlyFull: boolean;\n private _isOnTheFlyFullReturnHook: ReturnHook;\n\n private _loopMS: number;\n private _lastUpdatedMS: number;\n\n constructor(props: IntegerBufferSetProps<Meta> = {}) {\n const {\n name = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._name = name;\n\n /**\n * this._indexToMetaMap is used to find the prev meta when finding a position for index.\n */\n this._indexToMetaMap = new Map();\n this._metaToPositionMap = new Map();\n this._positionToMetaList = [];\n this._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n\n this._bufferSize = bufferSize;\n\n this._smallValues = new Heap([], this._smallerComparator);\n this._largeValues = new Heap([], this._greaterComparator);\n\n this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);\n this.getIndexPosition = this.getIndexPosition.bind(this);\n this.replaceFurthestIndexPosition =\n this.replaceFurthestIndexPosition.bind(this);\n this._isOnTheFlyFullReturnHook = returnHook(\n this.setIsOnTheFlyFull.bind(this)\n );\n\n this._loopMS = Date.now();\n this._lastUpdatedMS = this._loopMS;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n isThresholdMeta(meta) {\n if (typeof meta === 'number' && meta > thresholdNumber) return true;\n return false;\n }\n\n setIsOnTheFlyFull(val: any) {\n if (val != null) {\n const data = this._onTheFlyIndices.filter((v) => v != null);\n this._isOnTheFlyFull = data.length === this._bufferSize;\n // console.log('fly ', this._isOnTheFlyFull, data.length, this._bufferSize);\n }\n }\n\n resetOnTheFlies() {\n this._isOnTheFlyFull = false;\n this._onTheFlyIndices = [];\n }\n\n get isBufferFull() {\n return this._positionToMetaList.length >= this._bufferSize;\n }\n\n getOnTheFlyUncriticalPosition(safeRange: SafeRange) {\n const { startIndex, endIndex } = safeRange;\n for (let idx = 0; idx < this._onTheFlyIndices.length; idx++) {\n const meta = this._onTheFlyIndices[idx];\n const metaIndex = this.getMetaIndex(meta);\n if (!isClamped(startIndex, metaIndex, endIndex)) {\n return idx;\n }\n }\n return null;\n }\n\n initialize() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n }\n\n getMetaIndex(meta: Meta) {\n if (meta == null) return -1;\n if (this.isThresholdMeta(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n getMinValue() {\n return this._smallValues.peek()?.value;\n }\n\n getMaxValue() {\n return this._largeValues.peek()?.value;\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta)\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n // console.log('commeit ---')\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._smallValues.peek()!.value;\n const maxValue = this._largeValues.peek()!.value;\n\n // console.log('mathc ', maxValue, maxValue > thresholdNumber)\n if (maxValue > thresholdNumber) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle() {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices();\n }\n\n // key point: `meta` should be preserved..\n getIndices() {\n const { smallValues, largeValues } = this.initialize();\n\n try {\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta =\n this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one element has been deleted\n if (\n !this.isThresholdMeta(meta) &&\n meta != this.getIndexMeta(targetIndex)\n ) {\n return this.shuffle();\n }\n if (meta != null && !this.isThresholdMeta(meta)) {\n const element = { position: idx, value: targetIndex };\n smallValues.push(element);\n largeValues.push(element);\n metaToPositionMap.set(meta, idx);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._name}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this._positionToMetaList;\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const element = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._smallValues.push(element);\n this._largeValues.push(element);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n // console.log('position ', newIndex, position);\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n // this._cleanHeap(this._smallValues);\n // this._cleanHeap(this._largeValues);\n\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n\n if (!meta || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const element = { position, value };\n smallValues.push(element);\n largeValues.push(element);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n\n this._largeValues.peek().value;\n\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n // _cleanHeap(heap: Heap<HeapItem>) {\n // while (\n // !heap.empty() &&\n // this._metaToPositionMap.get(\n // this._indexToMetaMap.get(heap.peek()!.value)\n // ) == null\n // ) {\n // console.log('pop ---', heap.peek()!.value);\n // heap.pop();\n // }\n // }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","defaultBufferSize","thresholdNumber","Number","MAX_SAFE_INTEGER","IntegerBufferSet","props","_props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","isThresholdMeta","meta","val","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","getMinValue","_this$_smallValues$pe","peek","getMaxValue","_this$_largeValues$pe","getFliedPosition","newIndex","getPosition","prepare","metaPosition","position","indexMeta","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","pop","replacedMeta","Math","abs","lowValue","highValue","shuffle","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","_ret","positionToMetaList","shift","getIndices","_this$initialize","metaToPositionMap","element","recyclerKey","map","err","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","lhs","rhs","_createClass","key"],"mappings":"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"}