@x-oasis/integer-buffer-set 0.1.28 → 0.1.29

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,7 +19,6 @@ 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;
23
22
  setIsOnTheFlyFull(val: any): void;
24
23
  resetOnTheFlies(): void;
25
24
  get isBufferFull(): boolean;
@@ -35,8 +34,14 @@ declare class IntegerBufferSet<Meta = any> {
35
34
  replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>): false | MetaToIndexMap<Meta>;
36
35
  getIndexPosition(index: number): undefined | number;
37
36
  getNewPositionForIndex(index: number): number;
38
- getMinValue(): number;
39
- getMaxValue(): number;
37
+ _peek(heap: Heap): any;
38
+ _getMaxItem(): any;
39
+ _getMinItem(): any;
40
+ _getMinValue(): any;
41
+ _getMaxValue(): any;
42
+ getMaxValue(): any;
43
+ getMinValue(): any;
44
+ _push(heap: Heap, item: HeapItem): void;
40
45
  getFliedPosition(newIndex: number, safeRange: SafeRange): number;
41
46
  getPosition(newIndex: number, safeRange?: SafeRange): any;
42
47
  replaceFurthestIndexPosition(newIndex: number, safeRange?: {
@@ -60,6 +60,9 @@ var defaultMetaExtractor = function defaultMetaExtractor(value) {
60
60
  };
61
61
  var defaultBufferSize = 10;
62
62
  var thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;
63
+ var assertThresholdNumber = function assertThresholdNumber(val) {
64
+ return typeof val === 'number' && val > thresholdNumber;
65
+ };
63
66
  var IntegerBufferSet = /*#__PURE__*/function () {
64
67
  function IntegerBufferSet(props) {
65
68
  if (props === void 0) {
@@ -92,10 +95,6 @@ var IntegerBufferSet = /*#__PURE__*/function () {
92
95
  this._lastUpdatedMS = this._loopMS;
93
96
  }
94
97
  var _proto = IntegerBufferSet.prototype;
95
- _proto.isThresholdMeta = function isThresholdMeta(meta) {
96
- if (typeof meta === 'number' && meta > thresholdNumber) return true;
97
- return false;
98
- };
99
98
  _proto.setIsOnTheFlyFull = function setIsOnTheFlyFull(val) {
100
99
  if (val != null) {
101
100
  var data = this._onTheFlyIndices.filter(function (v) {
@@ -137,7 +136,7 @@ var IntegerBufferSet = /*#__PURE__*/function () {
137
136
  _proto.getMetaIndex = function getMetaIndex(meta) {
138
137
  try {
139
138
  if (meta == null) return -1;
140
- if (this.isThresholdMeta(meta)) return -1;
139
+ if (assertThresholdNumber(meta)) return -1;
141
140
  if (this._indexExtractor) return this._indexExtractor(meta);
142
141
  return this._metaToIndexMap.get(meta);
143
142
  } catch (err) {
@@ -171,13 +170,55 @@ var IntegerBufferSet = /*#__PURE__*/function () {
171
170
  this._setMetaPosition(meta, newPosition);
172
171
  return newPosition;
173
172
  };
174
- _proto.getMinValue = function getMinValue() {
175
- var _this$_smallValues$pe;
176
- return (_this$_smallValues$pe = this._smallValues.peek()) == null ? void 0 : _this$_smallValues$pe.value;
173
+ _proto._peek = function _peek(heap) {
174
+ return heap.peek();
175
+ };
176
+ _proto._getMaxItem = function _getMaxItem() {
177
+ return this._peek(this._largeValues);
178
+ };
179
+ _proto._getMinItem = function _getMinItem() {
180
+ return this._peek(this._smallValues);
181
+ };
182
+ _proto._getMinValue = function _getMinValue() {
183
+ var _this$_peek;
184
+ return (_this$_peek = this._peek(this._smallValues)) == null ? void 0 : _this$_peek.value;
185
+ };
186
+ _proto._getMaxValue = function _getMaxValue() {
187
+ var _this$_peek2;
188
+ return (_this$_peek2 = this._peek(this._largeValues)) == null ? void 0 : _this$_peek2.value;
177
189
  };
178
190
  _proto.getMaxValue = function getMaxValue() {
179
- var _this$_largeValues$pe;
180
- return (_this$_largeValues$pe = this._largeValues.peek()) == null ? void 0 : _this$_largeValues$pe.value;
191
+ var _item2;
192
+ var stack = [];
193
+ var item;
194
+ while ((item = this._getMaxItem()) && assertThresholdNumber((_item = item) == null ? void 0 : _item.value)) {
195
+ var _item;
196
+ stack.push(item);
197
+ this._largeValues.pop();
198
+ }
199
+ var stackItem;
200
+ while (stackItem = stack.pop()) {
201
+ this._largeValues.push(stackItem);
202
+ }
203
+ return (_item2 = item) == null ? void 0 : _item2.value;
204
+ };
205
+ _proto.getMinValue = function getMinValue() {
206
+ var _item4;
207
+ var stack = [];
208
+ var item;
209
+ while ((item = this._getMinItem()) && assertThresholdNumber((_item3 = item) == null ? void 0 : _item3.value)) {
210
+ var _item3;
211
+ stack.push(item);
212
+ this._smallValues.pop();
213
+ }
214
+ var stackItem;
215
+ while (stackItem = stack.pop()) {
216
+ this._smallValues.push(stackItem);
217
+ }
218
+ return (_item4 = item) == null ? void 0 : _item4.value;
219
+ };
220
+ _proto._push = function _push(heap, item) {
221
+ heap.push(item);
181
222
  };
182
223
  _proto.getFliedPosition = function getFliedPosition(newIndex, safeRange) {
183
224
  if (this._isOnTheFlyFull) {
@@ -238,9 +279,9 @@ var IntegerBufferSet = /*#__PURE__*/function () {
238
279
  return this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(newIndex));
239
280
  }
240
281
  var indexToReplace;
241
- var minValue = this._smallValues.peek().value;
242
- var maxValue = this._largeValues.peek().value;
243
- if (maxValue > thresholdNumber) {
282
+ var minValue = this._getMinValue();
283
+ var maxValue = this._getMaxValue();
284
+ if (assertThresholdNumber(maxValue)) {
244
285
  indexToReplace = maxValue;
245
286
  this._largeValues.pop();
246
287
  var _replacedMeta = this._indexToMetaMap.get(indexToReplace);
@@ -354,16 +395,16 @@ var IntegerBufferSet = /*#__PURE__*/function () {
354
395
  for (var idx = 0; idx < indices.length; idx++) {
355
396
  var meta = fallback ? this._onTheFlyIndices[idx] : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
356
397
  var targetIndex = this.getMetaIndex(meta);
357
- if (!this.isThresholdMeta(meta) && meta != this.getIndexMeta(targetIndex) && !retry) {
398
+ if (!assertThresholdNumber(meta) && meta != this.getIndexMeta(targetIndex) && !retry) {
358
399
  return this.shuffle(options);
359
400
  }
360
- if (meta != null && !this.isThresholdMeta(meta)) {
361
- var element = {
401
+ if (meta != null && !assertThresholdNumber(meta)) {
402
+ var item = {
362
403
  position: idx,
363
404
  value: targetIndex
364
405
  };
365
- smallValues.push(element);
366
- largeValues.push(element);
406
+ this._push(smallValues, item);
407
+ this._push(largeValues, item);
367
408
  metaToPositionMap.set(meta, idx);
368
409
  indexToMetaMap.set(targetIndex, meta);
369
410
  metaToIndexMap.set(meta, targetIndex);
@@ -394,12 +435,12 @@ var IntegerBufferSet = /*#__PURE__*/function () {
394
435
  }
395
436
  };
396
437
  _proto._pushToHeaps = function _pushToHeaps(position, value) {
397
- var element = {
438
+ var item = {
398
439
  position: position,
399
440
  value: value
400
441
  };
401
- this._smallValues.push(element);
402
- this._largeValues.push(element);
442
+ this._push(this._smallValues, item);
443
+ this._push(this._largeValues, item);
403
444
  };
404
445
  _proto._setMetaPosition = function _setMetaPosition(meta, position) {
405
446
  this._positionToMetaList[position] = meta;
@@ -460,15 +501,15 @@ var IntegerBufferSet = /*#__PURE__*/function () {
460
501
  for (var position = 0; position < this._positionToMetaList.length; position++) {
461
502
  var meta = this._positionToMetaList[position];
462
503
  var value = this.getMetaIndex(meta);
463
- if (!meta || value === -1 || value == null) {
504
+ if (meta == null || value === -1 || value == null) {
464
505
  value = Number.MAX_SAFE_INTEGER - position;
465
506
  }
466
- var element = {
507
+ var item = {
467
508
  position: position,
468
509
  value: value
469
510
  };
470
- smallValues.push(element);
471
- largeValues.push(element);
511
+ this._push(smallValues, item);
512
+ this._push(largeValues, item);
472
513
  if (value > thresholdNumber) {
473
514
  this._setMetaPosition(value, position);
474
515
  this._setMetaIndex(value, 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;\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 try {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n } catch (err) {\n return null;\n }\n }\n\n getMetaIndex(meta: Meta) {\n try {\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 } catch (err) {\n return -1;\n }\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) != null\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\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(options: { retry: boolean; fallback: boolean }) {\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 ...options,\n retry: true,\n });\n }\n\n // key point: `meta` should be preserved..\n getIndices(\n options = {\n retry: false,\n fallback: false,\n }\n ) {\n try {\n const { retry, fallback } = options;\n const { smallValues, largeValues } = this.initialize();\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = fallback\n ? this._onTheFlyIndices[idx]\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 !retry\n ) {\n return this.shuffle(options);\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 indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\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 this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this.getIndices({\n ...options,\n fallback: true,\n });\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","err","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","options","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","_ret","positionToMetaList","shift","getIndices","_extends","retry","fallback","_options","_this$initialize","metaToPositionMap","element","recyclerKey","map","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","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;\nconst assertThresholdNumber = (val: any) =>\n typeof val === 'number' && val > thresholdNumber;\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 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 try {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n } catch (err) {\n return null;\n }\n }\n\n getMetaIndex(meta: Meta) {\n try {\n if (meta == null) return -1;\n if (assertThresholdNumber(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n } catch (err) {\n return -1;\n }\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 _peek(heap: Heap) {\n return heap.peek();\n }\n\n _getMaxItem() {\n return this._peek(this._largeValues);\n }\n\n _getMinItem() {\n return this._peek(this._smallValues);\n }\n\n _getMinValue() {\n return this._peek(this._smallValues)?.value;\n }\n\n _getMaxValue() {\n return this._peek(this._largeValues)?.value;\n }\n\n // should omit thresholdNumber\n getMaxValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMaxItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._largeValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._largeValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n getMinValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMinItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._smallValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._smallValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n _push(heap: Heap, item: HeapItem) {\n heap.push(item);\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) != null\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 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._getMinValue();\n const maxValue = this._getMaxValue();\n\n if (assertThresholdNumber(maxValue)) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\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(options: { retry: boolean; fallback: boolean }) {\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 ...options,\n retry: true,\n });\n }\n\n // key point: `meta` should be preserved..\n getIndices(\n options = {\n retry: false,\n fallback: false,\n }\n ) {\n try {\n const { retry, fallback } = options;\n const { smallValues, largeValues } = this.initialize();\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = fallback\n ? this._onTheFlyIndices[idx]\n : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one item has been deleted\n if (\n !assertThresholdNumber(meta) &&\n meta != this.getIndexMeta(targetIndex) &&\n !retry\n ) {\n return this.shuffle(options);\n }\n if (meta != null && !assertThresholdNumber(meta)) {\n const item = { position: idx, value: targetIndex };\n this._push(smallValues, item);\n this._push(largeValues, item);\n metaToPositionMap.set(meta, idx);\n indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\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 this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this.getIndices({\n ...options,\n fallback: true,\n });\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 item = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._push(this._smallValues, item);\n this._push(this._largeValues, item);\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 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 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 // 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 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 if (meta == null || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const item = { position, value };\n this._push(smallValues, item);\n this._push(largeValues, item);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\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","assertThresholdNumber","val","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","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","meta","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","err","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","_peek","heap","peek","_getMaxItem","_getMinItem","_getMinValue","_this$_peek","_getMaxValue","_this$_peek2","getMaxValue","stack","item","_item","push","pop","stackItem","_item2","getMinValue","_item3","_item4","_push","getFliedPosition","newIndex","getPosition","prepare","metaPosition","position","indexMeta","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","replacedMeta","Math","abs","lowValue","highValue","shuffle","options","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","_ret","positionToMetaList","shift","getIndices","_extends","retry","fallback","_options","_this$initialize","metaToPositionMap","recyclerKey","map","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","lhs","rhs","_createClass","key"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}Object.defineProperty(exports,"__esModule",{value:!0});var e=t(require("@x-oasis/heap")),i=t(require("@x-oasis/is-clamped")),n=t(require("@x-oasis/invariant")),s=t(require("@x-oasis/return-hook"));function a(){return(a=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(t[n]=i[n])}return t}).apply(this,arguments)}var o=function(t){return t},r=Number.MAX_SAFE_INTEGER-1e5;exports.default=function(){function t(t){void 0===t&&(t={});var i=t.name,n=void 0===i?"default_buffer":i,a=t.indexExtractor,r=t.bufferSize,l=void 0===r?10:r,h=t.metaExtractor;this._metaExtractor=void 0===h?o:h,this._indexExtractor=a,this._name=n,this._indexToMetaMap=new Map,this._metaToPositionMap=new Map,this._positionToMetaList=[],this._metaToIndexMap=new Map,this._onTheFlyIndices=[],this._bufferSize=l,this._smallValues=new e([],this._smallerComparator),this._largeValues=new e([],this._greaterComparator),this.getNewPositionForIndex=this.getNewPositionForIndex.bind(this),this.getIndexPosition=this.getIndexPosition.bind(this),this.replaceFurthestIndexPosition=this.replaceFurthestIndexPosition.bind(this),this._isOnTheFlyFullReturnHook=s(this.setIsOnTheFlyFull.bind(this)),this._loopMS=Date.now(),this._lastUpdatedMS=this._loopMS}var l,h,u=t.prototype;return u.isThresholdMeta=function(t){return"number"==typeof t&&t>r},u.setIsOnTheFlyFull=function(t){if(null!=t){var e=this._onTheFlyIndices.filter((function(t){return null!=t}));this._isOnTheFlyFull=e.length===this._bufferSize}},u.resetOnTheFlies=function(){this._isOnTheFlyFull=!1,this._onTheFlyIndices=[]},u.getOnTheFlyUncriticalPosition=function(t){for(var e=t.startIndex,n=t.endIndex,s=0;s<this._onTheFlyIndices.length;s++){var a=this.getMetaIndex(this._onTheFlyIndices[s]);if(!i(e,a,n))return s}return null},u.initialize=function(){return{smallValues:new e([],this._smallerComparator),largeValues:new e([],this._greaterComparator)}},u.getIndexMeta=function(t){try{return null==t||t<0?null:this._metaExtractor(t)}catch(t){return null}},u.getMetaIndex=function(t){try{return null==t||this.isThresholdMeta(t)?-1:this._indexExtractor?this._indexExtractor(t):this._metaToIndexMap.get(t)}catch(t){return-1}},u.setMetaIndex=function(t,e){return!this._indexExtractor&&this._metaToIndexMap.set(t,e)},u.deleteMetaIndex=function(t){return this._metaToIndexMap.delete(t)},u.replaceMetaToIndexMap=function(t){return!this._indexExtractor&&(this._metaToIndexMap=t)},u.getIndexPosition=function(t){return this.getMetaIndex(this.getIndexMeta(t))},u.getNewPositionForIndex=function(t){var e=this.getIndexMeta(t);void 0!==this._metaToPositionMap.get(e)&&n(!1);var i=this._positionToMetaList.length;return this._pushToHeaps(i,t),this._setMetaIndex(e,t),this._setMetaPosition(e,i),i},u.getMinValue=function(){var t;return null==(t=this._smallValues.peek())?void 0:t.value},u.getMaxValue=function(){var t;return null==(t=this._largeValues.peek())?void 0:t.value},u.getFliedPosition=function(t,e){return this._isOnTheFlyFull&&e&&i(e.startIndex,t,e.endIndex)?this.getOnTheFlyUncriticalPosition(e):null},u.getPosition=function(t,e){this.prepare();var i,n,s=this.getIndexMeta(t),a=this._metaToPositionMap.get(s);return void 0!==a?i=this.commitPosition({newIndex:t,meta:s,safeRange:e,position:a}):this.isBufferFull?this._isOnTheFlyFull?i=this.getFliedPosition(t,e):(n=this._indexToMetaMap.get(t))&&null!=this._metaToPositionMap.get(n)?i=this.commitPosition({newIndex:t,meta:s,safeRange:e,position:this._metaToPositionMap.get(n)}):(this._cleanHeaps(),i=this.commitPosition({newIndex:t,meta:s,safeRange:e,position:this._replaceFurthestIndexPosition(t,e)})):i=this.getNewPositionForIndex(t),null!=i?(this._onTheFlyIndices[i]=s,this._setMetaIndex(s,t),this._metaToPositionMap.set(s,i),this._isOnTheFlyFullReturnHook(i)):null},u.replaceFurthestIndexPosition=function(t,e){return this.isBufferFull?this._replaceFurthestIndexPosition(t,e):this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t))},u._replaceFurthestIndexPosition=function(t,e){if(this._largeValues.empty()||this._smallValues.empty())return this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t));var n,s=this._smallValues.peek().value,a=this._largeValues.peek().value;if(a>r){n=a,this._largeValues.pop();var o=this._indexToMetaMap.get(n);return this._metaToPositionMap.get(o)}if(!e){Math.abs(t-s)>Math.abs(t-a)?(n=s,this._smallValues.pop()):(n=a,this._largeValues.pop());var l=this._indexToMetaMap.get(n);return this._metaToPositionMap.get(l)}var h=e.startIndex,u=e.endIndex;if(i(h,s,u)&&i(h,a,u))return null;i(h,s,u)&&!i(h,a,u)?(n=a,this._largeValues.pop()):!i(h,s,u)&&i(h,a,u)||h-s>a-u?(n=s,this._smallValues.pop()):(n=a,this._largeValues.pop());var p=this._indexToMetaMap.get(n);return this._metaToPositionMap.get(p)},u.shuffle=function(t){for(var e=this,i=new Array(this.bufferSize),n=0;n<i.length;n++){var s=this.getMetaIndex(this._onTheFlyIndices[n]||this._positionToMetaList[n]);i[n]=s}for(var o=new Array(i.length),r=[],l=new Map,h=new Map,u=function(){var t=i[p],n=e._metaExtractor(t);if(null==n)return"continue";if(l.set(t,n),h.set(n,t),n===e._positionToMetaList[p])return o[p]=n,"continue";var s=e._positionToMetaList.findIndex((function(t){return t===n}));if(-1!==s)return o[s]=n,"continue";r.push(n)},p=0;p<i.length;p++)u();var _=[];this._indexToMetaMap=l,this.replaceMetaToIndexMap(h);for(var d=0;d<i.length;d++)if(null==o[d]){var f=r.shift();null!=f&&(_[d]=f)}else _[d]=o[d];return this._positionToMetaList=_,this.getIndices(a({},t,{retry:!0}))},u.getIndices=function(t){void 0===t&&(t={retry:!1,fallback:!1});try{for(var e=t.retry,i=t.fallback,n=this.initialize(),s=n.smallValues,o=n.largeValues,r=new Array(this._positionToMetaList.length),l=new Map,h=new Map,u=new Map,p=0;p<r.length;p++){var _=i?this._onTheFlyIndices[p]:this._onTheFlyIndices[p]||this._positionToMetaList[p],d=this.getMetaIndex(_);if(!this.isThresholdMeta(_)&&_!=this.getIndexMeta(d)&&!e)return this.shuffle(t);if(null!=_&&!this.isThresholdMeta(_)){var f={position:p,value:d};s.push(f),o.push(f),l.set(_,p),h.set(d,_),u.set(_,d),r[p]={meta:_,targetIndex:d,recyclerKey:this._name+"_"+p}}}return this._smallValues=s,this._largeValues=o,this._metaToPositionMap=l,this._positionToMetaList=r.map((function(t){return null==t?void 0:t.meta})),this.resetOnTheFlies(),this._indexToMetaMap=h,this.replaceMetaToIndexMap(u),r}catch(e){return console.log("err ",e),this.getIndices(a({},t,{fallback:!0}))}finally{this.readyToStartNextLoop()}},u._pushToHeaps=function(t,e){var i={position:t,value:e};this._smallValues.push(i),this._largeValues.push(i)},u._setMetaPosition=function(t,e){this._positionToMetaList[e]=t,this._metaToPositionMap.set(t,e)},u.commitPosition=function(t){var e=t.newIndex,i=t.safeRange,n=t.position,s=this._onTheFlyIndices[n],a=n;if(s){if(s===t.meta)return n;if(this._isOnTheFlyFull)return this.getFliedPosition(e,i);for(a=this._replaceFurthestIndexPosition(e,i);this._onTheFlyIndices[a];)a=this._replaceFurthestIndexPosition(e,i)}return a},u._setMetaIndex=function(t,e){var i=this.getMetaIndex(t);return void 0!==i&&this._indexToMetaMap.delete(i),this.setMetaIndex(t,e),this._indexToMetaMap.set(e,t),!1},u.readyToStartNextLoop=function(){this._lastUpdatedMS=Date.now()},u.prepare=function(){this._loopMS!==this._lastUpdatedMS&&(this._loopMS=this._lastUpdatedMS,this._onTheFlyIndices=[],this._isOnTheFlyFull=!1)},u._cleanHeaps=function(){for(var t=0;t<this._positionToMetaList.length;t++)if(null==this._positionToMetaList[t])return void this._recreateHeaps();var e=Math.min(this._smallValues.size(),this._largeValues.size());Math.max(this._smallValues.size(),this._largeValues.size())>10*e&&this._recreateHeaps()},u._recreateHeaps=function(){for(var t=this.initialize(),e=t.smallValues,i=t.largeValues,n=0;n<this._positionToMetaList.length;n++){var s=this._positionToMetaList[n],a=this.getMetaIndex(s);s&&-1!==a&&null!=a||(a=Number.MAX_SAFE_INTEGER-n);var o={position:n,value:a};e.push(o),i.push(o),a>r&&(this._setMetaPosition(a,n),this._setMetaIndex(a,a))}this._smallValues=e,this._largeValues=i},u._smallerComparator=function(t,e){return t.value<e.value},u._greaterComparator=function(t,e){return t.value>e.value},l=t,(h=[{key:"bufferSize",get:function(){return this._bufferSize}},{key:"isBufferFull",get:function(){return this._positionToMetaList.length>=this._bufferSize}}])&&function(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,"symbol"==typeof(s=function(t,e){if("object"!=typeof t||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key))?s:String(s),n)}var s}(l.prototype,h),Object.defineProperty(l,"prototype",{writable:!1}),t}(),exports.defaultBufferSize=10;
1
+ "use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}Object.defineProperty(exports,"__esModule",{value:!0});var e=t(require("@x-oasis/heap")),i=t(require("@x-oasis/is-clamped")),n=t(require("@x-oasis/invariant")),s=t(require("@x-oasis/return-hook"));function a(){return(a=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(t[n]=i[n])}return t}).apply(this,arguments)}var o=function(t){return t},r=Number.MAX_SAFE_INTEGER-1e5,l=function(t){return"number"==typeof t&&t>r};exports.default=function(){function t(t){void 0===t&&(t={});var i=t.name,n=void 0===i?"default_buffer":i,a=t.indexExtractor,r=t.bufferSize,l=void 0===r?10:r,u=t.metaExtractor;this._metaExtractor=void 0===u?o:u,this._indexExtractor=a,this._name=n,this._indexToMetaMap=new Map,this._metaToPositionMap=new Map,this._positionToMetaList=[],this._metaToIndexMap=new Map,this._onTheFlyIndices=[],this._bufferSize=l,this._smallValues=new e([],this._smallerComparator),this._largeValues=new e([],this._greaterComparator),this.getNewPositionForIndex=this.getNewPositionForIndex.bind(this),this.getIndexPosition=this.getIndexPosition.bind(this),this.replaceFurthestIndexPosition=this.replaceFurthestIndexPosition.bind(this),this._isOnTheFlyFullReturnHook=s(this.setIsOnTheFlyFull.bind(this)),this._loopMS=Date.now(),this._lastUpdatedMS=this._loopMS}var u,h,p=t.prototype;return p.setIsOnTheFlyFull=function(t){if(null!=t){var e=this._onTheFlyIndices.filter((function(t){return null!=t}));this._isOnTheFlyFull=e.length===this._bufferSize}},p.resetOnTheFlies=function(){this._isOnTheFlyFull=!1,this._onTheFlyIndices=[]},p.getOnTheFlyUncriticalPosition=function(t){for(var e=t.startIndex,n=t.endIndex,s=0;s<this._onTheFlyIndices.length;s++){var a=this.getMetaIndex(this._onTheFlyIndices[s]);if(!i(e,a,n))return s}return null},p.initialize=function(){return{smallValues:new e([],this._smallerComparator),largeValues:new e([],this._greaterComparator)}},p.getIndexMeta=function(t){try{return null==t||t<0?null:this._metaExtractor(t)}catch(t){return null}},p.getMetaIndex=function(t){try{return null==t||l(t)?-1:this._indexExtractor?this._indexExtractor(t):this._metaToIndexMap.get(t)}catch(t){return-1}},p.setMetaIndex=function(t,e){return!this._indexExtractor&&this._metaToIndexMap.set(t,e)},p.deleteMetaIndex=function(t){return this._metaToIndexMap.delete(t)},p.replaceMetaToIndexMap=function(t){return!this._indexExtractor&&(this._metaToIndexMap=t)},p.getIndexPosition=function(t){return this.getMetaIndex(this.getIndexMeta(t))},p.getNewPositionForIndex=function(t){var e=this.getIndexMeta(t);void 0!==this._metaToPositionMap.get(e)&&n(!1);var i=this._positionToMetaList.length;return this._pushToHeaps(i,t),this._setMetaIndex(e,t),this._setMetaPosition(e,i),i},p._peek=function(t){return t.peek()},p._getMaxItem=function(){return this._peek(this._largeValues)},p._getMinItem=function(){return this._peek(this._smallValues)},p._getMinValue=function(){var t;return null==(t=this._peek(this._smallValues))?void 0:t.value},p._getMaxValue=function(){var t;return null==(t=this._peek(this._largeValues))?void 0:t.value},p.getMaxValue=function(){for(var t,e,i,n=[];(e=this._getMaxItem())&&l(null==(s=e)?void 0:s.value);){var s;n.push(e),this._largeValues.pop()}for(;i=n.pop();)this._largeValues.push(i);return null==(t=e)?void 0:t.value},p.getMinValue=function(){for(var t,e,i,n=[];(e=this._getMinItem())&&l(null==(s=e)?void 0:s.value);){var s;n.push(e),this._smallValues.pop()}for(;i=n.pop();)this._smallValues.push(i);return null==(t=e)?void 0:t.value},p._push=function(t,e){t.push(e)},p.getFliedPosition=function(t,e){return this._isOnTheFlyFull&&e&&i(e.startIndex,t,e.endIndex)?this.getOnTheFlyUncriticalPosition(e):null},p.getPosition=function(t,e){this.prepare();var i,n,s=this.getIndexMeta(t),a=this._metaToPositionMap.get(s);return void 0!==a?i=this.commitPosition({newIndex:t,meta:s,safeRange:e,position:a}):this.isBufferFull?this._isOnTheFlyFull?i=this.getFliedPosition(t,e):(n=this._indexToMetaMap.get(t))&&null!=this._metaToPositionMap.get(n)?i=this.commitPosition({newIndex:t,meta:s,safeRange:e,position:this._metaToPositionMap.get(n)}):(this._cleanHeaps(),i=this.commitPosition({newIndex:t,meta:s,safeRange:e,position:this._replaceFurthestIndexPosition(t,e)})):i=this.getNewPositionForIndex(t),null!=i?(this._onTheFlyIndices[i]=s,this._setMetaIndex(s,t),this._metaToPositionMap.set(s,i),this._isOnTheFlyFullReturnHook(i)):null},p.replaceFurthestIndexPosition=function(t,e){return this.isBufferFull?this._replaceFurthestIndexPosition(t,e):this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t))},p._replaceFurthestIndexPosition=function(t,e){if(this._largeValues.empty()||this._smallValues.empty())return this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t));var n,s=this._getMinValue(),a=this._getMaxValue();if(l(a)){n=a,this._largeValues.pop();var o=this._indexToMetaMap.get(n);return this._metaToPositionMap.get(o)}if(!e){Math.abs(t-s)>Math.abs(t-a)?(n=s,this._smallValues.pop()):(n=a,this._largeValues.pop());var r=this._indexToMetaMap.get(n);return this._metaToPositionMap.get(r)}var u=e.startIndex,h=e.endIndex;if(i(u,s,h)&&i(u,a,h))return null;i(u,s,h)&&!i(u,a,h)?(n=a,this._largeValues.pop()):!i(u,s,h)&&i(u,a,h)||u-s>a-h?(n=s,this._smallValues.pop()):(n=a,this._largeValues.pop());var p=this._indexToMetaMap.get(n);return this._metaToPositionMap.get(p)},p.shuffle=function(t){for(var e=this,i=new Array(this.bufferSize),n=0;n<i.length;n++){var s=this.getMetaIndex(this._onTheFlyIndices[n]||this._positionToMetaList[n]);i[n]=s}for(var o=new Array(i.length),r=[],l=new Map,u=new Map,h=function(){var t=i[p],n=e._metaExtractor(t);if(null==n)return"continue";if(l.set(t,n),u.set(n,t),n===e._positionToMetaList[p])return o[p]=n,"continue";var s=e._positionToMetaList.findIndex((function(t){return t===n}));if(-1!==s)return o[s]=n,"continue";r.push(n)},p=0;p<i.length;p++)h();var _=[];this._indexToMetaMap=l,this.replaceMetaToIndexMap(u);for(var d=0;d<i.length;d++)if(null==o[d]){var f=r.shift();null!=f&&(_[d]=f)}else _[d]=o[d];return this._positionToMetaList=_,this.getIndices(a({},t,{retry:!0}))},p.getIndices=function(t){void 0===t&&(t={retry:!1,fallback:!1});try{for(var e=t.retry,i=t.fallback,n=this.initialize(),s=n.smallValues,o=n.largeValues,r=new Array(this._positionToMetaList.length),u=new Map,h=new Map,p=new Map,_=0;_<r.length;_++){var d=i?this._onTheFlyIndices[_]:this._onTheFlyIndices[_]||this._positionToMetaList[_],f=this.getMetaIndex(d);if(!l(d)&&d!=this.getIndexMeta(f)&&!e)return this.shuffle(t);if(null!=d&&!l(d)){var c={position:_,value:f};this._push(s,c),this._push(o,c),u.set(d,_),h.set(f,d),p.set(d,f),r[_]={meta:d,targetIndex:f,recyclerKey:this._name+"_"+_}}}return this._smallValues=s,this._largeValues=o,this._metaToPositionMap=u,this._positionToMetaList=r.map((function(t){return null==t?void 0:t.meta})),this.resetOnTheFlies(),this._indexToMetaMap=h,this.replaceMetaToIndexMap(p),r}catch(e){return console.log("err ",e),this.getIndices(a({},t,{fallback:!0}))}finally{this.readyToStartNextLoop()}},p._pushToHeaps=function(t,e){var i={position:t,value:e};this._push(this._smallValues,i),this._push(this._largeValues,i)},p._setMetaPosition=function(t,e){this._positionToMetaList[e]=t,this._metaToPositionMap.set(t,e)},p.commitPosition=function(t){var e=t.newIndex,i=t.safeRange,n=t.position,s=this._onTheFlyIndices[n],a=n;if(s){if(s===t.meta)return n;if(this._isOnTheFlyFull)return this.getFliedPosition(e,i);for(a=this._replaceFurthestIndexPosition(e,i);this._onTheFlyIndices[a];)a=this._replaceFurthestIndexPosition(e,i)}return a},p._setMetaIndex=function(t,e){var i=this.getMetaIndex(t);return void 0!==i&&this._indexToMetaMap.delete(i),this.setMetaIndex(t,e),this._indexToMetaMap.set(e,t),!1},p.readyToStartNextLoop=function(){this._lastUpdatedMS=Date.now()},p.prepare=function(){this._loopMS!==this._lastUpdatedMS&&(this._loopMS=this._lastUpdatedMS,this._onTheFlyIndices=[],this._isOnTheFlyFull=!1)},p._cleanHeaps=function(){for(var t=0;t<this._positionToMetaList.length;t++)if(null==this._positionToMetaList[t])return void this._recreateHeaps();var e=Math.min(this._smallValues.size(),this._largeValues.size());Math.max(this._smallValues.size(),this._largeValues.size())>10*e&&this._recreateHeaps()},p._recreateHeaps=function(){for(var t=this.initialize(),e=t.smallValues,i=t.largeValues,n=0;n<this._positionToMetaList.length;n++){var s=this._positionToMetaList[n],a=this.getMetaIndex(s);null!=s&&-1!==a&&null!=a||(a=Number.MAX_SAFE_INTEGER-n);var o={position:n,value:a};this._push(e,o),this._push(i,o),a>r&&(this._setMetaPosition(a,n),this._setMetaIndex(a,a))}this._smallValues=e,this._largeValues=i},p._smallerComparator=function(t,e){return t.value<e.value},p._greaterComparator=function(t,e){return t.value>e.value},u=t,(h=[{key:"bufferSize",get:function(){return this._bufferSize}},{key:"isBufferFull",get:function(){return this._positionToMetaList.length>=this._bufferSize}}])&&function(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,"symbol"==typeof(s=function(t,e){if("object"!=typeof t||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key))?s:String(s),n)}var s}(u.prototype,h),Object.defineProperty(u,"prototype",{writable:!1}),t}(),exports.defaultBufferSize=10;
2
2
  //# sourceMappingURL=integer-buffer-set.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"integer-buffer-set.cjs.production.min.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 try {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n } catch (err) {\n return null;\n }\n }\n\n getMetaIndex(meta: Meta) {\n try {\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 } catch (err) {\n return -1;\n }\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) != null\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\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(options: { retry: boolean; fallback: boolean }) {\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 ...options,\n retry: true,\n });\n }\n\n // key point: `meta` should be preserved..\n getIndices(\n options = {\n retry: false,\n fallback: false,\n }\n ) {\n try {\n const { retry, fallback } = options;\n const { smallValues, largeValues } = this.initialize();\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = fallback\n ? this._onTheFlyIndices[idx]\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 !retry\n ) {\n return this.shuffle(options);\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 indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\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 this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this.getIndices({\n ...options,\n fallback: true,\n });\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","thresholdNumber","Number","MAX_SAFE_INTEGER","IntegerBufferSet","props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","this","_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","err","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","position","indexMeta","metaPosition","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","pop","replacedMeta","Math","abs","lowValue","highValue","shuffle","options","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","positionToMetaList","shift","getIndices","_extends","retry","fallback","_this$initialize","metaToPositionMap","element","recyclerKey","map","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","max","_this$initialize2","lhs","rhs","key"],"mappings":"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"}
1
+ {"version":3,"file":"integer-buffer-set.cjs.production.min.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;\nconst assertThresholdNumber = (val: any) =>\n typeof val === 'number' && val > thresholdNumber;\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 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 try {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n } catch (err) {\n return null;\n }\n }\n\n getMetaIndex(meta: Meta) {\n try {\n if (meta == null) return -1;\n if (assertThresholdNumber(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n } catch (err) {\n return -1;\n }\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 _peek(heap: Heap) {\n return heap.peek();\n }\n\n _getMaxItem() {\n return this._peek(this._largeValues);\n }\n\n _getMinItem() {\n return this._peek(this._smallValues);\n }\n\n _getMinValue() {\n return this._peek(this._smallValues)?.value;\n }\n\n _getMaxValue() {\n return this._peek(this._largeValues)?.value;\n }\n\n // should omit thresholdNumber\n getMaxValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMaxItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._largeValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._largeValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n getMinValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMinItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._smallValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._smallValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n _push(heap: Heap, item: HeapItem) {\n heap.push(item);\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) != null\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 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._getMinValue();\n const maxValue = this._getMaxValue();\n\n if (assertThresholdNumber(maxValue)) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\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(options: { retry: boolean; fallback: boolean }) {\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 ...options,\n retry: true,\n });\n }\n\n // key point: `meta` should be preserved..\n getIndices(\n options = {\n retry: false,\n fallback: false,\n }\n ) {\n try {\n const { retry, fallback } = options;\n const { smallValues, largeValues } = this.initialize();\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = fallback\n ? this._onTheFlyIndices[idx]\n : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one item has been deleted\n if (\n !assertThresholdNumber(meta) &&\n meta != this.getIndexMeta(targetIndex) &&\n !retry\n ) {\n return this.shuffle(options);\n }\n if (meta != null && !assertThresholdNumber(meta)) {\n const item = { position: idx, value: targetIndex };\n this._push(smallValues, item);\n this._push(largeValues, item);\n metaToPositionMap.set(meta, idx);\n indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\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 this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this.getIndices({\n ...options,\n fallback: true,\n });\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 item = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._push(this._smallValues, item);\n this._push(this._largeValues, item);\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 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 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 // 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 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 if (meta == null || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const item = { position, value };\n this._push(smallValues, item);\n this._push(largeValues, item);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\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","thresholdNumber","Number","MAX_SAFE_INTEGER","assertThresholdNumber","val","IntegerBufferSet","props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","this","_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","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","err","meta","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","_peek","heap","peek","_getMaxItem","_getMinItem","_getMinValue","_this$_peek","_getMaxValue","_this$_peek2","getMaxValue","item","stackItem","stack","_item","push","pop","_item2","getMinValue","_item3","_item4","_push","getFliedPosition","newIndex","getPosition","prepare","position","indexMeta","metaPosition","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","replacedMeta","Math","abs","lowValue","highValue","shuffle","options","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","positionToMetaList","shift","getIndices","_extends","retry","fallback","_this$initialize","metaToPositionMap","recyclerKey","map","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","max","_this$initialize2","lhs","rhs","key"],"mappings":"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"}
@@ -54,6 +54,9 @@ var defaultMetaExtractor = function defaultMetaExtractor(value) {
54
54
  };
55
55
  var defaultBufferSize = 10;
56
56
  var thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;
57
+ var assertThresholdNumber = function assertThresholdNumber(val) {
58
+ return typeof val === 'number' && val > thresholdNumber;
59
+ };
57
60
  var IntegerBufferSet = /*#__PURE__*/function () {
58
61
  function IntegerBufferSet(props) {
59
62
  if (props === void 0) {
@@ -86,10 +89,6 @@ var IntegerBufferSet = /*#__PURE__*/function () {
86
89
  this._lastUpdatedMS = this._loopMS;
87
90
  }
88
91
  var _proto = IntegerBufferSet.prototype;
89
- _proto.isThresholdMeta = function isThresholdMeta(meta) {
90
- if (typeof meta === 'number' && meta > thresholdNumber) return true;
91
- return false;
92
- };
93
92
  _proto.setIsOnTheFlyFull = function setIsOnTheFlyFull(val) {
94
93
  if (val != null) {
95
94
  var data = this._onTheFlyIndices.filter(function (v) {
@@ -131,7 +130,7 @@ var IntegerBufferSet = /*#__PURE__*/function () {
131
130
  _proto.getMetaIndex = function getMetaIndex(meta) {
132
131
  try {
133
132
  if (meta == null) return -1;
134
- if (this.isThresholdMeta(meta)) return -1;
133
+ if (assertThresholdNumber(meta)) return -1;
135
134
  if (this._indexExtractor) return this._indexExtractor(meta);
136
135
  return this._metaToIndexMap.get(meta);
137
136
  } catch (err) {
@@ -165,13 +164,55 @@ var IntegerBufferSet = /*#__PURE__*/function () {
165
164
  this._setMetaPosition(meta, newPosition);
166
165
  return newPosition;
167
166
  };
168
- _proto.getMinValue = function getMinValue() {
169
- var _this$_smallValues$pe;
170
- return (_this$_smallValues$pe = this._smallValues.peek()) == null ? void 0 : _this$_smallValues$pe.value;
167
+ _proto._peek = function _peek(heap) {
168
+ return heap.peek();
169
+ };
170
+ _proto._getMaxItem = function _getMaxItem() {
171
+ return this._peek(this._largeValues);
172
+ };
173
+ _proto._getMinItem = function _getMinItem() {
174
+ return this._peek(this._smallValues);
175
+ };
176
+ _proto._getMinValue = function _getMinValue() {
177
+ var _this$_peek;
178
+ return (_this$_peek = this._peek(this._smallValues)) == null ? void 0 : _this$_peek.value;
179
+ };
180
+ _proto._getMaxValue = function _getMaxValue() {
181
+ var _this$_peek2;
182
+ return (_this$_peek2 = this._peek(this._largeValues)) == null ? void 0 : _this$_peek2.value;
171
183
  };
172
184
  _proto.getMaxValue = function getMaxValue() {
173
- var _this$_largeValues$pe;
174
- return (_this$_largeValues$pe = this._largeValues.peek()) == null ? void 0 : _this$_largeValues$pe.value;
185
+ var _item2;
186
+ var stack = [];
187
+ var item;
188
+ while ((item = this._getMaxItem()) && assertThresholdNumber((_item = item) == null ? void 0 : _item.value)) {
189
+ var _item;
190
+ stack.push(item);
191
+ this._largeValues.pop();
192
+ }
193
+ var stackItem;
194
+ while (stackItem = stack.pop()) {
195
+ this._largeValues.push(stackItem);
196
+ }
197
+ return (_item2 = item) == null ? void 0 : _item2.value;
198
+ };
199
+ _proto.getMinValue = function getMinValue() {
200
+ var _item4;
201
+ var stack = [];
202
+ var item;
203
+ while ((item = this._getMinItem()) && assertThresholdNumber((_item3 = item) == null ? void 0 : _item3.value)) {
204
+ var _item3;
205
+ stack.push(item);
206
+ this._smallValues.pop();
207
+ }
208
+ var stackItem;
209
+ while (stackItem = stack.pop()) {
210
+ this._smallValues.push(stackItem);
211
+ }
212
+ return (_item4 = item) == null ? void 0 : _item4.value;
213
+ };
214
+ _proto._push = function _push(heap, item) {
215
+ heap.push(item);
175
216
  };
176
217
  _proto.getFliedPosition = function getFliedPosition(newIndex, safeRange) {
177
218
  if (this._isOnTheFlyFull) {
@@ -232,9 +273,9 @@ var IntegerBufferSet = /*#__PURE__*/function () {
232
273
  return this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(newIndex));
233
274
  }
234
275
  var indexToReplace;
235
- var minValue = this._smallValues.peek().value;
236
- var maxValue = this._largeValues.peek().value;
237
- if (maxValue > thresholdNumber) {
276
+ var minValue = this._getMinValue();
277
+ var maxValue = this._getMaxValue();
278
+ if (assertThresholdNumber(maxValue)) {
238
279
  indexToReplace = maxValue;
239
280
  this._largeValues.pop();
240
281
  var _replacedMeta = this._indexToMetaMap.get(indexToReplace);
@@ -348,16 +389,16 @@ var IntegerBufferSet = /*#__PURE__*/function () {
348
389
  for (var idx = 0; idx < indices.length; idx++) {
349
390
  var meta = fallback ? this._onTheFlyIndices[idx] : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
350
391
  var targetIndex = this.getMetaIndex(meta);
351
- if (!this.isThresholdMeta(meta) && meta != this.getIndexMeta(targetIndex) && !retry) {
392
+ if (!assertThresholdNumber(meta) && meta != this.getIndexMeta(targetIndex) && !retry) {
352
393
  return this.shuffle(options);
353
394
  }
354
- if (meta != null && !this.isThresholdMeta(meta)) {
355
- var element = {
395
+ if (meta != null && !assertThresholdNumber(meta)) {
396
+ var item = {
356
397
  position: idx,
357
398
  value: targetIndex
358
399
  };
359
- smallValues.push(element);
360
- largeValues.push(element);
400
+ this._push(smallValues, item);
401
+ this._push(largeValues, item);
361
402
  metaToPositionMap.set(meta, idx);
362
403
  indexToMetaMap.set(targetIndex, meta);
363
404
  metaToIndexMap.set(meta, targetIndex);
@@ -388,12 +429,12 @@ var IntegerBufferSet = /*#__PURE__*/function () {
388
429
  }
389
430
  };
390
431
  _proto._pushToHeaps = function _pushToHeaps(position, value) {
391
- var element = {
432
+ var item = {
392
433
  position: position,
393
434
  value: value
394
435
  };
395
- this._smallValues.push(element);
396
- this._largeValues.push(element);
436
+ this._push(this._smallValues, item);
437
+ this._push(this._largeValues, item);
397
438
  };
398
439
  _proto._setMetaPosition = function _setMetaPosition(meta, position) {
399
440
  this._positionToMetaList[position] = meta;
@@ -454,15 +495,15 @@ var IntegerBufferSet = /*#__PURE__*/function () {
454
495
  for (var position = 0; position < this._positionToMetaList.length; position++) {
455
496
  var meta = this._positionToMetaList[position];
456
497
  var value = this.getMetaIndex(meta);
457
- if (!meta || value === -1 || value == null) {
498
+ if (meta == null || value === -1 || value == null) {
458
499
  value = Number.MAX_SAFE_INTEGER - position;
459
500
  }
460
- var element = {
501
+ var item = {
461
502
  position: position,
462
503
  value: value
463
504
  };
464
- smallValues.push(element);
465
- largeValues.push(element);
505
+ this._push(smallValues, item);
506
+ this._push(largeValues, item);
466
507
  if (value > thresholdNumber) {
467
508
  this._setMetaPosition(value, position);
468
509
  this._setMetaIndex(value, value);
@@ -1 +1 @@
1
- {"version":3,"file":"integer-buffer-set.esm.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 try {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n } catch (err) {\n return null;\n }\n }\n\n getMetaIndex(meta: Meta) {\n try {\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 } catch (err) {\n return -1;\n }\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) != null\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\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(options: { retry: boolean; fallback: boolean }) {\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 ...options,\n retry: true,\n });\n }\n\n // key point: `meta` should be preserved..\n getIndices(\n options = {\n retry: false,\n fallback: false,\n }\n ) {\n try {\n const { retry, fallback } = options;\n const { smallValues, largeValues } = this.initialize();\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = fallback\n ? this._onTheFlyIndices[idx]\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 !retry\n ) {\n return this.shuffle(options);\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 indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\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 this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this.getIndices({\n ...options,\n fallback: true,\n });\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","err","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","process","env","NODE_ENV","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","options","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","_ret","positionToMetaList","shift","getIndices","_extends","retry","fallback","_options","_this$initialize","metaToPositionMap","element","recyclerKey","map","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","lhs","rhs","_createClass","key"],"mappings":"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"}
1
+ {"version":3,"file":"integer-buffer-set.esm.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;\nconst assertThresholdNumber = (val: any) =>\n typeof val === 'number' && val > thresholdNumber;\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 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 try {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n } catch (err) {\n return null;\n }\n }\n\n getMetaIndex(meta: Meta) {\n try {\n if (meta == null) return -1;\n if (assertThresholdNumber(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n } catch (err) {\n return -1;\n }\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 _peek(heap: Heap) {\n return heap.peek();\n }\n\n _getMaxItem() {\n return this._peek(this._largeValues);\n }\n\n _getMinItem() {\n return this._peek(this._smallValues);\n }\n\n _getMinValue() {\n return this._peek(this._smallValues)?.value;\n }\n\n _getMaxValue() {\n return this._peek(this._largeValues)?.value;\n }\n\n // should omit thresholdNumber\n getMaxValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMaxItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._largeValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._largeValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n getMinValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMinItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._smallValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._smallValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n _push(heap: Heap, item: HeapItem) {\n heap.push(item);\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) != null\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 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._getMinValue();\n const maxValue = this._getMaxValue();\n\n if (assertThresholdNumber(maxValue)) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\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(options: { retry: boolean; fallback: boolean }) {\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 ...options,\n retry: true,\n });\n }\n\n // key point: `meta` should be preserved..\n getIndices(\n options = {\n retry: false,\n fallback: false,\n }\n ) {\n try {\n const { retry, fallback } = options;\n const { smallValues, largeValues } = this.initialize();\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = fallback\n ? this._onTheFlyIndices[idx]\n : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one item has been deleted\n if (\n !assertThresholdNumber(meta) &&\n meta != this.getIndexMeta(targetIndex) &&\n !retry\n ) {\n return this.shuffle(options);\n }\n if (meta != null && !assertThresholdNumber(meta)) {\n const item = { position: idx, value: targetIndex };\n this._push(smallValues, item);\n this._push(largeValues, item);\n metaToPositionMap.set(meta, idx);\n indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\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 this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this.getIndices({\n ...options,\n fallback: true,\n });\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 item = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._push(this._smallValues, item);\n this._push(this._largeValues, item);\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 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 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 // 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 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 if (meta == null || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const item = { position, value };\n this._push(smallValues, item);\n this._push(largeValues, item);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\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","assertThresholdNumber","val","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","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","meta","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","err","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","process","env","NODE_ENV","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","_peek","heap","peek","_getMaxItem","_getMinItem","_getMinValue","_this$_peek","_getMaxValue","_this$_peek2","getMaxValue","stack","item","_item","push","pop","stackItem","_item2","getMinValue","_item3","_item4","_push","getFliedPosition","newIndex","getPosition","prepare","metaPosition","position","indexMeta","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","replacedMeta","Math","abs","lowValue","highValue","shuffle","options","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","_ret","positionToMetaList","shift","getIndices","_extends","retry","fallback","_options","_this$initialize","metaToPositionMap","recyclerKey","map","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","lhs","rhs","_createClass","key"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x-oasis/integer-buffer-set",
3
- "version": "0.1.28",
3
+ "version": "0.1.29",
4
4
  "description": "IntegerBufferSet function",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -16,7 +16,7 @@
16
16
  "tsdx": "^0.14.1"
17
17
  },
18
18
  "dependencies": {
19
- "@x-oasis/heap": "0.1.28",
19
+ "@x-oasis/heap": "0.1.29",
20
20
  "@x-oasis/invariant": "^0.1.19",
21
21
  "@x-oasis/is-clamped": "^0.1.19",
22
22
  "@x-oasis/return-hook": "^0.1.19"
package/src/index.ts CHANGED
@@ -16,6 +16,8 @@ import {
16
16
  const defaultMetaExtractor = (value) => value;
17
17
  export const defaultBufferSize = 10;
18
18
  const thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;
19
+ const assertThresholdNumber = (val: any) =>
20
+ typeof val === 'number' && val > thresholdNumber;
19
21
 
20
22
  // !!!!! should do meta validation...meta should has an index...
21
23
  // value: original data `index` value
@@ -98,11 +100,6 @@ class IntegerBufferSet<Meta = any> {
98
100
  return this._bufferSize;
99
101
  }
100
102
 
101
- isThresholdMeta(meta) {
102
- if (typeof meta === 'number' && meta > thresholdNumber) return true;
103
- return false;
104
- }
105
-
106
103
  setIsOnTheFlyFull(val: any) {
107
104
  if (val != null) {
108
105
  const data = this._onTheFlyIndices.filter((v) => v != null);
@@ -151,7 +148,7 @@ class IntegerBufferSet<Meta = any> {
151
148
  getMetaIndex(meta: Meta) {
152
149
  try {
153
150
  if (meta == null) return -1;
154
- if (this.isThresholdMeta(meta)) return -1;
151
+ if (assertThresholdNumber(meta)) return -1;
155
152
  if (this._indexExtractor) return this._indexExtractor(meta);
156
153
  return this._metaToIndexMap.get(meta);
157
154
  } catch (err) {
@@ -196,12 +193,63 @@ class IntegerBufferSet<Meta = any> {
196
193
  return newPosition;
197
194
  }
198
195
 
199
- getMinValue() {
200
- return this._smallValues.peek()?.value;
196
+ _peek(heap: Heap) {
197
+ return heap.peek();
198
+ }
199
+
200
+ _getMaxItem() {
201
+ return this._peek(this._largeValues);
202
+ }
203
+
204
+ _getMinItem() {
205
+ return this._peek(this._smallValues);
206
+ }
207
+
208
+ _getMinValue() {
209
+ return this._peek(this._smallValues)?.value;
201
210
  }
202
211
 
212
+ _getMaxValue() {
213
+ return this._peek(this._largeValues)?.value;
214
+ }
215
+
216
+ // should omit thresholdNumber
203
217
  getMaxValue() {
204
- return this._largeValues.peek()?.value;
218
+ const stack = [];
219
+ let item;
220
+
221
+ while ((item = this._getMaxItem()) && assertThresholdNumber(item?.value)) {
222
+ stack.push(item);
223
+ this._largeValues.pop();
224
+ }
225
+
226
+ let stackItem;
227
+ while ((stackItem = stack.pop())) {
228
+ this._largeValues.push(stackItem);
229
+ }
230
+
231
+ return item?.value;
232
+ }
233
+
234
+ getMinValue() {
235
+ const stack = [];
236
+ let item;
237
+
238
+ while ((item = this._getMinItem()) && assertThresholdNumber(item?.value)) {
239
+ stack.push(item);
240
+ this._smallValues.pop();
241
+ }
242
+
243
+ let stackItem;
244
+ while ((stackItem = stack.pop())) {
245
+ this._smallValues.push(stackItem);
246
+ }
247
+
248
+ return item?.value;
249
+ }
250
+
251
+ _push(heap: Heap, item: HeapItem) {
252
+ heap.push(item);
205
253
  }
206
254
 
207
255
  getFliedPosition(newIndex: number, safeRange: SafeRange) {
@@ -276,7 +324,6 @@ class IntegerBufferSet<Meta = any> {
276
324
  });
277
325
  } else {
278
326
  this._cleanHeaps();
279
- // console.log('commeit ---')
280
327
  position = this.commitPosition({
281
328
  newIndex,
282
329
  meta,
@@ -333,11 +380,10 @@ class IntegerBufferSet<Meta = any> {
333
380
 
334
381
  let indexToReplace;
335
382
 
336
- const minValue = this._smallValues.peek()!.value;
337
- const maxValue = this._largeValues.peek()!.value;
383
+ const minValue = this._getMinValue();
384
+ const maxValue = this._getMaxValue();
338
385
 
339
- // console.log('mathc ', maxValue, maxValue > thresholdNumber)
340
- if (maxValue > thresholdNumber) {
386
+ if (assertThresholdNumber(maxValue)) {
341
387
  indexToReplace = maxValue;
342
388
  this._largeValues.pop();
343
389
  const replacedMeta = this._indexToMetaMap.get(indexToReplace);
@@ -481,18 +527,18 @@ class IntegerBufferSet<Meta = any> {
481
527
  ? this._onTheFlyIndices[idx]
482
528
  : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
483
529
  const targetIndex = this.getMetaIndex(meta);
484
- // which means source data has changed. such as one element has been deleted
530
+ // which means source data has changed. such as one item has been deleted
485
531
  if (
486
- !this.isThresholdMeta(meta) &&
532
+ !assertThresholdNumber(meta) &&
487
533
  meta != this.getIndexMeta(targetIndex) &&
488
534
  !retry
489
535
  ) {
490
536
  return this.shuffle(options);
491
537
  }
492
- if (meta != null && !this.isThresholdMeta(meta)) {
493
- const element = { position: idx, value: targetIndex };
494
- smallValues.push(element);
495
- largeValues.push(element);
538
+ if (meta != null && !assertThresholdNumber(meta)) {
539
+ const item = { position: idx, value: targetIndex };
540
+ this._push(smallValues, item);
541
+ this._push(largeValues, item);
496
542
  metaToPositionMap.set(meta, idx);
497
543
  indexToMetaMap.set(targetIndex, meta);
498
544
  metaToIndexMap.set(meta, targetIndex);
@@ -525,10 +571,10 @@ class IntegerBufferSet<Meta = any> {
525
571
  }
526
572
 
527
573
  _pushToHeaps(position: number, value: number) {
528
- const element = { position, value };
574
+ const item = { position, value };
529
575
  // We can reuse the same object in both heaps, because we don't mutate them
530
- this._smallValues.push(element);
531
- this._largeValues.push(element);
576
+ this._push(this._smallValues, item);
577
+ this._push(this._largeValues, item);
532
578
  }
533
579
 
534
580
  _setMetaPosition(meta: Meta, position: number) {
@@ -549,8 +595,6 @@ class IntegerBufferSet<Meta = any> {
549
595
  const onTheFlyPositionMeta = this._onTheFlyIndices[position];
550
596
  let positionToReplace = position;
551
597
 
552
- // console.log('position ', newIndex, position);
553
-
554
598
  if (onTheFlyPositionMeta) {
555
599
  // such as place item 11 twice...
556
600
  if (onTheFlyPositionMeta === meta) return position;
@@ -602,11 +646,6 @@ class IntegerBufferSet<Meta = any> {
602
646
  }
603
647
 
604
648
  _cleanHeaps() {
605
- // We not usually only remove object from one heap while moving value.
606
- // Here we make sure that there is no stale data on top of heaps.
607
- // this._cleanHeap(this._smallValues);
608
- // this._cleanHeap(this._largeValues);
609
-
610
649
  for (let idx = 0; idx < this._positionToMetaList.length; idx++) {
611
650
  if (this._positionToMetaList[idx] == null) {
612
651
  this._recreateHeaps();
@@ -622,6 +661,8 @@ class IntegerBufferSet<Meta = any> {
622
661
  this._smallValues.size(),
623
662
  this._largeValues.size()
624
663
  );
664
+ // We not usually only remove object from one heap while moving value.
665
+ // Here we make sure that there is no stale data on top of heaps.
625
666
  if (maxHeapSize > 10 * minHeapSize) {
626
667
  // There are many old values in one of heaps. We need to get rid of them
627
668
  // to not use too avoid memory leaks
@@ -637,14 +678,13 @@ class IntegerBufferSet<Meta = any> {
637
678
  ) {
638
679
  const meta = this._positionToMetaList[position];
639
680
  let value = this.getMetaIndex(meta);
640
-
641
- if (!meta || value === -1 || value == null) {
681
+ if (meta == null || value === -1 || value == null) {
642
682
  value = Number.MAX_SAFE_INTEGER - position;
643
683
  }
644
684
 
645
- const element = { position, value };
646
- smallValues.push(element);
647
- largeValues.push(element);
685
+ const item = { position, value };
686
+ this._push(smallValues, item);
687
+ this._push(largeValues, item);
648
688
  if (value > thresholdNumber) {
649
689
  // @ts-ignore
650
690
  this._setMetaPosition(value, position);
@@ -652,25 +692,10 @@ class IntegerBufferSet<Meta = any> {
652
692
  this._setMetaIndex(value, value);
653
693
  }
654
694
  }
655
-
656
- // this._largeValues.peek().value;
657
-
658
695
  this._smallValues = smallValues;
659
696
  this._largeValues = largeValues;
660
697
  }
661
698
 
662
- // _cleanHeap(heap: Heap<HeapItem>) {
663
- // while (
664
- // !heap.empty() &&
665
- // this._metaToPositionMap.get(
666
- // this._indexToMetaMap.get(heap.peek()!.value)
667
- // ) == null
668
- // ) {
669
- // console.log('pop ---', heap.peek()!.value);
670
- // heap.pop();
671
- // }
672
- // }
673
-
674
699
  _smallerComparator(lhs: HeapItem, rhs: HeapItem) {
675
700
  return lhs.value < rhs.value;
676
701
  }