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

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
@@ -47,8 +47,14 @@ declare class IntegerBufferSet<Meta = any> {
47
47
  startIndex: number;
48
48
  endIndex: number;
49
49
  }): any;
50
- shuffle(): any;
51
- getIndices(): any;
50
+ shuffle(options: {
51
+ retry: boolean;
52
+ fallback: boolean;
53
+ }): any;
54
+ getIndices(options?: {
55
+ retry: boolean;
56
+ fallback: boolean;
57
+ }): any;
52
58
  _pushToHeaps(position: number, value: number): void;
53
59
  _setMetaPosition(meta: Meta, position: number): void;
54
60
  commitPosition(props: {
@@ -26,6 +26,20 @@ function _createClass(Constructor, protoProps, staticProps) {
26
26
  });
27
27
  return Constructor;
28
28
  }
29
+ function _extends() {
30
+ _extends = Object.assign ? Object.assign.bind() : function (target) {
31
+ for (var i = 1; i < arguments.length; i++) {
32
+ var source = arguments[i];
33
+ for (var key in source) {
34
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
35
+ target[key] = source[key];
36
+ }
37
+ }
38
+ }
39
+ return target;
40
+ };
41
+ return _extends.apply(this, arguments);
42
+ }
29
43
  function _toPrimitive(input, hint) {
30
44
  if (typeof input !== "object" || input === null) return input;
31
45
  var prim = input[Symbol.toPrimitive];
@@ -113,14 +127,22 @@ var IntegerBufferSet = /*#__PURE__*/function () {
113
127
  };
114
128
  };
115
129
  _proto.getIndexMeta = function getIndexMeta(index) {
116
- if (index == null || index < 0) return null;
117
- return this._metaExtractor(index);
130
+ try {
131
+ if (index == null || index < 0) return null;
132
+ return this._metaExtractor(index);
133
+ } catch (err) {
134
+ return null;
135
+ }
118
136
  };
119
137
  _proto.getMetaIndex = function getMetaIndex(meta) {
120
- if (meta == null) return -1;
121
- if (this.isThresholdMeta(meta)) return -1;
122
- if (this._indexExtractor) return this._indexExtractor(meta);
123
- return this._metaToIndexMap.get(meta);
138
+ try {
139
+ if (meta == null) return -1;
140
+ if (this.isThresholdMeta(meta)) return -1;
141
+ if (this._indexExtractor) return this._indexExtractor(meta);
142
+ return this._metaToIndexMap.get(meta);
143
+ } catch (err) {
144
+ return -1;
145
+ }
124
146
  };
