@x-oasis/integer-buffer-set 0.1.30 → 0.1.31

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
@@ -2,7 +2,7 @@ import Heap from '@x-oasis/heap';
2
2
  import { HeapItem, SafeRange, IntegerBufferSetProps, MetaToIndexMap } from './types';
3
3
  export declare const defaultBufferSize = 10;
4
4
  declare class IntegerBufferSet<Meta = any> {
5
- private _name;
5
+ private _type;
6
6
  private _bufferSize;
7
7
  private _indexToMetaMap;
8
8
  private _metaToPositionMap;
@@ -18,12 +18,15 @@ declare class IntegerBufferSet<Meta = any> {
18
18
  private _loopMS;
19
19
  private _lastUpdatedMS;
20
20
  constructor(props?: IntegerBufferSetProps<Meta>);
21
+ initialize(): void;
22
+ getType(): string;
21
23
  get bufferSize(): number;
24
+ reset(): void;
22
25
  setIsOnTheFlyFull(val: any): void;
23
26
  resetOnTheFlies(): void;
24
27
  get isBufferFull(): boolean;
25
28
  getOnTheFlyUncriticalPosition(safeRange: SafeRange): number;
26
- initialize(): {
29
+ createEmptyHeaps(): {
27
30
  smallValues: Heap<any>;
28
31
  largeValues: Heap<any>;
29
32
  };
@@ -69,8 +69,8 @@ var IntegerBufferSet = /*#__PURE__*/function () {
69
69
  props = {};
70
70
  }
71
71
  var _props = props,
72
- _props$name = _props.name,
73
- name = _props$name === void 0 ? 'default_buffer' : _props$name,
72
+ _props$type = _props.type,
73
+ type = _props$type === void 0 ? 'default_buffer' : _props$type,
74
74
  indexExtractor = _props.indexExtractor,
75
75
  _props$bufferSize = _props.bufferSize,
76
76
  bufferSize = _props$bufferSize === void 0 ? defaultBufferSize : _props$bufferSize,
@@ -78,15 +78,9 @@ var IntegerBufferSet = /*#__PURE__*/function () {
78
78
  metaExtractor = _props$metaExtractor === void 0 ? defaultMetaExtractor : _props$metaExtractor;
79
79
  this._metaExtractor = metaExtractor;
80
80
  this._indexExtractor = indexExtractor;
81
- this._name = name;
82
- this._indexToMetaMap = new Map();
83
- this._metaToPositionMap = new Map();
84
- this._positionToMetaList = [];
85
- this._metaToIndexMap = new Map();
86
- this._onTheFlyIndices = [];
81
+ this._type = type;
82
+ this.initialize();
87
83
  this._bufferSize = bufferSize;
88
- this._smallValues = new Heap([], this._smallerComparator);
89
- this._largeValues = new Heap([], this._greaterComparator);
90
84
  this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);
91
85
  this.getIndexPosition = this.getIndexPosition.bind(this);
92
86
  this.replaceFurthestIndexPosition = this.replaceFurthestIndexPosition.bind(this);
@@ -95,6 +89,25 @@ var IntegerBufferSet = /*#__PURE__*/function () {
95
89
  this._lastUpdatedMS = this._loopMS;
96
90
  }
97
91
  var _proto = IntegerBufferSet.prototype;
92
+ _proto.initialize = function initialize() {
93
+ var _this$createEmptyHeap = this.createEmptyHeaps(),
94
+ smallValues = _this$createEmptyHeap.smallValues,
95
+ largeValues = _this$createEmptyHeap.largeValues;
96
+ this._smallValues = smallValues;
97
+ this._largeValues = largeValues;
98
+ this._positionToMetaList = [];
99
+ this._indexToMetaMap = new Map();
100
+ this._metaToPositionMap = new Map();
101
+ this._metaToIndexMap = new Map();
102
+ this._onTheFlyIndices = [];
103
+ this._isOnTheFlyFull = false;
104
+ };
105
+ _proto.getType = function getType() {
106
+ return this._type;
107
+ };
108
+ _proto.reset = function reset() {
109
+ this.initialize();
110
+ };
98
111
  _proto.setIsOnTheFlyFull = function setIsOnTheFlyFull(val) {
99
112
  if (val != null) {
100
113
  var data = this._onTheFlyIndices.filter(function (v) {
@@ -119,7 +132,7 @@ var IntegerBufferSet = /*#__PURE__*/function () {
119
132
  }
120
133
  return null;
121
134
  };
122
- _proto.initialize = function initialize() {
135
+ _proto.createEmptyHeaps = function createEmptyHeaps() {
123
136
  return {
124
137
  smallValues: new Heap([], this._smallerComparator),
125
138
  largeValues: new Heap([], this._greaterComparator)
@@ -385,9 +398,9 @@ var IntegerBufferSet = /*#__PURE__*/function () {
385
398
  var _options = options,
386
399
  retry = _options.retry,
387
400
  fallback = _options.fallback;
388
- var _this$initialize = this.initialize(),
389
- smallValues = _this$initialize.smallValues,
390
- largeValues = _this$initialize.largeValues;
401
+ var _this$createEmptyHeap2 = this.createEmptyHeaps(),
402
+ smallValues = _this$createEmptyHeap2.smallValues,
403
+ largeValues = _this$createEmptyHeap2.largeValues;
391
404
  var indices = new Array(this._positionToMetaList.length);
392
405
  var metaToPositionMap = new Map();
393
406
  var indexToMetaMap = new Map();
@@ -411,7 +424,7 @@ var IntegerBufferSet = /*#__PURE__*/function () {
411
424
  indices[idx] = {
412
425
  meta: meta,
413
426
  targetIndex: targetIndex,
414
- recyclerKey: this._name + "_" + idx
427
+ recyclerKey: this._type + "_" + idx
415
428
  };
416
429
  }
417
430
  }
@@ -495,9 +508,9 @@ var IntegerBufferSet = /*#__PURE__*/function () {
495
508
  }
496
509
  };
497
510
  _proto._recreateHeaps = function _recreateHeaps() {
498
- var _this$initialize2 = this.initialize(),
499
- smallValues = _this$initialize2.smallValues,
500
- largeValues = _this$initialize2.largeValues;
511
+ var _this$createEmptyHeap3 = this.createEmptyHeaps(),
512
+ smallValues = _this$createEmptyHeap3.smallValues,
513
+ largeValues = _this$createEmptyHeap3.largeValues;
501
514
  for (var position = 0; position < this._positionToMetaList.length; position++) {
502
515
  var meta = this._positionToMetaList[position];
503
516
  var value = this.getMetaIndex(meta);
@@ -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;\nconst assertThresholdNumber = (val: any) =>\n typeof val === 'number' && val > thresholdNumber;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _name: string;\n private _bufferSize: number;\n\n private _indexToMetaMap: IndexToMetaMap<Meta>;\n private _metaToPositionMap: MetaToPositionMap<Meta>;\n private _positionToMetaList: Array<Meta>;\n private _metaToIndexMap: MetaToIndexMap<Meta>;\n\n private _smallValues: Heap<HeapItem>;\n private _largeValues: Heap<HeapItem>;\n private _metaExtractor: MetaExtractor<Meta>;\n private _indexExtractor: IndexExtractor<Meta>;\n\n private _onTheFlyIndices: Array<Meta>;\n\n private _isOnTheFlyFull: boolean;\n private _isOnTheFlyFullReturnHook: ReturnHook;\n\n private _loopMS: number;\n private _lastUpdatedMS: number;\n\n constructor(props: IntegerBufferSetProps<Meta> = {}) {\n const {\n name = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._name = name;\n\n /**\n * this._indexToMetaMap is used to find the prev meta when finding a position for index.\n */\n this._indexToMetaMap = new Map();\n this._metaToPositionMap = new Map();\n this._positionToMetaList = [];\n this._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n\n this._bufferSize = bufferSize;\n\n this._smallValues = new Heap([], this._smallerComparator);\n this._largeValues = new Heap([], this._greaterComparator);\n\n this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);\n this.getIndexPosition = this.getIndexPosition.bind(this);\n this.replaceFurthestIndexPosition =\n this.replaceFurthestIndexPosition.bind(this);\n this._isOnTheFlyFullReturnHook = returnHook(\n this.setIsOnTheFlyFull.bind(this)\n );\n\n this._loopMS = Date.now();\n this._lastUpdatedMS = this._loopMS;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n setIsOnTheFlyFull(val: any) {\n if (val != null) {\n const data = this._onTheFlyIndices.filter((v) => v != null);\n this._isOnTheFlyFull = data.length === this._bufferSize;\n // console.log('fly ', this._isOnTheFlyFull, data.length, this._bufferSize);\n }\n }\n\n resetOnTheFlies() {\n this._isOnTheFlyFull = false;\n this._onTheFlyIndices = [];\n }\n\n get isBufferFull() {\n return this._positionToMetaList.length >= this._bufferSize;\n }\n\n getOnTheFlyUncriticalPosition(safeRange: SafeRange) {\n const { startIndex, endIndex } = safeRange;\n for (let idx = 0; idx < this._onTheFlyIndices.length; idx++) {\n const meta = this._onTheFlyIndices[idx];\n const metaIndex = this.getMetaIndex(meta);\n if (!isClamped(startIndex, metaIndex, endIndex)) {\n return idx;\n }\n }\n return null;\n }\n\n initialize() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n try {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n } catch (err) {\n return null;\n }\n }\n\n getMetaIndex(meta: Meta) {\n try {\n if (meta == null) return -1;\n if (assertThresholdNumber(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n } catch (err) {\n return -1;\n }\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n _peek(heap: Heap) {\n return heap.peek();\n }\n\n _getMaxItem() {\n return this._peek(this._largeValues);\n }\n\n _getMinItem() {\n return this._peek(this._smallValues);\n }\n\n _getMinValue() {\n return this._peek(this._smallValues)?.value;\n }\n\n _getMaxValue() {\n return this._peek(this._largeValues)?.value;\n }\n\n // should omit thresholdNumber\n getMaxValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMaxItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._largeValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._largeValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n getMinValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMinItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._smallValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._smallValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n _push(heap: Heap, item: HeapItem) {\n heap.push(item);\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta) != null\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._getMinValue();\n const maxValue = this._getMaxValue();\n\n if (assertThresholdNumber(maxValue)) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle(options: { retry: boolean; fallback: boolean }) {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices({\n ...options,\n retry: true,\n });\n }\n\n // key point: `meta` should be preserved..\n getIndices(\n options = {\n retry: false,\n fallback: false,\n }\n ) {\n try {\n const { retry, fallback } = options;\n const { smallValues, largeValues } = this.initialize();\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = fallback\n ? this._onTheFlyIndices[idx]\n : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one item has been deleted\n if (\n !assertThresholdNumber(meta) &&\n meta != this.getIndexMeta(targetIndex) &&\n !retry\n ) {\n return this.shuffle(options);\n }\n if (meta != null && !assertThresholdNumber(meta)) {\n const item = { position: idx, value: targetIndex };\n this._push(smallValues, item);\n this._push(largeValues, item);\n metaToPositionMap.set(meta, idx);\n indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._name}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this.getIndices({\n ...options,\n fallback: true,\n });\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const item = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._push(this._smallValues, item);\n this._push(this._largeValues, item);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n if (meta == null || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const item = { position, value };\n this._push(smallValues, item);\n this._push(largeValues, item);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","defaultBufferSize","thresholdNumber","Number","MAX_SAFE_INTEGER","assertThresholdNumber","val","IntegerBufferSet","props","_props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","meta","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","err","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","_peek","heap","peek","_getMaxItem","_getMinItem","_getMinValue","_this$_peek","_getMaxValue","_this$_peek2","getMaxValue","stack","item","_item","push","pop","stackItem","_item2","getMinValue","_item3","_item4","_push","getFliedPosition","newIndex","getPosition","prepare","metaPosition","position","indexMeta","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","replacedMeta","Math","abs","lowValue","highValue","shuffle","options","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","_ret","positionToMetaList","shift","getIndices","_extends","retry","fallback","_options","_this$initialize","metaToPositionMap","recyclerKey","map","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","lhs","rhs","_createClass","key"],"mappings":"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"}
1
+ {"version":3,"file":"integer-buffer-set.cjs.development.js","sources":["../src/index.ts"],"sourcesContent":["import Heap from '@x-oasis/heap';\nimport isClamped from '@x-oasis/is-clamped';\nimport invariant from '@x-oasis/invariant';\nimport returnHook, { ReturnHook } from '@x-oasis/return-hook';\nimport {\n HeapItem,\n SafeRange,\n MetaExtractor,\n IndexExtractor,\n IntegerBufferSetProps,\n MetaToIndexMap,\n MetaToPositionMap,\n IndexToMetaMap,\n} from './types';\n\nconst defaultMetaExtractor = (value) => value;\nexport const defaultBufferSize = 10;\nconst thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;\nconst assertThresholdNumber = (val: any) =>\n typeof val === 'number' && val > thresholdNumber;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _type: 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 type = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._type = type;\n\n this.initialize();\n\n this._bufferSize = bufferSize;\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 initialize() {\n const { smallValues, largeValues } = this.createEmptyHeaps();\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._positionToMetaList = [];\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._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n getType() {\n return this._type;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n reset() {\n this.initialize();\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 }\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 createEmptyHeaps() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n try {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n } catch (err) {\n return null;\n }\n }\n\n getMetaIndex(meta: Meta) {\n try {\n if (meta == null) return -1;\n if (assertThresholdNumber(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n } catch (err) {\n return -1;\n }\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n _peek(heap: Heap) {\n return heap.peek();\n }\n\n _getMaxItem() {\n return this._peek(this._largeValues);\n }\n\n _getMinItem() {\n return this._peek(this._smallValues);\n }\n\n _getMinValue() {\n return this._peek(this._smallValues)?.value;\n }\n\n _getMaxValue() {\n return this._peek(this._largeValues)?.value;\n }\n\n // should omit thresholdNumber\n getMaxValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMaxItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._largeValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._largeValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n getMinValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMinItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._smallValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._smallValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n _push(heap: Heap, item: HeapItem) {\n heap.push(item);\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._type === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta) != null\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._getMinValue();\n const maxValue = this._getMaxValue();\n\n if (assertThresholdNumber(maxValue)) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle(options: { retry: boolean; fallback: boolean }) {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices({\n ...options,\n retry: true,\n });\n }\n\n // key point: `meta` should be preserved..\n getIndices(\n options = {\n retry: false,\n fallback: false,\n }\n ) {\n try {\n const { retry, fallback } = options;\n const { smallValues, largeValues } = this.createEmptyHeaps();\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = fallback\n ? this._onTheFlyIndices[idx]\n : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one item has been deleted\n if (\n !assertThresholdNumber(meta) &&\n meta != this.getIndexMeta(targetIndex) &&\n !retry\n ) {\n return this.shuffle(options);\n }\n if (meta != null && !assertThresholdNumber(meta)) {\n const item = { position: idx, value: targetIndex };\n this._push(smallValues, item);\n this._push(largeValues, item);\n metaToPositionMap.set(meta, idx);\n indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._type}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this.getIndices({\n ...options,\n fallback: true,\n });\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const item = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._push(this._smallValues, item);\n this._push(this._largeValues, item);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.createEmptyHeaps();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n if (meta == null || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const item = { position, value };\n this._push(smallValues, item);\n this._push(largeValues, item);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","defaultBufferSize","thresholdNumber","Number","MAX_SAFE_INTEGER","assertThresholdNumber","val","IntegerBufferSet","props","_props","_props$type","type","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","_metaExtractor","_indexExtractor","_type","initialize","_bufferSize","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","_this$createEmptyHeap","createEmptyHeaps","smallValues","largeValues","_smallValues","_largeValues","_positionToMetaList","_indexToMetaMap","Map","_metaToPositionMap","_metaToIndexMap","_onTheFlyIndices","_isOnTheFlyFull","getType","reset","data","filter","v","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","meta","metaIndex","getMetaIndex","isClamped","Heap","_smallerComparator","_greaterComparator","getIndexMeta","index","err","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","_peek","heap","peek","_getMaxItem","_getMinItem","_getMinValue","_this$_peek","_getMaxValue","_this$_peek2","getMaxValue","stack","item","_item","push","pop","stackItem","_item2","getMinValue","_item3","_item4","_push","getFliedPosition","newIndex","getPosition","prepare","metaPosition","position","indexMeta","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","replacedMeta","Math","abs","lowValue","highValue","shuffle","options","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","_ret","positionToMetaList","shift","getIndices","_extends","retry","fallback","_options","_this$createEmptyHeap2","metaToPositionMap","recyclerKey","map","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$createEmptyHeap3","lhs","rhs","_createClass","key"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}Object.defineProperty(exports,"__esModule",{value:!0});var e=t(require("@x-oasis/heap")),i=t(require("@x-oasis/is-clamped")),n=t(require("@x-oasis/invariant")),s=t(require("@x-oasis/return-hook"));function a(){return(a=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(t[n]=i[n])}return t}).apply(this,arguments)}var o=function(t){return t},r=Number.MAX_SAFE_INTEGER-1e5,l=function(t){return"number"==typeof t&&t>r};exports.default=function(){function t(t){void 0===t&&(t={});var i=t.name,n=void 0===i?"default_buffer":i,a=t.indexExtractor,r=t.bufferSize,l=void 0===r?10:r,u=t.metaExtractor;this._metaExtractor=void 0===u?o:u,this._indexExtractor=a,this._name=n,this._indexToMetaMap=new Map,this._metaToPositionMap=new Map,this._positionToMetaList=[],this._metaToIndexMap=new Map,this._onTheFlyIndices=[],this._bufferSize=l,this._smallValues=new e([],this._smallerComparator),this._largeValues=new e([],this._greaterComparator),this.getNewPositionForIndex=this.getNewPositionForIndex.bind(this),this.getIndexPosition=this.getIndexPosition.bind(this),this.replaceFurthestIndexPosition=this.replaceFurthestIndexPosition.bind(this),this._isOnTheFlyFullReturnHook=s(this.setIsOnTheFlyFull.bind(this)),this._loopMS=Date.now(),this._lastUpdatedMS=this._loopMS}var u,h,p=t.prototype;return p.setIsOnTheFlyFull=function(t){if(null!=t){var e=this._onTheFlyIndices.filter((function(t){return null!=t}));this._isOnTheFlyFull=e.length===this._bufferSize}},p.resetOnTheFlies=function(){this._isOnTheFlyFull=!1,this._onTheFlyIndices=[]},p.getOnTheFlyUncriticalPosition=function(t){for(var e=t.startIndex,n=t.endIndex,s=0;s<this._onTheFlyIndices.length;s++){var a=this.getMetaIndex(this._onTheFlyIndices[s]);if(!i(e,a,n))return s}return null},p.initialize=function(){return{smallValues:new e([],this._smallerComparator),largeValues:new e([],this._greaterComparator)}},p.getIndexMeta=function(t){try{return null==t||t<0?null:this._metaExtractor(t)}catch(t){return null}},p.getMetaIndex=function(t){try{return null==t||l(t)?-1:this._indexExtractor?this._indexExtractor(t):this._metaToIndexMap.get(t)}catch(t){return-1}},p.setMetaIndex=function(t,e){return!this._indexExtractor&&this._metaToIndexMap.set(t,e)},p.deleteMetaIndex=function(t){return this._metaToIndexMap.delete(t)},p.replaceMetaToIndexMap=function(t){return!this._indexExtractor&&(this._metaToIndexMap=t)},p.getIndexPosition=function(t){return this.getMetaIndex(this.getIndexMeta(t))},p.getNewPositionForIndex=function(t){var e=this.getIndexMeta(t);void 0!==this._metaToPositionMap.get(e)&&n(!1);var i=this._positionToMetaList.length;return this._pushToHeaps(i,t),this._setMetaIndex(e,t),this._setMetaPosition(e,i),i},p._peek=function(t){return t.peek()},p._getMaxItem=function(){return this._peek(this._largeValues)},p._getMinItem=function(){return this._peek(this._smallValues)},p._getMinValue=function(){var t;return null==(t=this._peek(this._smallValues))?void 0:t.value},p._getMaxValue=function(){var t;return null==(t=this._peek(this._largeValues))?void 0:t.value},p.getMaxValue=function(){for(var t,e,i,n=[];(e=this._getMaxItem())&&l(null==(s=e)?void 0:s.value);){var s;n.push(e),this._largeValues.pop()}for(;i=n.pop();)this._largeValues.push(i);return null==(t=e)?void 0:t.value},p.getMinValue=function(){for(var t,e,i,n=[];(e=this._getMinItem())&&l(null==(s=e)?void 0:s.value);){var s;n.push(e),this._smallValues.pop()}for(;i=n.pop();)this._smallValues.push(i);return null==(t=e)?void 0:t.value},p._push=function(t,e){t.push(e)},p.getFliedPosition=function(t,e){return this._isOnTheFlyFull&&e&&i(e.startIndex,t,e.endIndex)?this.getOnTheFlyUncriticalPosition(e):null},p.getPosition=function(t,e){this.prepare();var i,n,s=this.getIndexMeta(t),a=this._metaToPositionMap.get(s);return void 0!==a?i=this.commitPosition({newIndex:t,meta:s,safeRange:e,position:a}):this.isBufferFull?this._isOnTheFlyFull?i=this.getFliedPosition(t,e):(n=this._indexToMetaMap.get(t))&&null!=this._metaToPositionMap.get(n)?i=this.commitPosition({newIndex:t,meta:s,safeRange:e,position:this._metaToPositionMap.get(n)}):(this._cleanHeaps(),i=this.commitPosition({newIndex:t,meta:s,safeRange:e,position:this._replaceFurthestIndexPosition(t,e)})):i=this.getNewPositionForIndex(t),null!=i?(this._onTheFlyIndices[i]=s,this._setMetaIndex(s,t),this._metaToPositionMap.set(s,i),this._isOnTheFlyFullReturnHook(i)):null},p.replaceFurthestIndexPosition=function(t,e){return this.isBufferFull?this._replaceFurthestIndexPosition(t,e):this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t))},p._replaceFurthestIndexPosition=function(t,e){if(this._largeValues.empty()||this._smallValues.empty())return this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t));var n,s=this._getMinValue(),a=this._getMaxValue();if(l(a)){n=a,this._largeValues.pop();var o=this._indexToMetaMap.get(n);return this._metaToPositionMap.get(o)}if(!e){Math.abs(t-s)>Math.abs(t-a)?(n=s,this._smallValues.pop()):(n=a,this._largeValues.pop());var r=this._indexToMetaMap.get(n);return this._metaToPositionMap.get(r)}var u=e.startIndex,h=e.endIndex;if(i(u,s,h)&&i(u,a,h))return null;i(u,s,h)&&!i(u,a,h)?(n=a,this._largeValues.pop()):!i(u,s,h)&&i(u,a,h)||u-s>a-h?(n=s,this._smallValues.pop()):(n=a,this._largeValues.pop());var p=this._indexToMetaMap.get(n);return this._metaToPositionMap.get(p)},p.shuffle=function(t){for(var e=this,i=new Array(this.bufferSize),n=0;n<i.length;n++){var s=this.getMetaIndex(this._onTheFlyIndices[n]||this._positionToMetaList[n]);i[n]=s}for(var o=new Array(i.length),r=[],l=new Map,u=new Map,h=function(){var t=i[p],n=e._metaExtractor(t);if(null==n)return"continue";if(l.set(t,n),u.set(n,t),n===e._positionToMetaList[p])return o[p]=n,"continue";var s=e._positionToMetaList.findIndex((function(t){return t===n}));if(-1!==s)return o[s]=n,"continue";r.push(n)},p=0;p<i.length;p++)h();var _=[];this._indexToMetaMap=l,this.replaceMetaToIndexMap(u);for(var d=0;d<i.length;d++)if(null==o[d]){var f=r.shift();null!=f&&(_[d]=f)}else _[d]=o[d];return this._positionToMetaList=_,this.getIndices(a({},t,{retry:!0}))},p.getIndices=function(t){void 0===t&&(t={retry:!1,fallback:!1});try{for(var e=t.retry,i=t.fallback,n=this.initialize(),s=n.smallValues,o=n.largeValues,r=new Array(this._positionToMetaList.length),u=new Map,h=new Map,p=new Map,_=0;_<r.length;_++){var d=i?this._onTheFlyIndices[_]:this._onTheFlyIndices[_]||this._positionToMetaList[_],f=this.getMetaIndex(d);if(!l(d)&&d!=this.getIndexMeta(f)&&!e)return this.shuffle(t);if(null!=d&&!l(d)){var c={position:_,value:f};this._push(s,c),this._push(o,c),u.set(d,_),h.set(f,d),p.set(d,f),r[_]={meta:d,targetIndex:f,recyclerKey:this._name+"_"+_}}}return this._smallValues=s,this._largeValues=o,this._metaToPositionMap=u,this._positionToMetaList=r.map((function(t){return null==t?void 0:t.meta})),this.resetOnTheFlies(),this._indexToMetaMap=h,this.replaceMetaToIndexMap(p),r}catch(e){return console.log("err ",e),this.getIndices(a({},t,{fallback:!0}))}finally{this.readyToStartNextLoop()}},p._pushToHeaps=function(t,e){var i={position:t,value:e};this._push(this._smallValues,i),this._push(this._largeValues,i)},p._setMetaPosition=function(t,e){this._positionToMetaList[e]=t,this._metaToPositionMap.set(t,e)},p.commitPosition=function(t){var e=t.newIndex,i=t.safeRange,n=t.position,s=this._onTheFlyIndices[n],a=n;if(s){if(s===t.meta)return n;if(this._isOnTheFlyFull)return this.getFliedPosition(e,i);for(a=this._replaceFurthestIndexPosition(e,i);this._onTheFlyIndices[a];)a=this._replaceFurthestIndexPosition(e,i)}return a},p._setMetaIndex=function(t,e){var i=this.getMetaIndex(t);return void 0!==i&&this._indexToMetaMap.delete(i),this.setMetaIndex(t,e),this._indexToMetaMap.set(e,t),!1},p.readyToStartNextLoop=function(){this._lastUpdatedMS=Date.now()},p.prepare=function(){this._loopMS!==this._lastUpdatedMS&&(this._loopMS=this._lastUpdatedMS,this._onTheFlyIndices=[],this._isOnTheFlyFull=!1)},p._cleanHeaps=function(){for(var t=0;t<this._positionToMetaList.length;t++)if(null==this._positionToMetaList[t])return void this._recreateHeaps();var e=Math.min(this._smallValues.size(),this._largeValues.size());Math.max(this._smallValues.size(),this._largeValues.size())>10*e&&this._recreateHeaps()},p._recreateHeaps=function(){for(var t=this.initialize(),e=t.smallValues,i=t.largeValues,n=0;n<this._positionToMetaList.length;n++){var s=this._positionToMetaList[n],a=this.getMetaIndex(s);null!=s&&-1!==a&&null!=a||(a=Number.MAX_SAFE_INTEGER-n);var o={position:n,value:a};this._push(e,o),this._push(i,o),a>r&&(this._setMetaPosition(a,n),this._setMetaIndex(a,a))}this._smallValues=e,this._largeValues=i},p._smallerComparator=function(t,e){return t.value<e.value},p._greaterComparator=function(t,e){return t.value>e.value},u=t,(h=[{key:"bufferSize",get:function(){return this._bufferSize}},{key:"isBufferFull",get:function(){return this._positionToMetaList.length>=this._bufferSize}}])&&function(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,"symbol"==typeof(s=function(t,e){if("object"!=typeof t||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key))?s:String(s),n)}var s}(u.prototype,h),Object.defineProperty(u,"prototype",{writable:!1}),t}(),exports.defaultBufferSize=10;
1
+ "use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}Object.defineProperty(exports,"__esModule",{value:!0});var e=t(require("@x-oasis/heap")),i=t(require("@x-oasis/is-clamped")),n=t(require("@x-oasis/invariant")),s=t(require("@x-oasis/return-hook"));function a(){return(a=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(t[n]=i[n])}return t}).apply(this,arguments)}var o=function(t){return t},r=Number.MAX_SAFE_INTEGER-1e5,l=function(t){return"number"==typeof t&&t>r};exports.default=function(){function t(t){void 0===t&&(t={});var e=t.type,i=void 0===e?"default_buffer":e,n=t.indexExtractor,a=t.bufferSize,r=void 0===a?10:a,l=t.metaExtractor;this._metaExtractor=void 0===l?o:l,this._indexExtractor=n,this._type=i,this.initialize(),this._bufferSize=r,this.getNewPositionForIndex=this.getNewPositionForIndex.bind(this),this.getIndexPosition=this.getIndexPosition.bind(this),this.replaceFurthestIndexPosition=this.replaceFurthestIndexPosition.bind(this),this._isOnTheFlyFullReturnHook=s(this.setIsOnTheFlyFull.bind(this)),this._loopMS=Date.now(),this._lastUpdatedMS=this._loopMS}var u,h,p=t.prototype;return p.initialize=function(){var t=this.createEmptyHeaps(),e=t.largeValues;this._smallValues=t.smallValues,this._largeValues=e,this._positionToMetaList=[],this._indexToMetaMap=new Map,this._metaToPositionMap=new Map,this._metaToIndexMap=new Map,this._onTheFlyIndices=[],this._isOnTheFlyFull=!1},p.getType=function(){return this._type},p.reset=function(){this.initialize()},p.setIsOnTheFlyFull=function(t){if(null!=t){var e=this._onTheFlyIndices.filter((function(t){return null!=t}));this._isOnTheFlyFull=e.length===this._bufferSize}},p.resetOnTheFlies=function(){this._isOnTheFlyFull=!1,this._onTheFlyIndices=[]},p.getOnTheFlyUncriticalPosition=function(t){for(var e=t.startIndex,n=t.endIndex,s=0;s<this._onTheFlyIndices.length;s++){var a=this.getMetaIndex(this._onTheFlyIndices[s]);if(!i(e,a,n))return s}return null},p.createEmptyHeaps=function(){return{smallValues:new e([],this._smallerComparator),largeValues:new e([],this._greaterComparator)}},p.getIndexMeta=function(t){try{return null==t||t<0?null:this._metaExtractor(t)}catch(t){return null}},p.getMetaIndex=function(t){try{return null==t||l(t)?-1:this._indexExtractor?this._indexExtractor(t):this._metaToIndexMap.get(t)}catch(t){return-1}},p.setMetaIndex=function(t,e){return!this._indexExtractor&&this._metaToIndexMap.set(t,e)},p.deleteMetaIndex=function(t){return this._metaToIndexMap.delete(t)},p.replaceMetaToIndexMap=function(t){return!this._indexExtractor&&(this._metaToIndexMap=t)},p.getIndexPosition=function(t){return this.getMetaIndex(this.getIndexMeta(t))},p.getNewPositionForIndex=function(t){var e=this.getIndexMeta(t);void 0!==this._metaToPositionMap.get(e)&&n(!1);var i=this._positionToMetaList.length;return this._pushToHeaps(i,t),this._setMetaIndex(e,t),this._setMetaPosition(e,i),i},p._peek=function(t){return t.peek()},p._getMaxItem=function(){return this._peek(this._largeValues)},p._getMinItem=function(){return this._peek(this._smallValues)},p._getMinValue=function(){var t;return null==(t=this._peek(this._smallValues))?void 0:t.value},p._getMaxValue=function(){var t;return null==(t=this._peek(this._largeValues))?void 0:t.value},p.getMaxValue=function(){for(var t,e,i,n=[];(e=this._getMaxItem())&&l(null==(s=e)?void 0:s.value);){var s;n.push(e),this._largeValues.pop()}for(;i=n.pop();)this._largeValues.push(i);return null==(t=e)?void 0:t.value},p.getMinValue=function(){for(var t,e,i,n=[];(e=this._getMinItem())&&l(null==(s=e)?void 0:s.value);){var s;n.push(e),this._smallValues.pop()}for(;i=n.pop();)this._smallValues.push(i);return null==(t=e)?void 0:t.value},p._push=function(t,e){t.push(e)},p.getFliedPosition=function(t,e){return this._isOnTheFlyFull&&e&&i(e.startIndex,t,e.endIndex)?this.getOnTheFlyUncriticalPosition(e):null},p.getPosition=function(t,e){this.prepare();var i,n,s=this.getIndexMeta(t),a=this._metaToPositionMap.get(s);return void 0!==a?i=this.commitPosition({newIndex:t,meta:s,safeRange:e,position:a}):this.isBufferFull?this._isOnTheFlyFull?i=this.getFliedPosition(t,e):(n=this._indexToMetaMap.get(t))&&null!=this._metaToPositionMap.get(n)?i=this.commitPosition({newIndex:t,meta:s,safeRange:e,position:this._metaToPositionMap.get(n)}):(this._cleanHeaps(),i=this.commitPosition({newIndex:t,meta:s,safeRange:e,position:this._replaceFurthestIndexPosition(t,e)})):i=this.getNewPositionForIndex(t),null!=i?(this._onTheFlyIndices[i]=s,this._setMetaIndex(s,t),this._metaToPositionMap.set(s,i),this._isOnTheFlyFullReturnHook(i)):null},p.replaceFurthestIndexPosition=function(t,e){return this.isBufferFull?this._replaceFurthestIndexPosition(t,e):this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t))},p._replaceFurthestIndexPosition=function(t,e){if(this._largeValues.empty()||this._smallValues.empty())return this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t));var n,s=this._getMinValue(),a=this._getMaxValue();if(l(a)){n=a,this._largeValues.pop();var o=this._indexToMetaMap.get(n);return this._metaToPositionMap.get(o)}if(!e){Math.abs(t-s)>Math.abs(t-a)?(n=s,this._smallValues.pop()):(n=a,this._largeValues.pop());var r=this._indexToMetaMap.get(n);return this._metaToPositionMap.get(r)}var u=e.startIndex,h=e.endIndex;if(i(u,s,h)&&i(u,a,h))return null;i(u,s,h)&&!i(u,a,h)?(n=a,this._largeValues.pop()):!i(u,s,h)&&i(u,a,h)||u-s>a-h?(n=s,this._smallValues.pop()):(n=a,this._largeValues.pop());var p=this._indexToMetaMap.get(n);return this._metaToPositionMap.get(p)},p.shuffle=function(t){for(var e=this,i=new Array(this.bufferSize),n=0;n<i.length;n++){var s=this.getMetaIndex(this._onTheFlyIndices[n]||this._positionToMetaList[n]);i[n]=s}for(var o=new Array(i.length),r=[],l=new Map,u=new Map,h=function(){var t=i[p],n=e._metaExtractor(t);if(null==n)return"continue";if(l.set(t,n),u.set(n,t),n===e._positionToMetaList[p])return o[p]=n,"continue";var s=e._positionToMetaList.findIndex((function(t){return t===n}));if(-1!==s)return o[s]=n,"continue";r.push(n)},p=0;p<i.length;p++)h();var _=[];this._indexToMetaMap=l,this.replaceMetaToIndexMap(u);for(var f=0;f<i.length;f++)if(null==o[f]){var d=r.shift();null!=d&&(_[f]=d)}else _[f]=o[f];return this._positionToMetaList=_,this.getIndices(a({},t,{retry:!0}))},p.getIndices=function(t){void 0===t&&(t={retry:!1,fallback:!1});try{for(var e=t.retry,i=t.fallback,n=this.createEmptyHeaps(),s=n.smallValues,o=n.largeValues,r=new Array(this._positionToMetaList.length),u=new Map,h=new Map,p=new Map,_=0;_<r.length;_++){var f=i?this._onTheFlyIndices[_]:this._onTheFlyIndices[_]||this._positionToMetaList[_],d=this.getMetaIndex(f);if(!l(f)&&f!=this.getIndexMeta(d)&&!e)return this.shuffle(t);if(null!=f&&!l(f)){var c={position:_,value:d};this._push(s,c),this._push(o,c),u.set(f,_),h.set(d,f),p.set(f,d),r[_]={meta:f,targetIndex:d,recyclerKey:this._type+"_"+_}}}return this._smallValues=s,this._largeValues=o,this._metaToPositionMap=u,this._positionToMetaList=r.map((function(t){return null==t?void 0:t.meta})),this.resetOnTheFlies(),this._indexToMetaMap=h,this.replaceMetaToIndexMap(p),r}catch(e){return console.log("err ",e),this.getIndices(a({},t,{fallback:!0}))}finally{this.readyToStartNextLoop()}},p._pushToHeaps=function(t,e){var i={position:t,value:e};this._push(this._smallValues,i),this._push(this._largeValues,i)},p._setMetaPosition=function(t,e){this._positionToMetaList[e]=t,this._metaToPositionMap.set(t,e)},p.commitPosition=function(t){var e=t.newIndex,i=t.safeRange,n=t.position,s=this._onTheFlyIndices[n],a=n;if(s){if(s===t.meta)return n;if(this._isOnTheFlyFull)return this.getFliedPosition(e,i);for(a=this._replaceFurthestIndexPosition(e,i);this._onTheFlyIndices[a];)a=this._replaceFurthestIndexPosition(e,i)}return a},p._setMetaIndex=function(t,e){var i=this.getMetaIndex(t);return void 0!==i&&this._indexToMetaMap.delete(i),this.setMetaIndex(t,e),this._indexToMetaMap.set(e,t),!1},p.readyToStartNextLoop=function(){this._lastUpdatedMS=Date.now()},p.prepare=function(){this._loopMS!==this._lastUpdatedMS&&(this._loopMS=this._lastUpdatedMS,this._onTheFlyIndices=[],this._isOnTheFlyFull=!1)},p._cleanHeaps=function(){for(var t=0;t<this._positionToMetaList.length;t++)if(null==this._positionToMetaList[t])return void this._recreateHeaps();var e=Math.min(this._smallValues.size(),this._largeValues.size());Math.max(this._smallValues.size(),this._largeValues.size())>10*e&&this._recreateHeaps()},p._recreateHeaps=function(){for(var t=this.createEmptyHeaps(),e=t.smallValues,i=t.largeValues,n=0;n<this._positionToMetaList.length;n++){var s=this._positionToMetaList[n],a=this.getMetaIndex(s);null!=s&&-1!==a&&null!=a||(a=Number.MAX_SAFE_INTEGER-n);var o={position:n,value:a};this._push(e,o),this._push(i,o),a>r&&(this._setMetaPosition(a,n),this._setMetaIndex(a,a))}this._smallValues=e,this._largeValues=i},p._smallerComparator=function(t,e){return t.value<e.value},p._greaterComparator=function(t,e){return t.value>e.value},u=t,(h=[{key:"bufferSize",get:function(){return this._bufferSize}},{key:"isBufferFull",get:function(){return this._positionToMetaList.length>=this._bufferSize}}])&&function(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,"symbol"==typeof(s=function(t,e){if("object"!=typeof t||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n.key))?s:String(s),n)}var s}(u.prototype,h),Object.defineProperty(u,"prototype",{writable:!1}),t}(),exports.defaultBufferSize=10;
2
2
  //# sourceMappingURL=integer-buffer-set.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"integer-buffer-set.cjs.production.min.js","sources":["../src/index.ts"],"sourcesContent":["import Heap from '@x-oasis/heap';\nimport isClamped from '@x-oasis/is-clamped';\nimport invariant from '@x-oasis/invariant';\nimport returnHook, { ReturnHook } from '@x-oasis/return-hook';\nimport {\n HeapItem,\n SafeRange,\n MetaExtractor,\n IndexExtractor,\n IntegerBufferSetProps,\n MetaToIndexMap,\n MetaToPositionMap,\n IndexToMetaMap,\n} from './types';\n\nconst defaultMetaExtractor = (value) => value;\nexport const defaultBufferSize = 10;\nconst thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;\nconst assertThresholdNumber = (val: any) =>\n typeof val === 'number' && val > thresholdNumber;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _name: string;\n private _bufferSize: number;\n\n private _indexToMetaMap: IndexToMetaMap<Meta>;\n private _metaToPositionMap: MetaToPositionMap<Meta>;\n private _positionToMetaList: Array<Meta>;\n private _metaToIndexMap: MetaToIndexMap<Meta>;\n\n private _smallValues: Heap<HeapItem>;\n private _largeValues: Heap<HeapItem>;\n private _metaExtractor: MetaExtractor<Meta>;\n private _indexExtractor: IndexExtractor<Meta>;\n\n private _onTheFlyIndices: Array<Meta>;\n\n private _isOnTheFlyFull: boolean;\n private _isOnTheFlyFullReturnHook: ReturnHook;\n\n private _loopMS: number;\n private _lastUpdatedMS: number;\n\n constructor(props: IntegerBufferSetProps<Meta> = {}) {\n const {\n name = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._name = name;\n\n /**\n * this._indexToMetaMap is used to find the prev meta when finding a position for index.\n */\n this._indexToMetaMap = new Map();\n this._metaToPositionMap = new Map();\n this._positionToMetaList = [];\n this._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n\n this._bufferSize = bufferSize;\n\n this._smallValues = new Heap([], this._smallerComparator);\n this._largeValues = new Heap([], this._greaterComparator);\n\n this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);\n this.getIndexPosition = this.getIndexPosition.bind(this);\n this.replaceFurthestIndexPosition =\n this.replaceFurthestIndexPosition.bind(this);\n this._isOnTheFlyFullReturnHook = returnHook(\n this.setIsOnTheFlyFull.bind(this)\n );\n\n this._loopMS = Date.now();\n this._lastUpdatedMS = this._loopMS;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n setIsOnTheFlyFull(val: any) {\n if (val != null) {\n const data = this._onTheFlyIndices.filter((v) => v != null);\n this._isOnTheFlyFull = data.length === this._bufferSize;\n // console.log('fly ', this._isOnTheFlyFull, data.length, this._bufferSize);\n }\n }\n\n resetOnTheFlies() {\n this._isOnTheFlyFull = false;\n this._onTheFlyIndices = [];\n }\n\n get isBufferFull() {\n return this._positionToMetaList.length >= this._bufferSize;\n }\n\n getOnTheFlyUncriticalPosition(safeRange: SafeRange) {\n const { startIndex, endIndex } = safeRange;\n for (let idx = 0; idx < this._onTheFlyIndices.length; idx++) {\n const meta = this._onTheFlyIndices[idx];\n const metaIndex = this.getMetaIndex(meta);\n if (!isClamped(startIndex, metaIndex, endIndex)) {\n return idx;\n }\n }\n return null;\n }\n\n initialize() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n try {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n } catch (err) {\n return null;\n }\n }\n\n getMetaIndex(meta: Meta) {\n try {\n if (meta == null) return -1;\n if (assertThresholdNumber(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n } catch (err) {\n return -1;\n }\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n _peek(heap: Heap) {\n return heap.peek();\n }\n\n _getMaxItem() {\n return this._peek(this._largeValues);\n }\n\n _getMinItem() {\n return this._peek(this._smallValues);\n }\n\n _getMinValue() {\n return this._peek(this._smallValues)?.value;\n }\n\n _getMaxValue() {\n return this._peek(this._largeValues)?.value;\n }\n\n // should omit thresholdNumber\n getMaxValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMaxItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._largeValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._largeValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n getMinValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMinItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._smallValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._smallValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n _push(heap: Heap, item: HeapItem) {\n heap.push(item);\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta) != null\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._getMinValue();\n const maxValue = this._getMaxValue();\n\n if (assertThresholdNumber(maxValue)) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle(options: { retry: boolean; fallback: boolean }) {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices({\n ...options,\n retry: true,\n });\n }\n\n // key point: `meta` should be preserved..\n getIndices(\n options = {\n retry: false,\n fallback: false,\n }\n ) {\n try {\n const { retry, fallback } = options;\n const { smallValues, largeValues } = this.initialize();\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = fallback\n ? this._onTheFlyIndices[idx]\n : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one item has been deleted\n if (\n !assertThresholdNumber(meta) &&\n meta != this.getIndexMeta(targetIndex) &&\n !retry\n ) {\n return this.shuffle(options);\n }\n if (meta != null && !assertThresholdNumber(meta)) {\n const item = { position: idx, value: targetIndex };\n this._push(smallValues, item);\n this._push(largeValues, item);\n metaToPositionMap.set(meta, idx);\n indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._name}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this.getIndices({\n ...options,\n fallback: true,\n });\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const item = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._push(this._smallValues, item);\n this._push(this._largeValues, item);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n if (meta == null || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const item = { position, value };\n this._push(smallValues, item);\n this._push(largeValues, item);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","thresholdNumber","Number","MAX_SAFE_INTEGER","assertThresholdNumber","val","IntegerBufferSet","props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","this","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","err","meta","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","_peek","heap","peek","_getMaxItem","_getMinItem","_getMinValue","_this$_peek","_getMaxValue","_this$_peek2","getMaxValue","item","stackItem","stack","_item","push","pop","_item2","getMinValue","_item3","_item4","_push","getFliedPosition","newIndex","getPosition","prepare","position","indexMeta","metaPosition","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","replacedMeta","Math","abs","lowValue","highValue","shuffle","options","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","positionToMetaList","shift","getIndices","_extends","retry","fallback","_this$initialize","metaToPositionMap","recyclerKey","map","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","max","_this$initialize2","lhs","rhs","key"],"mappings":"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"}
1
+ {"version":3,"file":"integer-buffer-set.cjs.production.min.js","sources":["../src/index.ts"],"sourcesContent":["import Heap from '@x-oasis/heap';\nimport isClamped from '@x-oasis/is-clamped';\nimport invariant from '@x-oasis/invariant';\nimport returnHook, { ReturnHook } from '@x-oasis/return-hook';\nimport {\n HeapItem,\n SafeRange,\n MetaExtractor,\n IndexExtractor,\n IntegerBufferSetProps,\n MetaToIndexMap,\n MetaToPositionMap,\n IndexToMetaMap,\n} from './types';\n\nconst defaultMetaExtractor = (value) => value;\nexport const defaultBufferSize = 10;\nconst thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;\nconst assertThresholdNumber = (val: any) =>\n typeof val === 'number' && val > thresholdNumber;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _type: 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 type = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._type = type;\n\n this.initialize();\n\n this._bufferSize = bufferSize;\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 initialize() {\n const { smallValues, largeValues } = this.createEmptyHeaps();\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._positionToMetaList = [];\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._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n getType() {\n return this._type;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n reset() {\n this.initialize();\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 }\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 createEmptyHeaps() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n try {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n } catch (err) {\n return null;\n }\n }\n\n getMetaIndex(meta: Meta) {\n try {\n if (meta == null) return -1;\n if (assertThresholdNumber(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n } catch (err) {\n return -1;\n }\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n _peek(heap: Heap) {\n return heap.peek();\n }\n\n _getMaxItem() {\n return this._peek(this._largeValues);\n }\n\n _getMinItem() {\n return this._peek(this._smallValues);\n }\n\n _getMinValue() {\n return this._peek(this._smallValues)?.value;\n }\n\n _getMaxValue() {\n return this._peek(this._largeValues)?.value;\n }\n\n // should omit thresholdNumber\n getMaxValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMaxItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._largeValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._largeValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n getMinValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMinItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._smallValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._smallValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n _push(heap: Heap, item: HeapItem) {\n heap.push(item);\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._type === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta) != null\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._getMinValue();\n const maxValue = this._getMaxValue();\n\n if (assertThresholdNumber(maxValue)) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle(options: { retry: boolean; fallback: boolean }) {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices({\n ...options,\n retry: true,\n });\n }\n\n // key point: `meta` should be preserved..\n getIndices(\n options = {\n retry: false,\n fallback: false,\n }\n ) {\n try {\n const { retry, fallback } = options;\n const { smallValues, largeValues } = this.createEmptyHeaps();\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = fallback\n ? this._onTheFlyIndices[idx]\n : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one item has been deleted\n if (\n !assertThresholdNumber(meta) &&\n meta != this.getIndexMeta(targetIndex) &&\n !retry\n ) {\n return this.shuffle(options);\n }\n if (meta != null && !assertThresholdNumber(meta)) {\n const item = { position: idx, value: targetIndex };\n this._push(smallValues, item);\n this._push(largeValues, item);\n metaToPositionMap.set(meta, idx);\n indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._type}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this.getIndices({\n ...options,\n fallback: true,\n });\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const item = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._push(this._smallValues, item);\n this._push(this._largeValues, item);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.createEmptyHeaps();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n if (meta == null || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const item = { position, value };\n this._push(smallValues, item);\n this._push(largeValues, item);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","thresholdNumber","Number","MAX_SAFE_INTEGER","assertThresholdNumber","val","IntegerBufferSet","props","_props$type","type","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","this","_metaExtractor","_indexExtractor","_type","initialize","_bufferSize","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","_this$createEmptyHeap","createEmptyHeaps","largeValues","_smallValues","smallValues","_largeValues","_positionToMetaList","_indexToMetaMap","Map","_metaToPositionMap","_metaToIndexMap","_onTheFlyIndices","_isOnTheFlyFull","getType","reset","data","filter","v","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","metaIndex","getMetaIndex","isClamped","Heap","_smallerComparator","_greaterComparator","getIndexMeta","index","err","meta","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","_peek","heap","peek","_getMaxItem","_getMinItem","_getMinValue","_this$_peek","_getMaxValue","_this$_peek2","getMaxValue","item","stackItem","stack","_item","push","pop","_item2","getMinValue","_item3","_item4","_push","getFliedPosition","newIndex","getPosition","prepare","position","indexMeta","metaPosition","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","replacedMeta","Math","abs","lowValue","highValue","shuffle","options","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","positionToMetaList","shift","getIndices","_extends","retry","fallback","_this$createEmptyHeap2","metaToPositionMap","recyclerKey","map","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","max","_this$createEmptyHeap3","lhs","rhs","key"],"mappings":"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"}
@@ -63,8 +63,8 @@ var IntegerBufferSet = /*#__PURE__*/function () {
63
63
  props = {};
64
64
  }
65
65
  var _props = props,
66
- _props$name = _props.name,
67
- name = _props$name === void 0 ? 'default_buffer' : _props$name,
66
+ _props$type = _props.type,
67
+ type = _props$type === void 0 ? 'default_buffer' : _props$type,
68
68
  indexExtractor = _props.indexExtractor,
69
69
  _props$bufferSize = _props.bufferSize,
70
70
  bufferSize = _props$bufferSize === void 0 ? defaultBufferSize : _props$bufferSize,
@@ -72,15 +72,9 @@ var IntegerBufferSet = /*#__PURE__*/function () {
72
72
  metaExtractor = _props$metaExtractor === void 0 ? defaultMetaExtractor : _props$metaExtractor;
73
73
  this._metaExtractor = metaExtractor;
74
74
  this._indexExtractor = indexExtractor;
75
- this._name = name;
76
- this._indexToMetaMap = new Map();
77
- this._metaToPositionMap = new Map();
78
- this._positionToMetaList = [];
79
- this._metaToIndexMap = new Map();
80
- this._onTheFlyIndices = [];
75
+ this._type = type;
76
+ this.initialize();
81
77
  this._bufferSize = bufferSize;
82
- this._smallValues = new Heap([], this._smallerComparator);
83
- this._largeValues = new Heap([], this._greaterComparator);
84
78
  this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);
85
79
  this.getIndexPosition = this.getIndexPosition.bind(this);
86
80
  this.replaceFurthestIndexPosition = this.replaceFurthestIndexPosition.bind(this);
@@ -89,6 +83,25 @@ var IntegerBufferSet = /*#__PURE__*/function () {
89
83
  this._lastUpdatedMS = this._loopMS;
90
84
  }
91
85
  var _proto = IntegerBufferSet.prototype;
86
+ _proto.initialize = function initialize() {
87
+ var _this$createEmptyHeap = this.createEmptyHeaps(),
88
+ smallValues = _this$createEmptyHeap.smallValues,
89
+ largeValues = _this$createEmptyHeap.largeValues;
90
+ this._smallValues = smallValues;
91
+ this._largeValues = largeValues;
92
+ this._positionToMetaList = [];
93
+ this._indexToMetaMap = new Map();
94
+ this._metaToPositionMap = new Map();
95
+ this._metaToIndexMap = new Map();
96
+ this._onTheFlyIndices = [];
97
+ this._isOnTheFlyFull = false;
98
+ };
99
+ _proto.getType = function getType() {
100
+ return this._type;
101
+ };
102
+ _proto.reset = function reset() {
103
+ this.initialize();
104
+ };
92
105
  _proto.setIsOnTheFlyFull = function setIsOnTheFlyFull(val) {
93
106
  if (val != null) {
94
107
  var data = this._onTheFlyIndices.filter(function (v) {
@@ -113,7 +126,7 @@ var IntegerBufferSet = /*#__PURE__*/function () {
113
126
  }
114
127
  return null;
115
128
  };
116
- _proto.initialize = function initialize() {
129
+ _proto.createEmptyHeaps = function createEmptyHeaps() {
117
130
  return {
118
131
  smallValues: new Heap([], this._smallerComparator),
119
132
  largeValues: new Heap([], this._greaterComparator)
@@ -379,9 +392,9 @@ var IntegerBufferSet = /*#__PURE__*/function () {
379
392
  var _options = options,
380
393
  retry = _options.retry,
381
394
  fallback = _options.fallback;
382
- var _this$initialize = this.initialize(),
383
- smallValues = _this$initialize.smallValues,
384
- largeValues = _this$initialize.largeValues;
395
+ var _this$createEmptyHeap2 = this.createEmptyHeaps(),
396
+ smallValues = _this$createEmptyHeap2.smallValues,
397
+ largeValues = _this$createEmptyHeap2.largeValues;
385
398
  var indices = new Array(this._positionToMetaList.length);
386
399
  var metaToPositionMap = new Map();
387
400
  var indexToMetaMap = new Map();
@@ -405,7 +418,7 @@ var IntegerBufferSet = /*#__PURE__*/function () {
405
418
  indices[idx] = {
406
419
  meta: meta,
407
420
  targetIndex: targetIndex,
408
- recyclerKey: this._name + "_" + idx
421
+ recyclerKey: this._type + "_" + idx
409
422
  };
410
423
  }
411
424
  }
@@ -489,9 +502,9 @@ var IntegerBufferSet = /*#__PURE__*/function () {
489
502
  }
490
503
  };
491
504
  _proto._recreateHeaps = function _recreateHeaps() {
492
- var _this$initialize2 = this.initialize(),
493
- smallValues = _this$initialize2.smallValues,
494
- largeValues = _this$initialize2.largeValues;
505
+ var _this$createEmptyHeap3 = this.createEmptyHeaps(),
506
+ smallValues = _this$createEmptyHeap3.smallValues,
507
+ largeValues = _this$createEmptyHeap3.largeValues;
495
508
  for (var position = 0; position < this._positionToMetaList.length; position++) {
496
509
  var meta = this._positionToMetaList[position];
497
510
  var value = this.getMetaIndex(meta);
@@ -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;\nconst assertThresholdNumber = (val: any) =>\n typeof val === 'number' && val > thresholdNumber;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _name: string;\n private _bufferSize: number;\n\n private _indexToMetaMap: IndexToMetaMap<Meta>;\n private _metaToPositionMap: MetaToPositionMap<Meta>;\n private _positionToMetaList: Array<Meta>;\n private _metaToIndexMap: MetaToIndexMap<Meta>;\n\n private _smallValues: Heap<HeapItem>;\n private _largeValues: Heap<HeapItem>;\n private _metaExtractor: MetaExtractor<Meta>;\n private _indexExtractor: IndexExtractor<Meta>;\n\n private _onTheFlyIndices: Array<Meta>;\n\n private _isOnTheFlyFull: boolean;\n private _isOnTheFlyFullReturnHook: ReturnHook;\n\n private _loopMS: number;\n private _lastUpdatedMS: number;\n\n constructor(props: IntegerBufferSetProps<Meta> = {}) {\n const {\n name = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._name = name;\n\n /**\n * this._indexToMetaMap is used to find the prev meta when finding a position for index.\n */\n this._indexToMetaMap = new Map();\n this._metaToPositionMap = new Map();\n this._positionToMetaList = [];\n this._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n\n this._bufferSize = bufferSize;\n\n this._smallValues = new Heap([], this._smallerComparator);\n this._largeValues = new Heap([], this._greaterComparator);\n\n this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);\n this.getIndexPosition = this.getIndexPosition.bind(this);\n this.replaceFurthestIndexPosition =\n this.replaceFurthestIndexPosition.bind(this);\n this._isOnTheFlyFullReturnHook = returnHook(\n this.setIsOnTheFlyFull.bind(this)\n );\n\n this._loopMS = Date.now();\n this._lastUpdatedMS = this._loopMS;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n setIsOnTheFlyFull(val: any) {\n if (val != null) {\n const data = this._onTheFlyIndices.filter((v) => v != null);\n this._isOnTheFlyFull = data.length === this._bufferSize;\n // console.log('fly ', this._isOnTheFlyFull, data.length, this._bufferSize);\n }\n }\n\n resetOnTheFlies() {\n this._isOnTheFlyFull = false;\n this._onTheFlyIndices = [];\n }\n\n get isBufferFull() {\n return this._positionToMetaList.length >= this._bufferSize;\n }\n\n getOnTheFlyUncriticalPosition(safeRange: SafeRange) {\n const { startIndex, endIndex } = safeRange;\n for (let idx = 0; idx < this._onTheFlyIndices.length; idx++) {\n const meta = this._onTheFlyIndices[idx];\n const metaIndex = this.getMetaIndex(meta);\n if (!isClamped(startIndex, metaIndex, endIndex)) {\n return idx;\n }\n }\n return null;\n }\n\n initialize() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n try {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n } catch (err) {\n return null;\n }\n }\n\n getMetaIndex(meta: Meta) {\n try {\n if (meta == null) return -1;\n if (assertThresholdNumber(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n } catch (err) {\n return -1;\n }\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n _peek(heap: Heap) {\n return heap.peek();\n }\n\n _getMaxItem() {\n return this._peek(this._largeValues);\n }\n\n _getMinItem() {\n return this._peek(this._smallValues);\n }\n\n _getMinValue() {\n return this._peek(this._smallValues)?.value;\n }\n\n _getMaxValue() {\n return this._peek(this._largeValues)?.value;\n }\n\n // should omit thresholdNumber\n getMaxValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMaxItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._largeValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._largeValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n getMinValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMinItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._smallValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._smallValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n _push(heap: Heap, item: HeapItem) {\n heap.push(item);\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta) != null\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._getMinValue();\n const maxValue = this._getMaxValue();\n\n if (assertThresholdNumber(maxValue)) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle(options: { retry: boolean; fallback: boolean }) {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices({\n ...options,\n retry: true,\n });\n }\n\n // key point: `meta` should be preserved..\n getIndices(\n options = {\n retry: false,\n fallback: false,\n }\n ) {\n try {\n const { retry, fallback } = options;\n const { smallValues, largeValues } = this.initialize();\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = fallback\n ? this._onTheFlyIndices[idx]\n : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one item has been deleted\n if (\n !assertThresholdNumber(meta) &&\n meta != this.getIndexMeta(targetIndex) &&\n !retry\n ) {\n return this.shuffle(options);\n }\n if (meta != null && !assertThresholdNumber(meta)) {\n const item = { position: idx, value: targetIndex };\n this._push(smallValues, item);\n this._push(largeValues, item);\n metaToPositionMap.set(meta, idx);\n indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._name}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this.getIndices({\n ...options,\n fallback: true,\n });\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const item = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._push(this._smallValues, item);\n this._push(this._largeValues, item);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n if (meta == null || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const item = { position, value };\n this._push(smallValues, item);\n this._push(largeValues, item);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","defaultBufferSize","thresholdNumber","Number","MAX_SAFE_INTEGER","assertThresholdNumber","val","IntegerBufferSet","props","_props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","meta","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","err","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","process","env","NODE_ENV","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","_peek","heap","peek","_getMaxItem","_getMinItem","_getMinValue","_this$_peek","_getMaxValue","_this$_peek2","getMaxValue","stack","item","_item","push","pop","stackItem","_item2","getMinValue","_item3","_item4","_push","getFliedPosition","newIndex","getPosition","prepare","metaPosition","position","indexMeta","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","replacedMeta","Math","abs","lowValue","highValue","shuffle","options","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","_ret","positionToMetaList","shift","getIndices","_extends","retry","fallback","_options","_this$initialize","metaToPositionMap","recyclerKey","map","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","lhs","rhs","_createClass","key"],"mappings":"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"}
1
+ {"version":3,"file":"integer-buffer-set.esm.js","sources":["../src/index.ts"],"sourcesContent":["import Heap from '@x-oasis/heap';\nimport isClamped from '@x-oasis/is-clamped';\nimport invariant from '@x-oasis/invariant';\nimport returnHook, { ReturnHook } from '@x-oasis/return-hook';\nimport {\n HeapItem,\n SafeRange,\n MetaExtractor,\n IndexExtractor,\n IntegerBufferSetProps,\n MetaToIndexMap,\n MetaToPositionMap,\n IndexToMetaMap,\n} from './types';\n\nconst defaultMetaExtractor = (value) => value;\nexport const defaultBufferSize = 10;\nconst thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;\nconst assertThresholdNumber = (val: any) =>\n typeof val === 'number' && val > thresholdNumber;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _type: 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 type = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._type = type;\n\n this.initialize();\n\n this._bufferSize = bufferSize;\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 initialize() {\n const { smallValues, largeValues } = this.createEmptyHeaps();\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._positionToMetaList = [];\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._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n getType() {\n return this._type;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n reset() {\n this.initialize();\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 }\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 createEmptyHeaps() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n try {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n } catch (err) {\n return null;\n }\n }\n\n getMetaIndex(meta: Meta) {\n try {\n if (meta == null) return -1;\n if (assertThresholdNumber(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n } catch (err) {\n return -1;\n }\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n _peek(heap: Heap) {\n return heap.peek();\n }\n\n _getMaxItem() {\n return this._peek(this._largeValues);\n }\n\n _getMinItem() {\n return this._peek(this._smallValues);\n }\n\n _getMinValue() {\n return this._peek(this._smallValues)?.value;\n }\n\n _getMaxValue() {\n return this._peek(this._largeValues)?.value;\n }\n\n // should omit thresholdNumber\n getMaxValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMaxItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._largeValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._largeValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n getMinValue() {\n const stack = [];\n let item;\n\n while ((item = this._getMinItem()) && assertThresholdNumber(item?.value)) {\n stack.push(item);\n this._smallValues.pop();\n }\n\n let stackItem;\n while ((stackItem = stack.pop())) {\n this._smallValues.push(stackItem);\n }\n\n return item?.value;\n }\n\n _push(heap: Heap, item: HeapItem) {\n heap.push(item);\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._type === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta) != null\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._getMinValue();\n const maxValue = this._getMaxValue();\n\n if (assertThresholdNumber(maxValue)) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle(options: { retry: boolean; fallback: boolean }) {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices({\n ...options,\n retry: true,\n });\n }\n\n // key point: `meta` should be preserved..\n getIndices(\n options = {\n retry: false,\n fallback: false,\n }\n ) {\n try {\n const { retry, fallback } = options;\n const { smallValues, largeValues } = this.createEmptyHeaps();\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = fallback\n ? this._onTheFlyIndices[idx]\n : this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one item has been deleted\n if (\n !assertThresholdNumber(meta) &&\n meta != this.getIndexMeta(targetIndex) &&\n !retry\n ) {\n return this.shuffle(options);\n }\n if (meta != null && !assertThresholdNumber(meta)) {\n const item = { position: idx, value: targetIndex };\n this._push(smallValues, item);\n this._push(largeValues, item);\n metaToPositionMap.set(meta, idx);\n indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._type}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this.getIndices({\n ...options,\n fallback: true,\n });\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const item = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._push(this._smallValues, item);\n this._push(this._largeValues, item);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.createEmptyHeaps();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n if (meta == null || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const item = { position, value };\n this._push(smallValues, item);\n this._push(largeValues, item);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","defaultBufferSize","thresholdNumber","Number","MAX_SAFE_INTEGER","assertThresholdNumber","val","IntegerBufferSet","props","_props","_props$type","type","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","_metaExtractor","_indexExtractor","_type","initialize","_bufferSize","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","_this$createEmptyHeap","createEmptyHeaps","smallValues","largeValues","_smallValues","_largeValues","_positionToMetaList","_indexToMetaMap","Map","_metaToPositionMap","_metaToIndexMap","_onTheFlyIndices","_isOnTheFlyFull","getType","reset","data","filter","v","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","meta","metaIndex","getMetaIndex","isClamped","Heap","_smallerComparator","_greaterComparator","getIndexMeta","index","err","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","process","env","NODE_ENV","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","_peek","heap","peek","_getMaxItem","_getMinItem","_getMinValue","_this$_peek","_getMaxValue","_this$_peek2","getMaxValue","stack","item","_item","push","pop","stackItem","_item2","getMinValue","_item3","_item4","_push","getFliedPosition","newIndex","getPosition","prepare","metaPosition","position","indexMeta","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","replacedMeta","Math","abs","lowValue","highValue","shuffle","options","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","_ret","positionToMetaList","shift","getIndices","_extends","retry","fallback","_options","_this$createEmptyHeap2","metaToPositionMap","recyclerKey","map","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$createEmptyHeap3","lhs","rhs","_createClass","key"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -4,7 +4,7 @@ export declare type IndexToMetaMap<T> = Map<number, T>;
4
4
  export declare type MetaExtractor<T> = (index: number) => T;
5
5
  export declare type IndexExtractor<T> = (meta: T) => number;
6
6
  export declare type IntegerBufferSetProps<T> = {
7
- name?: string;
7
+ type?: string;
8
8
  bufferSize?: number;
9
9
  metaExtractor?: MetaExtractor<T>;
10
10
  indexExtractor?: IndexExtractor<T>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x-oasis/integer-buffer-set",
3
- "version": "0.1.30",
3
+ "version": "0.1.31",
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.30",
19
+ "@x-oasis/heap": "0.1.31",
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
@@ -37,7 +37,7 @@ const assertThresholdNumber = (val: any) =>
37
37
  // the set.
38
38
  // feature: add / delete / update item will also in consider..
39
39
  class IntegerBufferSet<Meta = any> {
40
- private _name: string;
40
+ private _type: string;
41
41
  private _bufferSize: number;
42
42
 
43
43
  private _indexToMetaMap: IndexToMetaMap<Meta>;
@@ -60,7 +60,7 @@ class IntegerBufferSet<Meta = any> {
60
60
 
61
61
  constructor(props: IntegerBufferSetProps<Meta> = {}) {
62
62
  const {
63
- name = 'default_buffer',
63
+ type = 'default_buffer',
64
64
  indexExtractor,
65
65
  bufferSize = defaultBufferSize,
66
66
  metaExtractor = defaultMetaExtractor,
@@ -68,22 +68,12 @@ class IntegerBufferSet<Meta = any> {
68
68
  this._metaExtractor = metaExtractor;
69
69
  this._indexExtractor = indexExtractor;
70
70
 
71
- this._name = name;
71
+ this._type = type;
72
72
 
73
- /**
74
- * this._indexToMetaMap is used to find the prev meta when finding a position for index.
75
- */
76
- this._indexToMetaMap = new Map();
77
- this._metaToPositionMap = new Map();
78
- this._positionToMetaList = [];
79
- this._metaToIndexMap = new Map();
80
- this._onTheFlyIndices = [];
73
+ this.initialize();
81
74
 
82
75
  this._bufferSize = bufferSize;
83
76
 
84
- this._smallValues = new Heap([], this._smallerComparator);
85
- this._largeValues = new Heap([], this._greaterComparator);
86
-
87
77
  this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);
88
78
  this.getIndexPosition = this.getIndexPosition.bind(this);
89
79
  this.replaceFurthestIndexPosition =
@@ -96,15 +86,37 @@ class IntegerBufferSet<Meta = any> {
96
86
  this._lastUpdatedMS = this._loopMS;
97
87
  }
98
88
 
89
+ initialize() {
90
+ const { smallValues, largeValues } = this.createEmptyHeaps();
91
+ this._smallValues = smallValues;
92
+ this._largeValues = largeValues;
93
+ this._positionToMetaList = [];
94
+ /**
95
+ * this._indexToMetaMap is used to find the prev meta when finding a position for index.
96
+ */
97
+ this._indexToMetaMap = new Map();
98
+ this._metaToPositionMap = new Map();
99
+ this._metaToIndexMap = new Map();
100
+ this._onTheFlyIndices = [];
101
+ this._isOnTheFlyFull = false;
102
+ }
103
+
104
+ getType() {
105
+ return this._type;
106
+ }
107
+
99
108
  get bufferSize() {
100
109
  return this._bufferSize;
101
110
  }
102
111
 
112
+ reset() {
113
+ this.initialize();
114
+ }
115
+
103
116
  setIsOnTheFlyFull(val: any) {
104
117
  if (val != null) {
105
118
  const data = this._onTheFlyIndices.filter((v) => v != null);
106
119
  this._isOnTheFlyFull = data.length === this._bufferSize;
107
- // console.log('fly ', this._isOnTheFlyFull, data.length, this._bufferSize);
108
120
  }
109
121
  }
110
122
 
@@ -129,7 +141,7 @@ class IntegerBufferSet<Meta = any> {
129
141
  return null;
130
142
  }
131
143
 
132
- initialize() {
144
+ createEmptyHeaps() {
133
145
  return {
134
146
  smallValues: new Heap([], this._smallerComparator),
135
147
  largeValues: new Heap([], this._greaterComparator),
@@ -284,7 +296,7 @@ class IntegerBufferSet<Meta = any> {
284
296
  const metaPosition = this._metaToPositionMap.get(meta);
285
297
  let position, indexMeta;
286
298
 
287
- // if (this._name === 'normal_goods')
299
+ // if (this._type === 'normal_goods')
288
300
  // console.log(
289
301
  // 'getPosition ',
290
302
  // newIndex,
@@ -517,7 +529,7 @@ class IntegerBufferSet<Meta = any> {
517
529
  ) {
518
530
  try {
519
531
  const { retry, fallback } = options;
520
- const { smallValues, largeValues } = this.initialize();
532
+ const { smallValues, largeValues } = this.createEmptyHeaps();
521
533
  const indices = new Array(this._positionToMetaList.length);
522
534
  const metaToPositionMap = new Map();
523
535
  const indexToMetaMap = new Map();
@@ -545,7 +557,7 @@ class IntegerBufferSet<Meta = any> {
545
557
  indices[idx] = {
546
558
  meta,
547
559
  targetIndex,
548
- recyclerKey: `${this._name}_${idx}`,
560
+ recyclerKey: `${this._type}_${idx}`,
549
561
  };
550
562
  }
551
563
  }
@@ -670,7 +682,7 @@ class IntegerBufferSet<Meta = any> {
670
682
  }
671
683
  }
672
684
  _recreateHeaps() {
673
- const { smallValues, largeValues } = this.initialize();
685
+ const { smallValues, largeValues } = this.createEmptyHeaps();
674
686
  for (
675
687
  let position = 0;
676
688
  position < this._positionToMetaList.length;
package/src/types.ts CHANGED
@@ -13,7 +13,7 @@ export type IndexToMetaMap<T> = Map<number, T>;
13
13
  export type MetaExtractor<T> = (index: number) => T;
14
14
  export type IndexExtractor<T> = (meta: T) => number;
15
15
  export type IntegerBufferSetProps<T> = {
16
- name?: string;
16
+ type?: string;
17
17
  bufferSize?: number;
18
18
  metaExtractor?: MetaExtractor<T>;
19
19
  indexExtractor?: IndexExtractor<T>;