125
147
  _proto.setMetaIndex = function setMetaIndex(meta, index) {
126
148
  if (!this._indexExtractor) {
@@ -181,7 +203,7 @@ var IntegerBufferSet = /*#__PURE__*/function () {
181
203
  position = this.getNewPositionForIndex(newIndex);
182
204
  } else if (this._isOnTheFlyFull) {
183
205
  position = this.getFliedPosition(newIndex, safeRange);
184
- } else if ((indexMeta = this._indexToMetaMap.get(newIndex)) && this._metaToPositionMap.get(indexMeta)) {
206
+ } else if ((indexMeta = this._indexToMetaMap.get(newIndex)) && this._metaToPositionMap.get(indexMeta) != null) {
185
207
  position = this.commitPosition({
186
208
  newIndex: newIndex,
187
209
  meta: meta,
@@ -258,7 +280,7 @@ var IntegerBufferSet = /*#__PURE__*/function () {
258
280
  var position = this._metaToPositionMap.get(replacedMeta);
259
281
  return position;
260
282
  };
261
- _proto.shuffle = function shuffle() {
283
+ _proto.shuffle = function shuffle(options) {
262
284
  var _this = this;
263
285
  var indices = new Array(this.bufferSize);
264
286
  for (var idx = 0; idx < indices.length; idx++) {
@@ -307,22 +329,33 @@ var IntegerBufferSet = /*#__PURE__*/function () {
307
329
  }
308
330
  }
309
331
  this._positionToMetaList = positionToMetaList;
310
- return this.getIndices();
332
+ return this.getIndices(_extends({}, options, {
333
+ retry: true
334
+ }));
311
335
  };
312
- _proto.getIndices = function getIndices() {
313
- var _this$initialize = this.initialize(),
314
- smallValues = _this$initialize.smallValues,
315
- largeValues = _this$initialize.largeValues;
336
+ _proto.getIndices = function getIndices(options) {
337
+ if (options === void 0) {
338
+ options = {
339
+ retry: false,
340
+ fallback: false
341
+ };
342
+ }
316
343
  try {
344
+ var _options = options,
345
+ retry = _options.retry,
346
+ fallback = _options.fallback;
347
+ var _this$initialize = this.initialize(),
348
+ smallValues = _this$initialize.smallValues,
349
+ largeValues = _this$initialize.largeValues;
317
350
  var indices = new Array(this._positionToMetaList.length);
318
351
  var metaToPositionMap = new Map();
319
352
  var indexToMetaMap = new Map();
320
353
  var metaToIndexMap = new Map();
321
354
  for (var idx = 0; idx < indices.length; idx++) {
322
- var meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
355
+ var meta = fallback ? this._onTheFlyIndices[idx] : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
323
356
  var targetIndex = this.getMetaIndex(meta);
324
- if (!this.isThresholdMeta(meta) && meta != this.getIndexMeta(targetIndex)) {
325
- return this.shuffle();
357
+ if (!this.isThresholdMeta(meta) && meta != this.getIndexMeta(targetIndex) && !retry) {
358
+ return this.shuffle(options);
326
359
  }
327
360
  if (meta != null && !this.isThresholdMeta(meta)) {
328
361
  var element = {
@@ -353,7 +386,9 @@ var IntegerBufferSet = /*#__PURE__*/function () {
353
386
  return indices;
354
387
  } catch (err) {
355
388
  console.log('err ', err);
356
- return this._positionToMetaList;
389
+ return this.getIndices(_extends({}, options, {
390
+ fallback: true
391
+ }));
357
392
  } finally {
358
393
  this.readyToStartNextLoop();
359
394
  }
@@ -439,7 +474,6 @@ var IntegerBufferSet = /*#__PURE__*/function () {
439
474
  this._setMetaIndex(value, value);
440
475
  }
441
476
  }
442
- this._largeValues.peek().value;
443
477
  this._smallValues = smallValues;
444
478
  this._largeValues = largeValues;
445
479
  };
@@ -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 if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n }\n\n getMetaIndex(meta: Meta) {\n if (meta == null) return -1;\n if (this.isThresholdMeta(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n getMinValue() {\n return this._smallValues.peek()?.value;\n }\n\n getMaxValue() {\n return this._largeValues.peek()?.value;\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta)\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n // console.log('commeit ---')\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._smallValues.peek()!.value;\n const maxValue = this._largeValues.peek()!.value;\n\n // console.log('mathc ', maxValue, maxValue > thresholdNumber)\n if (maxValue > thresholdNumber) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle() {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices();\n }\n\n // key point: `meta` should be preserved..\n getIndices() {\n const { smallValues, largeValues } = this.initialize();\n\n try {\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta =\n this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one element has been deleted\n if (\n !this.isThresholdMeta(meta) &&\n meta != this.getIndexMeta(targetIndex)\n ) {\n return this.shuffle();\n }\n if (meta != null && !this.isThresholdMeta(meta)) {\n const element = { position: idx, value: targetIndex };\n smallValues.push(element);\n largeValues.push(element);\n metaToPositionMap.set(meta, idx);\n 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._positionToMetaList;\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const element = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._smallValues.push(element);\n this._largeValues.push(element);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n // console.log('position ', newIndex, position);\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n // this._cleanHeap(this._smallValues);\n // this._cleanHeap(this._largeValues);\n\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n\n if (!meta || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const element = { position, value };\n smallValues.push(element);\n largeValues.push(element);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n\n this._largeValues.peek().value;\n\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n // _cleanHeap(heap: Heap<HeapItem>) {\n // while (\n // !heap.empty() &&\n // this._metaToPositionMap.get(\n // this._indexToMetaMap.get(heap.peek()!.value)\n // ) == null\n // ) {\n // console.log('pop ---', heap.peek()!.value);\n // heap.pop();\n // }\n // }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","defaultBufferSize","thresholdNumber","Number","MAX_SAFE_INTEGER","IntegerBufferSet","props","_props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","isThresholdMeta","meta","val","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","getMinValue","_this$_smallValues$pe","peek","getMaxValue","_this$_largeValues$pe","getFliedPosition","newIndex","getPosition","prepare","metaPosition","position","indexMeta","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","pop","replacedMeta","Math","abs","lowValue","highValue","shuffle","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","_ret","positionToMetaList","shift","getIndices","_this$initialize","metaToPositionMap","element","recyclerKey","map","err","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","lhs","rhs","_createClass","key"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,IAAMA,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAIC,KAAK;EAAA,OAAKA,KAAK;AAAA;IAChCC,iBAAiB,GAAG;AACjC,IAAMC,eAAe,GAAGC,MAAM,CAACC,gBAAgB,GAAG,MAAM;AAAC,IAmBnDC,gBAAgB;EAsBpB,SAAAA,iBAAYC;QAAAA;MAAAA,QAAqC,EAAE;;IACjD,IAAAC,MAAA,GAKID,KAAK;MAAAE,WAAA,GAAAD,MAAA,CAJPE,IAAI;MAAJA,IAAI,GAAAD,WAAA,cAAG,gBAAgB,GAAAA,WAAA;MACvBE,cAAc,GAAAH,MAAA,CAAdG,cAAc;MAAAC,iBAAA,GAAAJ,MAAA,CACdK,UAAU;MAAVA,UAAU,GAAAD,iBAAA,cAAGV,iBAAiB,GAAAU,iBAAA;MAAAE,oBAAA,GAAAN,MAAA,CAC9BO,aAAa;MAAbA,aAAa,GAAAD,oBAAA,cAAGd,oBAAoB,GAAAc,oBAAA;IAEtC,IAAI,CAACE,cAAc,GAAGD,aAAa;IACnC,IAAI,CAACE,eAAe,GAAGN,cAAc;IAErC,IAAI,CAACO,KAAK,GAAGR,IAAI;IAKjB,IAAI,CAACS,eAAe,GAAG,IAAIC,GAAG,EAAE;IAChC,IAAI,CAACC,kBAAkB,GAAG,IAAID,GAAG,EAAE;IACnC,IAAI,CAACE,mBAAmB,GAAG,EAAE;IAC7B,IAAI,CAACC,eAAe,GAAG,IAAIH,GAAG,EAAE;IAChC,IAAI,CAACI,gBAAgB,GAAG,EAAE;IAE1B,IAAI,CAACC,WAAW,GAAGZ,UAAU;IAE7B,IAAI,CAACa,YAAY,GAAG,IAAIC,IAAI,CAAC,EAAE,EAAE,IAAI,CAACC,kBAAkB,CAAC;IACzD,IAAI,CAACC,YAAY,GAAG,IAAIF,IAAI,CAAC,EAAE,EAAE,IAAI,CAACG,kBAAkB,CAAC;IAEzD,IAAI,CAACC,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACC,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACC,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACD,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACE,4BAA4B,GAC/B,IAAI,CAACA,4BAA4B,CAACF,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACG,yBAAyB,GAAGC,UAAU,CACzC,IAAI,CAACC,iBAAiB,CAACL,IAAI,CAAC,IAAI,CAAC,CAClC;IAED,IAAI,CAACM,OAAO,GAAGC,IAAI,CAACC,GAAG,EAAE;IACzB,IAAI,CAACC,cAAc,GAAG,IAAI,CAACH,OAAO;;EACnC,IAAAI,MAAA,GAAApC,gBAAA,CAAAqC,SAAA;EAAAD,MAAA,CAMDE,eAAe,GAAf,SAAAA,gBAAgBC,IAAI;IAClB,IAAI,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,GAAG1C,eAAe,EAAE,OAAO,IAAI;IACnE,OAAO,KAAK;GACb;EAAAuC,MAAA,CAEDL,iBAAiB,GAAjB,SAAAA,kBAAkBS,GAAQ;IACxB,IAAIA,GAAG,IAAI,IAAI,EAAE;MACf,IAAMC,IAAI,GAAG,IAAI,CAACvB,gBAAgB,CAACwB,MAAM,CAAC,UAACC,CAAC;QAAA,OAAKA,CAAC,IAAI,IAAI;QAAC;MAC3D,IAAI,CAACC,eAAe,GAAGH,IAAI,CAACI,MAAM,KAAK,IAAI,CAAC1B,WAAW;;GAG1D;EAAAiB,MAAA,CAEDU,eAAe,GAAf,SAAAA;IACE,IAAI,CAACF,eAAe,GAAG,KAAK;IAC5B,IAAI,CAAC1B,gBAAgB,GAAG,EAAE;GAC3B;EAAAkB,MAAA,CAMDW,6BAA6B,GAA7B,SAAAA,8BAA8BC,SAAoB;IAChD,IAAQC,UAAU,GAAeD,SAAS,CAAlCC,UAAU;MAAEC,QAAQ,GAAKF,SAAS,CAAtBE,QAAQ;IAC5B,KAAK,IAAIC,GAAG,GAAG,CAAC,EAAEA,GAAG,GAAG,IAAI,CAACjC,gBAAgB,CAAC2B,MAAM,EAAEM,GAAG,EAAE,EAAE;MAC3D,IAAMZ,IAAI,GAAG,IAAI,CAACrB,gBAAgB,CAACiC,GAAG,CAAC;MACvC,IAAMC,SAAS,GAAG,IAAI,CAACC,YAAY,CAACd,IAAI,CAAC;MACzC,IAAI,CAACe,SAAS,CAACL,UAAU,EAAEG,SAAS,EAAEF,QAAQ,CAAC,EAAE;QAC/C,OAAOC,GAAG;;;IAGd,OAAO,IAAI;GACZ;EAAAf,MAAA,CAEDmB,UAAU,GAAV,SAAAA;IACE,OAAO;MACLC,WAAW,EAAE,IAAInC,IAAI,CAAC,EAAE,EAAE,IAAI,CAACC,kBAAkB,CAAC;MAClDmC,WAAW,EAAE,IAAIpC,IAAI,CAAC,EAAE,EAAE,IAAI,CAACG,kBAAkB;KAClD;GACF;EAAAY,MAAA,CAEDsB,YAAY,GAAZ,SAAAA,aAAaC,KAAa;IACxB,IAAIA,KAAK,IAAI,IAAI,IAAIA,KAAK,GAAG,CAAC,EAAE,OAAO,IAAI;IAC3C,OAAO,IAAI,CAACjD,cAAc,CAACiD,KAAK,CAAC;GAClC;EAAAvB,MAAA,CAEDiB,YAAY,GAAZ,SAAAA,aAAad,IAAU;IACrB,IAAIA,IAAI,IAAI,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3B,IAAI,IAAI,CAACD,eAAe,CAACC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,IAAI,IAAI,CAAC5B,eAAe,EAAE,OAAO,IAAI,CAACA,eAAe,CAAC4B,IAAI,CAAC;IAC3D,OAAO,IAAI,CAACtB,eAAe,CAAC2C,GAAG,CAACrB,IAAI,CAAC;GACtC;EAAAH,MAAA,CAEDyB,YAAY,GAAZ,SAAAA,aAAatB,IAAU,EAAEoB,KAAa;IACpC,IAAI,CAAC,IAAI,CAAChD,eAAe,EAAE;MACzB,OAAO,IAAI,CAACM,eAAe,CAAC6C,GAAG,CAACvB,IAAI,EAAEoB,KAAK,CAAC;;IAE9C,OAAO,KAAK;GACb;EAAAvB,MAAA,CAED2B,eAAe,GAAf,SAAAA,gBAAgBxB,IAAU;IACxB,OAAO,IAAI,CAACtB,eAAe,UAAO,CAACsB,IAAI,CAAC;GACzC;EAAAH,MAAA,CAED4B,qBAAqB,GAArB,SAAAA,sBAAsBC,iBAAuC;IAC3D,IAAI,CAAC,IAAI,CAACtD,eAAe,EAAE;MACzB,OAAQ,IAAI,CAACM,eAAe,GAAGgD,iBAAiB;;IAElD,OAAO,KAAK;GACb;EAAA7B,MAAA,CAEDT,gBAAgB,GAAhB,SAAAA,iBAAiBgC,KAAa;IAC5B,OAAO,IAAI,CAACN,YAAY,CAAC,IAAI,CAACK,YAAY,CAACC,KAAK,CAAC,CAAC;GACnD;EAAAvB,MAAA,CAEDX,sBAAsB,GAAtB,SAAAA,uBAAuBkC,KAAa;IAClC,IAAMpB,IAAI,GAAG,IAAI,CAACmB,YAAY,CAACC,KAAK,CAAC;IACrC,EACE,IAAI,CAAC5C,kBAAkB,CAAC6C,GAAG,CAACrB,IAAI,CAAC,KAAK2B,SAAS,KADjDC,SAAS,QAEP,0EAA0E;IAE5E,IAAMC,WAAW,GAAG,IAAI,CAACpD,mBAAmB,CAAC6B,MAAM;IAEnD,IAAI,CAACwB,YAAY,CAACD,WAAW,EAAET,KAAK,CAAC;IACrC,IAAI,CAACW,aAAa,CAAC/B,IAAI,EAAEoB,KAAK,CAAC;IAC/B,IAAI,CAACY,gBAAgB,CAAChC,IAAI,EAAE6B,WAAW,CAAC;IAExC,OAAOA,WAAW;GACnB;EAAAhC,MAAA,CAEDoC,WAAW,GAAX,SAAAA;;IACE,QAAAC,qBAAA,GAAO,IAAI,CAACrD,YAAY,CAACsD,IAAI,EAAE,qBAAxBD,qBAAA,CAA0B9E,KAAK;GACvC;EAAAyC,MAAA,CAEDuC,WAAW,GAAX,SAAAA;;IACE,QAAAC,qBAAA,GAAO,IAAI,CAACrD,YAAY,CAACmD,IAAI,EAAE,qBAAxBE,qBAAA,CAA0BjF,KAAK;GACvC;EAAAyC,MAAA,CAEDyC,gBAAgB,GAAhB,SAAAA,iBAAiBC,QAAgB,EAAE9B,SAAoB;IACrD,IAAI,IAAI,CAACJ,eAAe,EAAE;MAExB,IACEI,SAAS,IACTM,SAAS,CAACN,SAAS,CAACC,UAAU,EAAE6B,QAAQ,EAAE9B,SAAS,CAACE,QAAQ,CAAC,EAC7D;QACA,OAAO,IAAI,CAACH,6BAA6B,CAACC,SAAS,CAAC;;;IAOxD,OAAO,IAAI;GACZ;EAAAZ,MAAA,CAWD2C,WAAW,GAAX,SAAAA,YAAYD,QAAgB,EAAE9B,SAAqB;IACjD,IAAI,CAACgC,OAAO,EAAE;IACd,IAAMzC,IAAI,GAAG,IAAI,CAACmB,YAAY,CAACoB,QAAQ,CAAC;IACxC,IAAMG,YAAY,GAAG,IAAI,CAAClE,kBAAkB,CAAC6C,GAAG,CAACrB,IAAI,CAAC;IACtD,IAAI2C,QAAQ,EAAEC,SAAS;IAavB,IAAIF,YAAY,KAAKf,SAAS,EAAE;MAC9BgB,QAAQ,GAAG,IAAI,CAACE,cAAc,CAAC;QAC7BN,QAAQ,EAARA,QAAQ;QACRvC,IAAI,EAAJA,IAAI;QACJS,SAAS,EAATA,SAAS;QACTkC,QAAQ,EAAED;OACX,CAAC;KACH,MAAM,IAAI,CAAC,IAAI,CAACI,YAAY,EAAE;MAE7BH,QAAQ,GAAG,IAAI,CAACzD,sBAAsB,CAACqD,QAAQ,CAAC;KACjD,MAAM,IAAI,IAAI,CAAClC,eAAe,EAAE;MAC/BsC,QAAQ,GAAG,IAAI,CAACL,gBAAgB,CAACC,QAAQ,EAAE9B,SAAS,CAAC;KACtD,MAAM,IACL,CAACmC,SAAS,GAAG,IAAI,CAACtE,eAAe,CAAC+C,GAAG,CAACkB,QAAQ,CAAC,KAC/C,IAAI,CAAC/D,kBAAkB,CAAC6C,GAAG,CAACuB,SAAS,CAAC,EACtC;MAMAD,QAAQ,GAAG,IAAI,CAACE,cAAc,CAAC;QAC7BN,QAAQ,EAARA,QAAQ;QACRvC,IAAI,EAAJA,IAAI;QACJS,SAAS,EAATA,SAAS;QACTkC,QAAQ,EAAE,IAAI,CAACnE,kBAAkB,CAAC6C,GAAG,CAACuB,SAAS;OAChD,CAAC;KACH,MAAM;MACL,IAAI,CAACG,WAAW,EAAE;MAElBJ,QAAQ,GAAG,IAAI,CAACE,cAAc,CAAC;QAC7BN,QAAQ,EAARA,QAAQ;QACRvC,IAAI,EAAJA,IAAI;QACJS,SAAS,EAATA,SAAS;QACTkC,QAAQ,EAAE,IAAI,CAACK,6BAA6B,CAACT,QAAQ,EAAE9B,SAAS;OACjE,CAAC;;IAKJ,IAAIkC,QAAQ,IAAI,IAAI,EAAE;MACpB,IAAI,CAAChE,gBAAgB,CAACgE,QAAQ,CAAC,GAAG3C,IAAI;MACtC,IAAI,CAAC+B,aAAa,CAAC/B,IAAI,EAAEuC,QAAQ,CAAC;MAClC,IAAI,CAAC/D,kBAAkB,CAAC+C,GAAG,CAACvB,IAAI,EAAE2C,QAAQ,CAAC;MAM3C,OAAO,IAAI,CAACrD,yBAAyB,CAACqD,QAAQ,CAAC;;IAGjD,OAAO,IAAI;GACZ;EAAA9C,MAAA,CAEDR,4BAA4B,GAA5B,SAAAA,6BACEkD,QAAgB,EAChB9B,SAGC;IAED,IAAI,CAAC,IAAI,CAACqC,YAAY,EAAE;MACtB,OAAO,IAAI,CAACxD,yBAAyB,CACnC,IAAI,CAACJ,sBAAsB,CAACqD,QAAQ,CAAC,CACtC;;IAGH,OAAO,IAAI,CAACS,6BAA6B,CAACT,QAAQ,EAAE9B,SAAS,CAAC;GAC/D;EAAAZ,MAAA,CAEDmD,6BAA6B,GAA7B,SAAAA,8BACET,QAAgB,EAChB9B,SAGC;IAED,IAAI,IAAI,CAACzB,YAAY,CAACiE,KAAK,EAAE,IAAI,IAAI,CAACpE,YAAY,CAACoE,KAAK,EAAE,EAAE;MAC1D,OAAO,IAAI,CAAC3D,yBAAyB,CACnC,IAAI,CAACJ,sBAAsB,CAACqD,QAAQ,CAAC,CACtC;;IAGH,IAAIW,cAAc;IAElB,IAAMC,QAAQ,GAAG,IAAI,CAACtE,YAAY,CAACsD,IAAI,EAAG,CAAC/E,KAAK;IAChD,IAAMgG,QAAQ,GAAG,IAAI,CAACpE,YAAY,CAACmD,IAAI,EAAG,CAAC/E,KAAK;IAGhD,IAAIgG,QAAQ,GAAG9F,eAAe,EAAE;MAC9B4F,cAAc,GAAGE,QAAQ;MACzB,IAAI,CAACpE,YAAY,CAACqE,GAAG,EAAE;MACvB,IAAMC,aAAY,GAAG,IAAI,CAAChF,eAAe,CAAC+C,GAAG,CAAC6B,cAAc,CAAC;MAE7D,IAAMP,SAAQ,GAAG,IAAI,CAACnE,kBAAkB,CAAC6C,GAAG,CAACiC,aAAY,CAAC;MAC1D,OAAOX,SAAQ;;IAGjB,IAAI,CAAClC,SAAS,EAAE;MAEd,IAAI8C,IAAI,CAACC,GAAG,CAACjB,QAAQ,GAAGY,QAAQ,CAAC,GAAGI,IAAI,CAACC,GAAG,CAACjB,QAAQ,GAAGa,QAAQ,CAAC,EAAE;QACjEF,cAAc,GAAGC,QAAQ;QACzB,IAAI,CAACtE,YAAY,CAACwE,GAAG,EAAE;OACxB,MAAM;QACLH,cAAc,GAAGE,QAAQ;QACzB,IAAI,CAACpE,YAAY,CAACqE,GAAG,EAAE;;MAEzB,IAAMC,cAAY,GAAG,IAAI,CAAChF,eAAe,CAAC+C,GAAG,CAAC6B,cAAc,CAAC;MAC7D,IAAMP,UAAQ,GAAG,IAAI,CAACnE,kBAAkB,CAAC6C,GAAG,CAACiC,cAAY,CAAC;MAE1D,OAAOX,UAAQ;;IAGjB,IAAoBc,QAAQ,GAA0BhD,SAAS,CAAvDC,UAAU;MAAsBgD,SAAS,GAAKjD,SAAS,CAAjCE,QAAQ;IAGtC,IACEI,SAAS,CAAC0C,QAAQ,EAAEN,QAAQ,EAAEO,SAAS,CAAC,IACxC3C,SAAS,CAAC0C,QAAQ,EAAEL,QAAQ,EAAEM,SAAS,CAAC,EACxC;MACA,OAAO,IAAI;KACZ,MAAM,IACL3C,SAAS,CAAC0C,QAAQ,EAAEN,QAAQ,EAAEO,SAAS,CAAC,IACxC,CAAC3C,SAAS,CAAC0C,QAAQ,EAAEL,QAAQ,EAAEM,SAAS,CAAC,EACzC;MACAR,cAAc,GAAGE,QAAQ;MACzB,IAAI,CAACpE,YAAY,CAACqE,GAAG,EAAE;KACxB,MAAM,IACL,CAACtC,SAAS,CAAC0C,QAAQ,EAAEN,QAAQ,EAAEO,SAAS,CAAC,IACzC3C,SAAS,CAAC0C,QAAQ,EAAEL,QAAQ,EAAEM,SAAS,CAAC,EACxC;MACAR,cAAc,GAAGC,QAAQ;MACzB,IAAI,CAACtE,YAAY,CAACwE,GAAG,EAAE;KACxB,MAAM,IAAII,QAAQ,GAAGN,QAAQ,GAAGC,QAAQ,GAAGM,SAAS,EAAE;MAErDR,cAAc,GAAGC,QAAQ;MACzB,IAAI,CAACtE,YAAY,CAACwE,GAAG,EAAE;KACxB,MAAM;MACLH,cAAc,GAAGE,QAAQ;MACzB,IAAI,CAACpE,YAAY,CAACqE,GAAG,EAAE;;IAGzB,IAAMC,YAAY,GAAG,IAAI,CAAChF,eAAe,CAAC+C,GAAG,CAAC6B,cAAc,CAAC;IAC7D,IAAMP,QAAQ,GAAG,IAAI,CAACnE,kBAAkB,CAAC6C,GAAG,CAACiC,YAAY,CAAC;IAI1D,OAAOX,QAAQ;GAChB;EAAA9C,MAAA,CAED8D,OAAO,GAAP,SAAAA;;IACE,IAAMC,OAAO,GAAG,IAAIC,KAAK,CAAC,IAAI,CAAC7F,UAAU,CAAC;IAC1C,KAAK,IAAI4C,GAAG,GAAG,CAAC,EAAEA,GAAG,GAAGgD,OAAO,CAACtD,MAAM,EAAEM,GAAG,EAAE,EAAE;MAC7C,IAAMZ,IAAI,GAAG,IAAI,CAACrB,gBAAgB,CAACiC,GAAG,CAAC,IAAI,IAAI,CAACnC,mBAAmB,CAACmC,GAAG,CAAC;MAExE,IAAMkD,WAAW,GAAG,IAAI,CAAChD,YAAY,CAACd,IAAI,CAAC;MAC3C4D,OAAO,CAAChD,GAAG,CAAC,GAAGkD,WAAW;;IAU5B,IAAMC,IAAI,GAAG,IAAIF,KAAK,CAACD,OAAO,CAACtD,MAAM,CAAC;IACtC,IAAM0D,UAAU,GAAG,EAAE;IACrB,IAAMC,cAAc,GAAG,IAAI1F,GAAG,EAAE;IAChC,IAAM2F,cAAc,GAAG,IAAI3F,GAAG,EAAE;IAAC,IAAA4F,KAAA,YAAAA,QAEc;MAC7C,IAAMC,YAAY,GAAGR,OAAO,CAAChD,IAAG,CAAC;MACjC,IAAMyD,WAAW,GAAGC,KAAI,CAACnG,cAAc,CAACiG,YAAY,CAAC;MAErD,IAAIC,WAAW,IAAI,IAAI;MACvBJ,cAAc,CAAC1C,GAAG,CAAC6C,YAAY,EAAEC,WAAW,CAAC;MAC7CH,cAAc,CAAC3C,GAAG,CAAC8C,WAAW,EAAED,YAAY,CAAC;MAC7C,IAAIC,WAAW,KAAKC,KAAI,CAAC7F,mBAAmB,CAACmC,IAAG,CAAC,EAAE;QACjDmD,IAAI,CAACnD,IAAG,CAAC,GAAGyD,WAAW;QAAC;;MAG1B,IAAME,EAAE,GAAGD,KAAI,CAAC7F,mBAAmB,CAAC+F,SAAS,CAAC,UAACpE,CAAC;QAAA,OAAKA,CAAC,KAAKiE,WAAW;QAAC;MACvE,IAAIE,EAAE,KAAK,CAAC,CAAC,EAAE;QACbR,IAAI,CAACQ,EAAE,CAAC,GAAGF,WAAW;QAAC;;MAIzBL,UAAU,CAACS,IAAI,CAACJ,WAAW,CAAC;KAC7B;IAlBD,KAAK,IAAIzD,IAAG,GAAG,CAAC,EAAEA,IAAG,GAAGgD,OAAO,CAACtD,MAAM,EAAEM,IAAG,EAAE;MAAA,IAAA8D,IAAA,GAAAP,KAAA;MAAA,IAAAO,IAAA,iBAIlB;;IAgB3B,IAAMC,kBAAkB,GAAG,EAAE;IAC7B,IAAI,CAACrG,eAAe,GAAG2F,cAAc;IACrC,IAAI,CAACxC,qBAAqB,CAACyC,cAAc,CAAC;IAE1C,KAAK,IAAIvB,QAAQ,GAAG,CAAC,EAAEA,QAAQ,GAAGiB,OAAO,CAACtD,MAAM,EAAEqC,QAAQ,EAAE,EAAE;MAC5D,IAAIoB,IAAI,CAACpB,QAAQ,CAAC,IAAI,IAAI,EAAE;QAC1BgC,kBAAkB,CAAChC,QAAQ,CAAC,GAAGoB,IAAI,CAACpB,QAAQ,CAAC;QAC7C;;MAEF,IAAM3C,KAAI,GAAGgE,UAAU,CAACY,KAAK,EAAE;MAC/B,IAAI5E,KAAI,IAAI,IAAI,EAAE;QAChB2E,kBAAkB,CAAChC,QAAQ,CAAC,GAAG3C,KAAI;;;IAIvC,IAAI,CAACvB,mBAAmB,GAAGkG,kBAAkB;IAE7C,OAAO,IAAI,CAACE,UAAU,EAAE;GACzB;EAAAhF,MAAA,CAGDgF,UAAU,GAAV,SAAAA;IACE,IAAAC,gBAAA,GAAqC,IAAI,CAAC9D,UAAU,EAAE;MAA9CC,WAAW,GAAA6D,gBAAA,CAAX7D,WAAW;MAAEC,WAAW,GAAA4D,gBAAA,CAAX5D,WAAW;IAEhC,IAAI;MACF,IAAM0C,OAAO,GAAG,IAAIC,KAAK,CAAC,IAAI,CAACpF,mBAAmB,CAAC6B,MAAM,CAAC;MAC1D,IAAMyE,iBAAiB,GAAG,IAAIxG,GAAG,EAAE;MACnC,IAAM0F,cAAc,GAAG,IAAI1F,GAAG,EAAE;MAChC,IAAM2F,cAAc,GAAG,IAAI3F,GAAG,EAAE;MAChC,KAAK,IAAIqC,GAAG,GAAG,CAAC,EAAEA,GAAG,GAAGgD,OAAO,CAACtD,MAAM,EAAEM,GAAG,EAAE,EAAE;QAC7C,IAAMZ,IAAI,GACR,IAAI,CAACrB,gBAAgB,CAACiC,GAAG,CAAC,IAAI,IAAI,CAACnC,mBAAmB,CAACmC,GAAG,CAAC;QAC7D,IAAMkD,WAAW,GAAG,IAAI,CAAChD,YAAY,CAACd,IAAI,CAAC;QAE3C,IACE,CAAC,IAAI,CAACD,eAAe,CAACC,IAAI,CAAC,IAC3BA,IAAI,IAAI,IAAI,CAACmB,YAAY,CAAC2C,WAAW,CAAC,EACtC;UACA,OAAO,IAAI,CAACH,OAAO,EAAE;;QAEvB,IAAI3D,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAACD,eAAe,CAACC,IAAI,CAAC,EAAE;UAC/C,IAAMgF,OAAO,GAAG;YAAErC,QAAQ,EAAE/B,GAAG;YAAExD,KAAK,EAAE0G;WAAa;UACrD7C,WAAW,CAACwD,IAAI,CAACO,OAAO,CAAC;UACzB9D,WAAW,CAACuD,IAAI,CAACO,OAAO,CAAC;UACzBD,iBAAiB,CAACxD,GAAG,CAACvB,IAAI,EAAEY,GAAG,CAAC;UAChCqD,cAAc,CAAC1C,GAAG,CAACuC,WAAW,EAAE9D,IAAI,CAAC;UACrCkE,cAAc,CAAC3C,GAAG,CAACvB,IAAI,EAAE8D,WAAW,CAAC;UACrCF,OAAO,CAAChD,GAAG,CAAC,GAAG;YACbZ,IAAI,EAAJA,IAAI;YACJ8D,WAAW,EAAXA,WAAW;YACXmB,WAAW,EAAK,IAAI,CAAC5G,KAAK,SAAIuC;WAC/B;;;MAGL,IAAI,CAAC/B,YAAY,GAAGoC,WAAW;MAC/B,IAAI,CAACjC,YAAY,GAAGkC,WAAW;MAC/B,IAAI,CAAC1C,kBAAkB,GAAGuG,iBAAiB;MAC3C,IAAI,CAACtG,mBAAmB,GAAGmF,OAAO,CAACsB,GAAG,CAAC,UAAC9E,CAAC;QAAA,OAAKA,CAAC,oBAADA,CAAC,CAAEJ,IAAI;QAAC;MACtD,IAAI,CAACO,eAAe,EAAE;MACtB,IAAI,CAACjC,eAAe,GAAG2F,cAAc;MACrC,IAAI,CAACxC,qBAAqB,CAACyC,cAAc,CAAC;MAE1C,OAAON,OAAO;KACf,CAAC,OAAOuB,GAAG,EAAE;MACZC,OAAO,CAACC,GAAG,CAAC,MAAM,EAAEF,GAAG,CAAC;MACxB,OAAO,IAAI,CAAC1G,mBAAmB;KAChC,SAAS;MACR,IAAI,CAAC6G,oBAAoB,EAAE;;GAG9B;EAAAzF,MAAA,CAEDiC,YAAY,GAAZ,SAAAA,aAAaa,QAAgB,EAAEvF,KAAa;IAC1C,IAAM4H,OAAO,GAAG;MAAErC,QAAQ,EAARA,QAAQ;MAAEvF,KAAK,EAALA;KAAO;IAEnC,IAAI,CAACyB,YAAY,CAAC4F,IAAI,CAACO,OAAO,CAAC;IAC/B,IAAI,CAAChG,YAAY,CAACyF,IAAI,CAACO,OAAO,CAAC;GAChC;EAAAnF,MAAA,CAEDmC,gBAAgB,GAAhB,SAAAA,iBAAiBhC,IAAU,EAAE2C,QAAgB;IAI3C,IAAI,CAAClE,mBAAmB,CAACkE,QAAQ,CAAC,GAAG3C,IAAI;IACzC,IAAI,CAACxB,kBAAkB,CAAC+C,GAAG,CAACvB,IAAI,EAAE2C,QAAQ,CAAC;GAC5C;EAAA9C,MAAA,CAEDgD,cAAc,GAAd,SAAAA,eAAenF,KAKd;IACC,IAAQ6E,QAAQ,GAAgC7E,KAAK,CAA7C6E,QAAQ;MAAE9B,SAAS,GAAqB/C,KAAK,CAAnC+C,SAAS;MAAEkC,QAAQ,GAAWjF,KAAK,CAAxBiF,QAAQ;MAAE3C,IAAI,GAAKtC,KAAK,CAAdsC,IAAI;IAC3C,IAAMuF,oBAAoB,GAAG,IAAI,CAAC5G,gBAAgB,CAACgE,QAAQ,CAAC;IAC5D,IAAI6C,iBAAiB,GAAG7C,QAAQ;IAIhC,IAAI4C,oBAAoB,EAAE;MAExB,IAAIA,oBAAoB,KAAKvF,IAAI,EAAE,OAAO2C,QAAQ;MAClD,IAAI,IAAI,CAACtC,eAAe,EACtB,OAAO,IAAI,CAACiC,gBAAgB,CAACC,QAAQ,EAAE9B,SAAS,CAAC;MACnD+E,iBAAiB,GAAG,IAAI,CAACxC,6BAA6B,CACpDT,QAAQ,EACR9B,SAAS,CACV;MAED,OAAO,IAAI,CAAC9B,gBAAgB,CAAC6G,iBAAiB,CAAC,EAAE;QAC/CA,iBAAiB,GAAG,IAAI,CAACxC,6BAA6B,CACpDT,QAAQ,EACR9B,SAAS,CACV;;;IAGL,OAAO+E,iBAAiB;GACzB;EAAA3F,MAAA,CAQDkC,aAAa,GAAb,SAAAA,cAAc/B,IAAU,EAAEoB,KAAa;IACrC,IAAMqE,aAAa,GAAG,IAAI,CAAC3E,YAAY,CAACd,IAAI,CAAC;IAC7C,IAAIyF,aAAa,KAAK9D,SAAS,EAAE;MAG/B,IAAI,CAACrD,eAAe,UAAO,CAACmH,aAAa,CAAC;;IAE5C,IAAI,CAACnE,YAAY,CAACtB,IAAI,EAAEoB,KAAK,CAAC;IAC9B,IAAI,CAAC9C,eAAe,CAACiD,GAAG,CAACH,KAAK,EAAEpB,IAAI,CAAC;IACrC,OAAO,KAAK;GACb;EAAAH,MAAA,CAEDyF,oBAAoB,GAApB,SAAAA;IACE,IAAI,CAAC1F,cAAc,GAAGF,IAAI,CAACC,GAAG,EAAE;GACjC;EAAAE,MAAA,CAED4C,OAAO,GAAP,SAAAA;IACE,IAAI,IAAI,CAAChD,OAAO,KAAK,IAAI,CAACG,cAAc,EAAE;IAC1C,IAAI,CAACH,OAAO,GAAG,IAAI,CAACG,cAAc;IAElC,IAAI,CAACjB,gBAAgB,GAAG,EAAE;IAC1B,IAAI,CAAC0B,eAAe,GAAG,KAAK;GAC7B;EAAAR,MAAA,CAEDkD,WAAW,GAAX,SAAAA;IAME,KAAK,IAAInC,GAAG,GAAG,CAAC,EAAEA,GAAG,GAAG,IAAI,CAACnC,mBAAmB,CAAC6B,MAAM,EAAEM,GAAG,EAAE,EAAE;MAC9D,IAAI,IAAI,CAACnC,mBAAmB,CAACmC,GAAG,CAAC,IAAI,IAAI,EAAE;QACzC,IAAI,CAAC8E,cAAc,EAAE;QACrB;;;IAIJ,IAAMC,WAAW,GAAGpC,IAAI,CAACqC,GAAG,CAC1B,IAAI,CAAC/G,YAAY,CAACgH,IAAI,EAAE,EACxB,IAAI,CAAC7G,YAAY,CAAC6G,IAAI,EAAE,CACzB;IACD,IAAMC,WAAW,GAAGvC,IAAI,CAACwC,GAAG,CAC1B,IAAI,CAAClH,YAAY,CAACgH,IAAI,EAAE,EACxB,IAAI,CAAC7G,YAAY,CAAC6G,IAAI,EAAE,CACzB;IACD,IAAIC,WAAW,GAAG,EAAE,GAAGH,WAAW,EAAE;MAGlC,IAAI,CAACD,cAAc,EAAE;;GAExB;EAAA7F,MAAA,CACD6F,cAAc,GAAd,SAAAA;IACE,IAAAM,iBAAA,GAAqC,IAAI,CAAChF,UAAU,EAAE;MAA9CC,WAAW,GAAA+E,iBAAA,CAAX/E,WAAW;MAAEC,WAAW,GAAA8E,iBAAA,CAAX9E,WAAW;IAChC,KACE,IAAIyB,QAAQ,GAAG,CAAC,EAChBA,QAAQ,GAAG,IAAI,CAAClE,mBAAmB,CAAC6B,MAAM,EAC1CqC,QAAQ,EAAE,EACV;MACA,IAAM3C,IAAI,GAAG,IAAI,CAACvB,mBAAmB,CAACkE,QAAQ,CAAC;MAC/C,IAAIvF,KAAK,GAAG,IAAI,CAAC0D,YAAY,CAACd,IAAI,CAAC;MAEnC,IAAI,CAACA,IAAI,IAAI5C,KAAK,KAAK,CAAC,CAAC,IAAIA,KAAK,IAAI,IAAI,EAAE;QAC1CA,KAAK,GAAGG,MAAM,CAACC,gBAAgB,GAAGmF,QAAQ;;MAG5C,IAAMqC,OAAO,GAAG;QAAErC,QAAQ,EAARA,QAAQ;QAAEvF,KAAK,EAALA;OAAO;MACnC6D,WAAW,CAACwD,IAAI,CAACO,OAAO,CAAC;MACzB9D,WAAW,CAACuD,IAAI,CAACO,OAAO,CAAC;MACzB,IAAI5H,KAAK,GAAGE,eAAe,EAAE;QAE3B,IAAI,CAAC0E,gBAAgB,CAAC5E,KAAK,EAAEuF,QAAQ,CAAC;QAEtC,IAAI,CAACZ,aAAa,CAAC3E,KAAK,EAAEA,KAAK,CAAC;;;IAIpC,IAAI,CAAC4B,YAAY,CAACmD,IAAI,EAAE,CAAC/E,KAAK;IAE9B,IAAI,CAACyB,YAAY,GAAGoC,WAAW;IAC/B,IAAI,CAACjC,YAAY,GAAGkC,WAAW;GAChC;EAAArB,MAAA,CAcDd,kBAAkB,GAAlB,SAAAA,mBAAmBkH,GAAa,EAAEC,GAAa;IAC7C,OAAOD,GAAG,CAAC7I,KAAK,GAAG8I,GAAG,CAAC9I,KAAK;GAC7B;EAAAyC,MAAA,CAEDZ,kBAAkB,GAAlB,SAAAA,mBAAmBgH,GAAa,EAAEC,GAAa;IAC7C,OAAOD,GAAG,CAAC7I,KAAK,GAAG8I,GAAG,CAAC9I,KAAK;GAC7B;EAAA+I,YAAA,CAAA1I,gBAAA;IAAA2I,GAAA;IAAA/E,GAAA,EAljBD,SAAAA;MACE,OAAO,IAAI,CAACzC,WAAW;;;IACxBwH,GAAA;IAAA/E,GAAA,EAoBD,SAAAA;MACE,OAAO,IAAI,CAAC5C,mBAAmB,CAAC6B,MAAM,IAAI,IAAI,CAAC1B,WAAW;;;EAC3D,OAAAnB,gBAAA;AAAA;;;;;"}
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,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")),s=t(require("@x-oasis/invariant")),n=t(require("@x-oasis/return-hook")),a=function(t){return t},o=Number.MAX_SAFE_INTEGER-1e5;exports.default=function(){function t(t){void 0===t&&(t={});var i=t.name,s=void 0===i?"default_buffer":i,o=t.indexExtractor,r=t.bufferSize,l=void 0===r?10:r,h=t.metaExtractor;this._metaExtractor=void 0===h?a:h,this._indexExtractor=o,this._name=s,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=n(this.setIsOnTheFlyFull.bind(this)),this._loopMS=Date.now(),this._lastUpdatedMS=this._loopMS}var r,l,h=t.prototype;return h.isThresholdMeta=function(t){return"number"==typeof t&&t>o},h.setIsOnTheFlyFull=function(t){if(null!=t){var e=this._onTheFlyIndices.filter((function(t){return null!=t}));this._isOnTheFlyFull=e.length===this._bufferSize}},h.resetOnTheFlies=function(){this._isOnTheFlyFull=!1,this._onTheFlyIndices=[]},h.getOnTheFlyUncriticalPosition=function(t){for(var e=t.startIndex,s=t.endIndex,n=0;n<this._onTheFlyIndices.length;n++){var a=this.getMetaIndex(this._onTheFlyIndices[n]);if(!i(e,a,s))return n}return null},h.initialize=function(){return{smallValues:new e([],this._smallerComparator),largeValues:new e([],this._greaterComparator)}},h.getIndexMeta=function(t){return null==t||t<0?null:this._metaExtractor(t)},h.getMetaIndex=function(t){return null==t||this.isThresholdMeta(t)?-1:this._indexExtractor?this._indexExtractor(t):this._metaToIndexMap.get(t)},h.setMetaIndex=function(t,e){return!this._indexExtractor&&this._metaToIndexMap.set(t,e)},h.deleteMetaIndex=function(t){return this._metaToIndexMap.delete(t)},h.replaceMetaToIndexMap=function(t){return!this._indexExtractor&&(this._metaToIndexMap=t)},h.getIndexPosition=function(t){return this.getMetaIndex(this.getIndexMeta(t))},h.getNewPositionForIndex=function(t){var e=this.getIndexMeta(t);void 0!==this._metaToPositionMap.get(e)&&s(!1);var i=this._positionToMetaList.length;return this._pushToHeaps(i,t),this._setMetaIndex(e,t),this._setMetaPosition(e,i),i},h.getMinValue=function(){var t;return null==(t=this._smallValues.peek())?void 0:t.value},h.getMaxValue=function(){var t;return null==(t=this._largeValues.peek())?void 0:t.value},h.getFliedPosition=function(t,e){return this._isOnTheFlyFull&&e&&i(e.startIndex,t,e.endIndex)?this.getOnTheFlyUncriticalPosition(e):null},h.getPosition=function(t,e){this.prepare();var i,s,n=this.getIndexMeta(t),a=this._metaToPositionMap.get(n);return void 0!==a?i=this.commitPosition({newIndex:t,meta:n,safeRange:e,position:a}):this.isBufferFull?this._isOnTheFlyFull?i=this.getFliedPosition(t,e):(s=this._indexToMetaMap.get(t))&&this._metaToPositionMap.get(s)?i=this.commitPosition({newIndex:t,meta:n,safeRange:e,position:this._metaToPositionMap.get(s)}):(this._cleanHeaps(),i=this.commitPosition({newIndex:t,meta:n,safeRange:e,position:this._replaceFurthestIndexPosition(t,e)})):i=this.getNewPositionForIndex(t),null!=i?(this._onTheFlyIndices[i]=n,this._setMetaIndex(n,t),this._metaToPositionMap.set(n,i),this._isOnTheFlyFullReturnHook(i)):null},h.replaceFurthestIndexPosition=function(t,e){return this.isBufferFull?this._replaceFurthestIndexPosition(t,e):this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t))},h._replaceFurthestIndexPosition=function(t,e){if(this._largeValues.empty()||this._smallValues.empty())return this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t));var s,n=this._smallValues.peek().value,a=this._largeValues.peek().value;if(a>o){s=a,this._largeValues.pop();var r=this._indexToMetaMap.get(s);return this._metaToPositionMap.get(r)}if(!e){Math.abs(t-n)>Math.abs(t-a)?(s=n,this._smallValues.pop()):(s=a,this._largeValues.pop());var l=this._indexToMetaMap.get(s);return this._metaToPositionMap.get(l)}var h=e.startIndex,u=e.endIndex;if(i(h,n,u)&&i(h,a,u))return null;i(h,n,u)&&!i(h,a,u)?(s=a,this._largeValues.pop()):!i(h,n,u)&&i(h,a,u)||h-n>a-u?(s=n,this._smallValues.pop()):(s=a,this._largeValues.pop());var p=this._indexToMetaMap.get(s);return this._metaToPositionMap.get(p)},h.shuffle=function(){for(var t=this,e=new Array(this.bufferSize),i=0;i<e.length;i++){var s=this.getMetaIndex(this._onTheFlyIndices[i]||this._positionToMetaList[i]);e[i]=s}for(var n=new Array(e.length),a=[],o=new Map,r=new Map,l=function(){var i=e[h],s=t._metaExtractor(i);if(null==s)return"continue";if(o.set(i,s),r.set(s,i),s===t._positionToMetaList[h])return n[h]=s,"continue";var l=t._positionToMetaList.findIndex((function(t){return t===s}));if(-1!==l)return n[l]=s,"continue";a.push(s)},h=0;h<e.length;h++)l();var u=[];this._indexToMetaMap=o,this.replaceMetaToIndexMap(r);for(var p=0;p<e.length;p++)if(null==n[p]){var _=a.shift();null!=_&&(u[p]=_)}else u[p]=n[p];return this._positionToMetaList=u,this.getIndices()},h.getIndices=function(){var t=this.initialize(),e=t.smallValues,i=t.largeValues;try{for(var s=new Array(this._positionToMetaList.length),n=new Map,a=new Map,o=new Map,r=0;r<s.length;r++){var l=this._onTheFlyIndices[r]||this._positionToMetaList[r],h=this.getMetaIndex(l);if(!this.isThresholdMeta(l)&&l!=this.getIndexMeta(h))return this.shuffle();if(null!=l&&!this.isThresholdMeta(l)){var u={position:r,value:h};e.push(u),i.push(u),n.set(l,r),a.set(h,l),o.set(l,h),s[r]={meta:l,targetIndex:h,recyclerKey:this._name+"_"+r}}}return this._smallValues=e,this._largeValues=i,this._metaToPositionMap=n,this._positionToMetaList=s.map((function(t){return null==t?void 0:t.meta})),this.resetOnTheFlies(),this._indexToMetaMap=a,this.replaceMetaToIndexMap(o),s}catch(t){return console.log("err ",t),this._positionToMetaList}finally{this.readyToStartNextLoop()}},h._pushToHeaps=function(t,e){var i={position:t,value:e};this._smallValues.push(i),this._largeValues.push(i)},h._setMetaPosition=function(t,e){this._positionToMetaList[e]=t,this._metaToPositionMap.set(t,e)},h.commitPosition=function(t){var e=t.newIndex,i=t.safeRange,s=t.position,n=this._onTheFlyIndices[s],a=s;if(n){if(n===t.meta)return s;if(this._isOnTheFlyFull)return this.getFliedPosition(e,i);for(a=this._replaceFurthestIndexPosition(e,i);this._onTheFlyIndices[a];)a=this._replaceFurthestIndexPosition(e,i)}return a},h._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},h.readyToStartNextLoop=function(){this._lastUpdatedMS=Date.now()},h.prepare=function(){this._loopMS!==this._lastUpdatedMS&&(this._loopMS=this._lastUpdatedMS,this._onTheFlyIndices=[],this._isOnTheFlyFull=!1)},h._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()},h._recreateHeaps=function(){for(var t=this.initialize(),e=t.smallValues,i=t.largeValues,s=0;s<this._positionToMetaList.length;s++){var n=this._positionToMetaList[s],a=this.getMetaIndex(n);n&&-1!==a&&null!=a||(a=Number.MAX_SAFE_INTEGER-s);var r={position:s,value:a};e.push(r),i.push(r),a>o&&(this._setMetaPosition(a,s),this._setMetaIndex(a,a))}this._largeValues.peek(),this._smallValues=e,this._largeValues=i},h._smallerComparator=function(t,e){return t.value<e.value},h._greaterComparator=function(t,e){return t.value>e.value},r=t,(l=[{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 s=e[i];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(t,"symbol"==typeof(n=function(t,e){if("object"!=typeof t||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var s=i.call(t,"string");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(s.key))?n:String(n),s)}var n}(r.prototype,l),Object.defineProperty(r,"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;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;
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 if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n }\n\n getMetaIndex(meta: Meta) {\n if (meta == null) return -1;\n if (this.isThresholdMeta(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n getMinValue() {\n return this._smallValues.peek()?.value;\n }\n\n getMaxValue() {\n return this._largeValues.peek()?.value;\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta)\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n // console.log('commeit ---')\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._smallValues.peek()!.value;\n const maxValue = this._largeValues.peek()!.value;\n\n // console.log('mathc ', maxValue, maxValue > thresholdNumber)\n if (maxValue > thresholdNumber) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle() {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices();\n }\n\n // key point: `meta` should be preserved..\n getIndices() {\n const { smallValues, largeValues } = this.initialize();\n\n try {\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta =\n this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one element has been deleted\n if (\n !this.isThresholdMeta(meta) &&\n meta != this.getIndexMeta(targetIndex)\n ) {\n return this.shuffle();\n }\n if (meta != null && !this.isThresholdMeta(meta)) {\n const element = { position: idx, value: targetIndex };\n smallValues.push(element);\n largeValues.push(element);\n metaToPositionMap.set(meta, idx);\n 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._positionToMetaList;\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const element = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._smallValues.push(element);\n this._largeValues.push(element);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n // console.log('position ', newIndex, position);\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n // this._cleanHeap(this._smallValues);\n // this._cleanHeap(this._largeValues);\n\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n\n if (!meta || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const element = { position, value };\n smallValues.push(element);\n largeValues.push(element);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n\n this._largeValues.peek().value;\n\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n // _cleanHeap(heap: Heap<HeapItem>) {\n // while (\n // !heap.empty() &&\n // this._metaToPositionMap.get(\n // this._indexToMetaMap.get(heap.peek()!.value)\n // ) == null\n // ) {\n // console.log('pop ---', heap.peek()!.value);\n // heap.pop();\n // }\n // }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","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","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","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","positionToMetaList","shift","getIndices","_this$initialize","metaToPositionMap","element","recyclerKey","map","err","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;\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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"}
@@ -20,6 +20,20 @@ function _createClass(Constructor, protoProps, staticProps) {
20
20
  });
21
21
  return Constructor;
22
22
  }
23
+ function _extends() {
24
+ _extends = Object.assign ? Object.assign.bind() : function (target) {
25
+ for (var i = 1; i < arguments.length; i++) {
26
+ var source = arguments[i];
27
+ for (var key in source) {
28
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
29
+ target[key] = source[key];
30
+ }
31
+ }
32
+ }
33
+ return target;
34
+ };
35
+ return _extends.apply(this, arguments);
36
+ }
23
37
  function _toPrimitive(input, hint) {
24
38
  if (typeof input !== "object" || input === null) return input;
25
39
  var prim = input[Symbol.toPrimitive];
@@ -107,14 +121,22 @@ var IntegerBufferSet = /*#__PURE__*/function () {
107
121
  };
108
122
  };
109
123
  _proto.getIndexMeta = function getIndexMeta(index) {
110
- if (index == null || index < 0) return null;
111
- return this._metaExtractor(index);
124
+ try {
125
+ if (index == null || index < 0) return null;
126
+ return this._metaExtractor(index);
127
+ } catch (err) {
128
+ return null;
129
+ }
112
130
  };
113
131
  _proto.getMetaIndex = function getMetaIndex(meta) {
114
- if (meta == null) return -1;
115
- if (this.isThresholdMeta(meta)) return -1;
116
- if (this._indexExtractor) return this._indexExtractor(meta);
117
- return this._metaToIndexMap.get(meta);
132
+ try {
133
+ if (meta == null) return -1;
134
+ if (this.isThresholdMeta(meta)) return -1;
135
+ if (this._indexExtractor) return this._indexExtractor(meta);
136
+ return this._metaToIndexMap.get(meta);
137
+ } catch (err) {
138
+ return -1;
139
+ }
118
140
  };
119
141
  _proto.setMetaIndex = function setMetaIndex(meta, index) {
120
142
  if (!this._indexExtractor) {
@@ -175,7 +197,7 @@ var IntegerBufferSet = /*#__PURE__*/function () {
175
197
  position = this.getNewPositionForIndex(newIndex);
176
198
  } else if (this._isOnTheFlyFull) {
177
199
  position = this.getFliedPosition(newIndex, safeRange);
178
- } else if ((indexMeta = this._indexToMetaMap.get(newIndex)) && this._metaToPositionMap.get(indexMeta)) {
200
+ } else if ((indexMeta = this._indexToMetaMap.get(newIndex)) && this._metaToPositionMap.get(indexMeta) != null) {
179
201
  position = this.commitPosition({
180
202
  newIndex: newIndex,
181
203
  meta: meta,
@@ -252,7 +274,7 @@ var IntegerBufferSet = /*#__PURE__*/function () {
252
274
  var position = this._metaToPositionMap.get(replacedMeta);
253
275
  return position;
254
276
  };
255
- _proto.shuffle = function shuffle() {
277
+ _proto.shuffle = function shuffle(options) {
256
278
  var _this = this;
257
279
  var indices = new Array(this.bufferSize);
258
280
  for (var idx = 0; idx < indices.length; idx++) {
@@ -301,22 +323,33 @@ var IntegerBufferSet = /*#__PURE__*/function () {
301
323
  }
302
324
  }
303
325
  this._positionToMetaList = positionToMetaList;
304
- return this.getIndices();
326
+ return this.getIndices(_extends({}, options, {
327
+ retry: true
328
+ }));
305
329
  };
306
- _proto.getIndices = function getIndices() {
307
- var _this$initialize = this.initialize(),
308
- smallValues = _this$initialize.smallValues,
309
- largeValues = _this$initialize.largeValues;
330
+ _proto.getIndices = function getIndices(options) {
331
+ if (options === void 0) {
332
+ options = {
333
+ retry: false,
334
+ fallback: false
335
+ };
336
+ }
310
337
  try {
338
+ var _options = options,
339
+ retry = _options.retry,
340
+ fallback = _options.fallback;
341
+ var _this$initialize = this.initialize(),
342
+ smallValues = _this$initialize.smallValues,
343
+ largeValues = _this$initialize.largeValues;
311
344
  var indices = new Array(this._positionToMetaList.length);
312
345
  var metaToPositionMap = new Map();
313
346
  var indexToMetaMap = new Map();
314
347
  var metaToIndexMap = new Map();
315
348
  for (var idx = 0; idx < indices.length; idx++) {
316
- var meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
349
+ var meta = fallback ? this._onTheFlyIndices[idx] : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
317
350
  var targetIndex = this.getMetaIndex(meta);
318
- if (!this.isThresholdMeta(meta) && meta != this.getIndexMeta(targetIndex)) {
319
- return this.shuffle();
351
+ if (!this.isThresholdMeta(meta) && meta != this.getIndexMeta(targetIndex) && !retry) {
352
+ return this.shuffle(options);
320
353
  }
321
354
  if (meta != null && !this.isThresholdMeta(meta)) {
322
355
  var element = {
@@ -347,7 +380,9 @@ var IntegerBufferSet = /*#__PURE__*/function () {
347
380
  return indices;
348
381
  } catch (err) {
349
382
  console.log('err ', err);
350
- return this._positionToMetaList;
383
+ return this.getIndices(_extends({}, options, {
384
+ fallback: true
385
+ }));
351
386
  } finally {
352
387
  this.readyToStartNextLoop();
353
388
  }
@@ -433,7 +468,6 @@ var IntegerBufferSet = /*#__PURE__*/function () {
433
468
  this._setMetaIndex(value, value);
434
469
  }
435
470
  }
436
- this._largeValues.peek().value;
437
471
  this._smallValues = smallValues;
438
472
  this._largeValues = largeValues;
439
473
  };
@@ -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 if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n }\n\n getMetaIndex(meta: Meta) {\n if (meta == null) return -1;\n if (this.isThresholdMeta(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n getMinValue() {\n return this._smallValues.peek()?.value;\n }\n\n getMaxValue() {\n return this._largeValues.peek()?.value;\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta)\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n // console.log('commeit ---')\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._smallValues.peek()!.value;\n const maxValue = this._largeValues.peek()!.value;\n\n // console.log('mathc ', maxValue, maxValue > thresholdNumber)\n if (maxValue > thresholdNumber) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle() {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices();\n }\n\n // key point: `meta` should be preserved..\n getIndices() {\n const { smallValues, largeValues } = this.initialize();\n\n try {\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta =\n this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one element has been deleted\n if (\n !this.isThresholdMeta(meta) &&\n meta != this.getIndexMeta(targetIndex)\n ) {\n return this.shuffle();\n }\n if (meta != null && !this.isThresholdMeta(meta)) {\n const element = { position: idx, value: targetIndex };\n smallValues.push(element);\n largeValues.push(element);\n metaToPositionMap.set(meta, idx);\n 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._positionToMetaList;\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const element = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._smallValues.push(element);\n this._largeValues.push(element);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n // console.log('position ', newIndex, position);\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n // this._cleanHeap(this._smallValues);\n // this._cleanHeap(this._largeValues);\n\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n\n if (!meta || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const element = { position, value };\n smallValues.push(element);\n largeValues.push(element);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n\n this._largeValues.peek().value;\n\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n // _cleanHeap(heap: Heap<HeapItem>) {\n // while (\n // !heap.empty() &&\n // this._metaToPositionMap.get(\n // this._indexToMetaMap.get(heap.peek()!.value)\n // ) == null\n // ) {\n // console.log('pop ---', heap.peek()!.value);\n // heap.pop();\n // }\n // }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","defaultBufferSize","thresholdNumber","Number","MAX_SAFE_INTEGER","IntegerBufferSet","props","_props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","isThresholdMeta","meta","val","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","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","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","_ret","positionToMetaList","shift","getIndices","_this$initialize","metaToPositionMap","element","recyclerKey","map","err","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","lhs","rhs","_createClass","key"],"mappings":"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"}
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x-oasis/integer-buffer-set",
3
- "version": "0.1.26",
3
+ "version": "0.1.28",
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.26",
19
+ "@x-oasis/heap": "0.1.28",
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
@@ -140,15 +140,23 @@ class IntegerBufferSet<Meta = any> {
140
140
  }
141
141
 
142
142
  getIndexMeta(index: number) {
143
- if (index == null || index < 0) return null;
144
- return this._metaExtractor(index);
143
+ try {
144
+ if (index == null || index < 0) return null;
145
+ return this._metaExtractor(index);
146
+ } catch (err) {
147
+ return null;
148
+ }
145
149
  }
146
150
 
147
151
  getMetaIndex(meta: Meta) {
148
- if (meta == null) return -1;
149
- if (this.isThresholdMeta(meta)) return -1;
150
- if (this._indexExtractor) return this._indexExtractor(meta);
151
- return this._metaToIndexMap.get(meta);
152
+ try {
153
+ if (meta == null) return -1;
154
+ if (this.isThresholdMeta(meta)) return -1;
155
+ if (this._indexExtractor) return this._indexExtractor(meta);
156
+ return this._metaToIndexMap.get(meta);
157
+ } catch (err) {
158
+ return -1;
159
+ }
152
160
  }
153
161
 
154
162
  setMetaIndex(meta: Meta, index: number) {
@@ -253,7 +261,7 @@ class IntegerBufferSet<Meta = any> {
253
261
  position = this.getFliedPosition(newIndex, safeRange);
254
262
  } else if (
255
263
  (indexMeta = this._indexToMetaMap.get(newIndex)) &&
256
- this._metaToPositionMap.get(indexMeta)
264
+ this._metaToPositionMap.get(indexMeta) != null
257
265
  ) {
258
266
  /**
259
267
  Index has already been stored, but we cant use its old position directly...
@@ -390,7 +398,7 @@ class IntegerBufferSet<Meta = any> {
390
398
  return position;
391
399
  }
392
400
 
393
- shuffle() {
401
+ shuffle(options: { retry: boolean; fallback: boolean }) {
394
402
  const indices = new Array(this.bufferSize);
395
403
  for (let idx = 0; idx < indices.length; idx++) {
396
404
  const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
@@ -448,28 +456,38 @@ class IntegerBufferSet<Meta = any> {
448
456
 
449
457
  this._positionToMetaList = positionToMetaList;
450
458
 
451
- return this.getIndices();
459
+ return this.getIndices({
460
+ ...options,
461
+ retry: true,
462
+ });
452
463
  }
453
464
 
454
465
  // key point: `meta` should be preserved..
455
- getIndices() {
456
- const { smallValues, largeValues } = this.initialize();
457
-
466
+ getIndices(
467
+ options = {
468
+ retry: false,
469
+ fallback: false,
470
+ }
471
+ ) {
458
472
  try {
473
+ const { retry, fallback } = options;
474
+ const { smallValues, largeValues } = this.initialize();
459
475
  const indices = new Array(this._positionToMetaList.length);
460
476
  const metaToPositionMap = new Map();
461
477
  const indexToMetaMap = new Map();
462
478
  const metaToIndexMap = new Map();
463
479
  for (let idx = 0; idx < indices.length; idx++) {
464
- const meta =
465
- this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
480
+ const meta = fallback
481
+ ? this._onTheFlyIndices[idx]
482
+ : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
466
483
  const targetIndex = this.getMetaIndex(meta);
467
484
  // which means source data has changed. such as one element has been deleted
468
485
  if (
469
486
  !this.isThresholdMeta(meta) &&
470
- meta != this.getIndexMeta(targetIndex)
487
+ meta != this.getIndexMeta(targetIndex) &&
488
+ !retry
471
489
  ) {
472
- return this.shuffle();
490
+ return this.shuffle(options);
473
491
  }
474
492
  if (meta != null && !this.isThresholdMeta(meta)) {
475
493
  const element = { position: idx, value: targetIndex };
@@ -496,7 +514,10 @@ class IntegerBufferSet<Meta = any> {
496
514
  return indices;
497
515
  } catch (err) {
498
516
  console.log('err ', err);
499
- return this._positionToMetaList;
517
+ return this.getIndices({
518
+ ...options,
519
+ fallback: true,
520
+ });
500
521
  } finally {
501
522
  this.readyToStartNextLoop();
502
523
  // clear on the fly indices after return indices.
@@ -632,7 +653,7 @@ class IntegerBufferSet<Meta = any> {
632
653
  }
633
654
  }
634
655
 
635
- this._largeValues.peek().value;
656
+ // this._largeValues.peek().value;
636
657
 
637
658
  this._smallValues = smallValues;
638
659
  this._largeValues = largeValues;