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

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.
@@ -181,7 +181,7 @@ var IntegerBufferSet = /*#__PURE__*/function () {
181
181
  position = this.getNewPositionForIndex(newIndex);
182
182
  } else if (this._isOnTheFlyFull) {
183
183
  position = this.getFliedPosition(newIndex, safeRange);
184
- } else if ((indexMeta = this._indexToMetaMap.get(newIndex)) && this._metaToPositionMap.get(indexMeta)) {
184
+ } else if ((indexMeta = this._indexToMetaMap.get(newIndex)) && this._metaToPositionMap.get(indexMeta) != null) {
185
185
  position = this.commitPosition({
186
186
  newIndex: newIndex,
187
187
  meta: meta,
@@ -316,6 +316,8 @@ var IntegerBufferSet = /*#__PURE__*/function () {
316
316
  try {
317
317
  var indices = new Array(this._positionToMetaList.length);
318
318
  var metaToPositionMap = new Map();
319
+ var indexToMetaMap = new Map();
320
+ var metaToIndexMap = new Map();
319
321
  for (var idx = 0; idx < indices.length; idx++) {
320
322
  var meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
321
323
  var targetIndex = this.getMetaIndex(meta);
@@ -330,6 +332,8 @@ var IntegerBufferSet = /*#__PURE__*/function () {
330
332
  smallValues.push(element);
331
333
  largeValues.push(element);
332
334
  metaToPositionMap.set(meta, idx);
335
+ indexToMetaMap.set(targetIndex, meta);
336
+ metaToIndexMap.set(meta, targetIndex);
333
337
  indices[idx] = {
334
338
  meta: meta,
335
339
  targetIndex: targetIndex,
@@ -344,6 +348,8 @@ var IntegerBufferSet = /*#__PURE__*/function () {
344
348
  return v == null ? void 0 : v.meta;
345
349
  });
346
350
  this.resetOnTheFlies();
351
+ this._indexToMetaMap = indexToMetaMap;
352
+ this.replaceMetaToIndexMap(metaToIndexMap);
347
353
  return indices;
348
354
  } catch (err) {
349
355
  console.log('err ', err);
@@ -433,7 +439,6 @@ var IntegerBufferSet = /*#__PURE__*/function () {
433
439
  this._setMetaIndex(value, value);
434
440
  }
435
441
  }
436
- this._largeValues.peek().value;
437
442
  this._smallValues = smallValues;
438
443
  this._largeValues = largeValues;
439
444
  };
@@ -1 +1 @@
1
- {"version":3,"file":"integer-buffer-set.cjs.development.js","sources":["../src/index.ts"],"sourcesContent":["import Heap from '@x-oasis/heap';\nimport isClamped from '@x-oasis/is-clamped';\nimport invariant from '@x-oasis/invariant';\nimport returnHook, { ReturnHook } from '@x-oasis/return-hook';\nimport {\n HeapItem,\n SafeRange,\n MetaExtractor,\n IndexExtractor,\n IntegerBufferSetProps,\n MetaToIndexMap,\n MetaToPositionMap,\n IndexToMetaMap,\n} from './types';\n\nconst defaultMetaExtractor = (value) => value;\nexport const defaultBufferSize = 10;\nconst thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _name: string;\n private _bufferSize: number;\n\n private _indexToMetaMap: IndexToMetaMap<Meta>;\n private _metaToPositionMap: MetaToPositionMap<Meta>;\n private _positionToMetaList: Array<Meta>;\n private _metaToIndexMap: MetaToIndexMap<Meta>;\n\n private _smallValues: Heap<HeapItem>;\n private _largeValues: Heap<HeapItem>;\n private _metaExtractor: MetaExtractor<Meta>;\n private _indexExtractor: IndexExtractor<Meta>;\n\n private _onTheFlyIndices: Array<Meta>;\n\n private _isOnTheFlyFull: boolean;\n private _isOnTheFlyFullReturnHook: ReturnHook;\n\n private _loopMS: number;\n private _lastUpdatedMS: number;\n\n constructor(props: IntegerBufferSetProps<Meta> = {}) {\n const {\n name = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._name = name;\n\n /**\n * this._indexToMetaMap is used to find the prev meta when finding a position for index.\n */\n this._indexToMetaMap = new Map();\n this._metaToPositionMap = new Map();\n this._positionToMetaList = [];\n this._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n\n this._bufferSize = bufferSize;\n\n this._smallValues = new Heap([], this._smallerComparator);\n this._largeValues = new Heap([], this._greaterComparator);\n\n this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);\n this.getIndexPosition = this.getIndexPosition.bind(this);\n this.replaceFurthestIndexPosition =\n this.replaceFurthestIndexPosition.bind(this);\n this._isOnTheFlyFullReturnHook = returnHook(\n this.setIsOnTheFlyFull.bind(this)\n );\n\n this._loopMS = Date.now();\n this._lastUpdatedMS = this._loopMS;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n isThresholdMeta(meta) {\n if (typeof meta === 'number' && meta > thresholdNumber) return true;\n return false;\n }\n\n setIsOnTheFlyFull(val: any) {\n if (val != null) {\n const data = this._onTheFlyIndices.filter((v) => v != null);\n this._isOnTheFlyFull = data.length === this._bufferSize;\n // console.log('fly ', this._isOnTheFlyFull, data.length, this._bufferSize);\n }\n }\n\n resetOnTheFlies() {\n this._isOnTheFlyFull = false;\n this._onTheFlyIndices = [];\n }\n\n get isBufferFull() {\n return this._positionToMetaList.length >= this._bufferSize;\n }\n\n getOnTheFlyUncriticalPosition(safeRange: SafeRange) {\n const { startIndex, endIndex } = safeRange;\n for (let idx = 0; idx < this._onTheFlyIndices.length; idx++) {\n const meta = this._onTheFlyIndices[idx];\n const metaIndex = this.getMetaIndex(meta);\n if (!isClamped(startIndex, metaIndex, endIndex)) {\n return idx;\n }\n }\n return null;\n }\n\n initialize() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n }\n\n getMetaIndex(meta: Meta) {\n if (meta == null) return -1;\n if (this.isThresholdMeta(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n getMinValue() {\n return this._smallValues.peek()?.value;\n }\n\n getMaxValue() {\n return this._largeValues.peek()?.value;\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta)\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n // console.log('commeit ---')\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._smallValues.peek()!.value;\n const maxValue = this._largeValues.peek()!.value;\n\n // console.log('mathc ', maxValue, maxValue > thresholdNumber)\n if (maxValue > thresholdNumber) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle() {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices();\n }\n\n // key point: `meta` should be preserved..\n getIndices() {\n const { smallValues, largeValues } = this.initialize();\n\n try {\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta =\n this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one element has been deleted\n if (\n !this.isThresholdMeta(meta) &&\n meta != this.getIndexMeta(targetIndex)\n ) {\n return this.shuffle();\n }\n if (meta != null && !this.isThresholdMeta(meta)) {\n const element = { position: idx, value: targetIndex };\n smallValues.push(element);\n largeValues.push(element);\n metaToPositionMap.set(meta, idx);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._name}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this._positionToMetaList;\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const element = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._smallValues.push(element);\n this._largeValues.push(element);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n // console.log('position ', newIndex, position);\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n // this._cleanHeap(this._smallValues);\n // this._cleanHeap(this._largeValues);\n\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n\n if (!meta || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const element = { position, value };\n smallValues.push(element);\n largeValues.push(element);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n\n this._largeValues.peek().value;\n\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n // _cleanHeap(heap: Heap<HeapItem>) {\n // while (\n // !heap.empty() &&\n // this._metaToPositionMap.get(\n // this._indexToMetaMap.get(heap.peek()!.value)\n // ) == null\n // ) {\n // console.log('pop ---', heap.peek()!.value);\n // heap.pop();\n // }\n // }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","defaultBufferSize","thresholdNumber","Number","MAX_SAFE_INTEGER","IntegerBufferSet","props","_props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","isThresholdMeta","meta","val","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","getMinValue","_this$_smallValues$pe","peek","getMaxValue","_this$_largeValues$pe","getFliedPosition","newIndex","getPosition","prepare","metaPosition","position","indexMeta","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","pop","replacedMeta","Math","abs","lowValue","highValue","shuffle","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","_ret","positionToMetaList","shift","getIndices","_this$initialize","metaToPositionMap","element","recyclerKey","map","err","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","lhs","rhs","_createClass","key"],"mappings":"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"}
1
+ {"version":3,"file":"integer-buffer-set.cjs.development.js","sources":["../src/index.ts"],"sourcesContent":["import Heap from '@x-oasis/heap';\nimport isClamped from '@x-oasis/is-clamped';\nimport invariant from '@x-oasis/invariant';\nimport returnHook, { ReturnHook } from '@x-oasis/return-hook';\nimport {\n HeapItem,\n SafeRange,\n MetaExtractor,\n IndexExtractor,\n IntegerBufferSetProps,\n MetaToIndexMap,\n MetaToPositionMap,\n IndexToMetaMap,\n} from './types';\n\nconst defaultMetaExtractor = (value) => value;\nexport const defaultBufferSize = 10;\nconst thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _name: string;\n private _bufferSize: number;\n\n private _indexToMetaMap: IndexToMetaMap<Meta>;\n private _metaToPositionMap: MetaToPositionMap<Meta>;\n private _positionToMetaList: Array<Meta>;\n private _metaToIndexMap: MetaToIndexMap<Meta>;\n\n private _smallValues: Heap<HeapItem>;\n private _largeValues: Heap<HeapItem>;\n private _metaExtractor: MetaExtractor<Meta>;\n private _indexExtractor: IndexExtractor<Meta>;\n\n private _onTheFlyIndices: Array<Meta>;\n\n private _isOnTheFlyFull: boolean;\n private _isOnTheFlyFullReturnHook: ReturnHook;\n\n private _loopMS: number;\n private _lastUpdatedMS: number;\n\n constructor(props: IntegerBufferSetProps<Meta> = {}) {\n const {\n name = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._name = name;\n\n /**\n * this._indexToMetaMap is used to find the prev meta when finding a position for index.\n */\n this._indexToMetaMap = new Map();\n this._metaToPositionMap = new Map();\n this._positionToMetaList = [];\n this._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n\n this._bufferSize = bufferSize;\n\n this._smallValues = new Heap([], this._smallerComparator);\n this._largeValues = new Heap([], this._greaterComparator);\n\n this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);\n this.getIndexPosition = this.getIndexPosition.bind(this);\n this.replaceFurthestIndexPosition =\n this.replaceFurthestIndexPosition.bind(this);\n this._isOnTheFlyFullReturnHook = returnHook(\n this.setIsOnTheFlyFull.bind(this)\n );\n\n this._loopMS = Date.now();\n this._lastUpdatedMS = this._loopMS;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n isThresholdMeta(meta) {\n if (typeof meta === 'number' && meta > thresholdNumber) return true;\n return false;\n }\n\n setIsOnTheFlyFull(val: any) {\n if (val != null) {\n const data = this._onTheFlyIndices.filter((v) => v != null);\n this._isOnTheFlyFull = data.length === this._bufferSize;\n // console.log('fly ', this._isOnTheFlyFull, data.length, this._bufferSize);\n }\n }\n\n resetOnTheFlies() {\n this._isOnTheFlyFull = false;\n this._onTheFlyIndices = [];\n }\n\n get isBufferFull() {\n return this._positionToMetaList.length >= this._bufferSize;\n }\n\n getOnTheFlyUncriticalPosition(safeRange: SafeRange) {\n const { startIndex, endIndex } = safeRange;\n for (let idx = 0; idx < this._onTheFlyIndices.length; idx++) {\n const meta = this._onTheFlyIndices[idx];\n const metaIndex = this.getMetaIndex(meta);\n if (!isClamped(startIndex, metaIndex, endIndex)) {\n return idx;\n }\n }\n return null;\n }\n\n initialize() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n }\n\n getMetaIndex(meta: Meta) {\n if (meta == null) return -1;\n if (this.isThresholdMeta(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n getMinValue() {\n return this._smallValues.peek()?.value;\n }\n\n getMaxValue() {\n return this._largeValues.peek()?.value;\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta) != null\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n // console.log('commeit ---')\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._smallValues.peek()!.value;\n const maxValue = this._largeValues.peek()!.value;\n\n // console.log('mathc ', maxValue, maxValue > thresholdNumber)\n if (maxValue > thresholdNumber) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle() {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices();\n }\n\n // key point: `meta` should be preserved..\n getIndices() {\n const { smallValues, largeValues } = this.initialize();\n\n try {\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta =\n this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one element has been deleted\n if (\n !this.isThresholdMeta(meta) &&\n meta != this.getIndexMeta(targetIndex)\n ) {\n return this.shuffle();\n }\n if (meta != null && !this.isThresholdMeta(meta)) {\n const element = { position: idx, value: targetIndex };\n smallValues.push(element);\n largeValues.push(element);\n metaToPositionMap.set(meta, idx);\n indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._name}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this._positionToMetaList;\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const element = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._smallValues.push(element);\n this._largeValues.push(element);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n // console.log('position ', newIndex, position);\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n // this._cleanHeap(this._smallValues);\n // this._cleanHeap(this._largeValues);\n\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n\n if (!meta || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const element = { position, value };\n smallValues.push(element);\n largeValues.push(element);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n\n // this._largeValues.peek().value;\n\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n // _cleanHeap(heap: Heap<HeapItem>) {\n // while (\n // !heap.empty() &&\n // this._metaToPositionMap.get(\n // this._indexToMetaMap.get(heap.peek()!.value)\n // ) == null\n // ) {\n // console.log('pop ---', heap.peek()!.value);\n // heap.pop();\n // }\n // }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","defaultBufferSize","thresholdNumber","Number","MAX_SAFE_INTEGER","IntegerBufferSet","props","_props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","isThresholdMeta","meta","val","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","getMinValue","_this$_smallValues$pe","peek","getMaxValue","_this$_largeValues$pe","getFliedPosition","newIndex","getPosition","prepare","metaPosition","position","indexMeta","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","pop","replacedMeta","Math","abs","lowValue","highValue","shuffle","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","_ret","positionToMetaList","shift","getIndices","_this$initialize","metaToPositionMap","element","recyclerKey","map","err","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","lhs","rhs","_createClass","key"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}Object.defineProperty(exports,"__esModule",{value:!0});var e=t(require("@x-oasis/heap")),i=t(require("@x-oasis/is-clamped")),s=t(require("@x-oasis/invariant")),n=t(require("@x-oasis/return-hook")),o=function(t){return t},a=Number.MAX_SAFE_INTEGER-1e5;exports.default=function(){function t(t){void 0===t&&(t={});var i=t.name,s=void 0===i?"default_buffer":i,a=t.indexExtractor,r=t.bufferSize,l=void 0===r?10:r,h=t.metaExtractor;this._metaExtractor=void 0===h?o:h,this._indexExtractor=a,this._name=s,this._indexToMetaMap=new Map,this._metaToPositionMap=new Map,this._positionToMetaList=[],this._metaToIndexMap=new Map,this._onTheFlyIndices=[],this._bufferSize=l,this._smallValues=new e([],this._smallerComparator),this._largeValues=new e([],this._greaterComparator),this.getNewPositionForIndex=this.getNewPositionForIndex.bind(this),this.getIndexPosition=this.getIndexPosition.bind(this),this.replaceFurthestIndexPosition=this.replaceFurthestIndexPosition.bind(this),this._isOnTheFlyFullReturnHook=n(this.setIsOnTheFlyFull.bind(this)),this._loopMS=Date.now(),this._lastUpdatedMS=this._loopMS}var r,l,h=t.prototype;return h.isThresholdMeta=function(t){return"number"==typeof t&&t>a},h.setIsOnTheFlyFull=function(t){if(null!=t){var e=this._onTheFlyIndices.filter((function(t){return null!=t}));this._isOnTheFlyFull=e.length===this._bufferSize}},h.resetOnTheFlies=function(){this._isOnTheFlyFull=!1,this._onTheFlyIndices=[]},h.getOnTheFlyUncriticalPosition=function(t){for(var e=t.startIndex,s=t.endIndex,n=0;n<this._onTheFlyIndices.length;n++){var o=this.getMetaIndex(this._onTheFlyIndices[n]);if(!i(e,o,s))return n}return null},h.initialize=function(){return{smallValues:new e([],this._smallerComparator),largeValues:new e([],this._greaterComparator)}},h.getIndexMeta=function(t){return null==t||t<0?null:this._metaExtractor(t)},h.getMetaIndex=function(t){return null==t||this.isThresholdMeta(t)?-1:this._indexExtractor?this._indexExtractor(t):this._metaToIndexMap.get(t)},h.setMetaIndex=function(t,e){return!this._indexExtractor&&this._metaToIndexMap.set(t,e)},h.deleteMetaIndex=function(t){return this._metaToIndexMap.delete(t)},h.replaceMetaToIndexMap=function(t){return!this._indexExtractor&&(this._metaToIndexMap=t)},h.getIndexPosition=function(t){return this.getMetaIndex(this.getIndexMeta(t))},h.getNewPositionForIndex=function(t){var e=this.getIndexMeta(t);void 0!==this._metaToPositionMap.get(e)&&s(!1);var i=this._positionToMetaList.length;return this._pushToHeaps(i,t),this._setMetaIndex(e,t),this._setMetaPosition(e,i),i},h.getMinValue=function(){var t;return null==(t=this._smallValues.peek())?void 0:t.value},h.getMaxValue=function(){var t;return null==(t=this._largeValues.peek())?void 0:t.value},h.getFliedPosition=function(t,e){return this._isOnTheFlyFull&&e&&i(e.startIndex,t,e.endIndex)?this.getOnTheFlyUncriticalPosition(e):null},h.getPosition=function(t,e){this.prepare();var i,s,n=this.getIndexMeta(t),o=this._metaToPositionMap.get(n);return void 0!==o?i=this.commitPosition({newIndex:t,meta:n,safeRange:e,position:o}):this.isBufferFull?this._isOnTheFlyFull?i=this.getFliedPosition(t,e):(s=this._indexToMetaMap.get(t))&&this._metaToPositionMap.get(s)?i=this.commitPosition({newIndex:t,meta:n,safeRange:e,position:this._metaToPositionMap.get(s)}):(this._cleanHeaps(),i=this.commitPosition({newIndex:t,meta:n,safeRange:e,position:this._replaceFurthestIndexPosition(t,e)})):i=this.getNewPositionForIndex(t),null!=i?(this._onTheFlyIndices[i]=n,this._setMetaIndex(n,t),this._metaToPositionMap.set(n,i),this._isOnTheFlyFullReturnHook(i)):null},h.replaceFurthestIndexPosition=function(t,e){return this.isBufferFull?this._replaceFurthestIndexPosition(t,e):this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t))},h._replaceFurthestIndexPosition=function(t,e){if(this._largeValues.empty()||this._smallValues.empty())return this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t));var s,n=this._smallValues.peek().value,o=this._largeValues.peek().value;if(o>a){s=o,this._largeValues.pop();var r=this._indexToMetaMap.get(s);return this._metaToPositionMap.get(r)}if(!e){Math.abs(t-n)>Math.abs(t-o)?(s=n,this._smallValues.pop()):(s=o,this._largeValues.pop());var l=this._indexToMetaMap.get(s);return this._metaToPositionMap.get(l)}var h=e.startIndex,u=e.endIndex;if(i(h,n,u)&&i(h,o,u))return null;i(h,n,u)&&!i(h,o,u)?(s=o,this._largeValues.pop()):!i(h,n,u)&&i(h,o,u)||h-n>o-u?(s=n,this._smallValues.pop()):(s=o,this._largeValues.pop());var p=this._indexToMetaMap.get(s);return this._metaToPositionMap.get(p)},h.shuffle=function(){for(var t=this,e=new Array(this.bufferSize),i=0;i<e.length;i++){var s=this.getMetaIndex(this._onTheFlyIndices[i]||this._positionToMetaList[i]);e[i]=s}for(var n=new Array(e.length),o=[],a=new Map,r=new Map,l=function(){var i=e[h],s=t._metaExtractor(i);if(null==s)return"continue";if(a.set(i,s),r.set(s,i),s===t._positionToMetaList[h])return n[h]=s,"continue";var l=t._positionToMetaList.findIndex((function(t){return t===s}));if(-1!==l)return n[l]=s,"continue";o.push(s)},h=0;h<e.length;h++)l();var u=[];this._indexToMetaMap=a,this.replaceMetaToIndexMap(r);for(var p=0;p<e.length;p++)if(null==n[p]){var _=o.shift();null!=_&&(u[p]=_)}else u[p]=n[p];return this._positionToMetaList=u,this.getIndices()},h.getIndices=function(){var t=this.initialize(),e=t.smallValues,i=t.largeValues;try{for(var s=new Array(this._positionToMetaList.length),n=new Map,o=0;o<s.length;o++){var a=this._onTheFlyIndices[o]||this._positionToMetaList[o],r=this.getMetaIndex(a);if(!this.isThresholdMeta(a)&&a!=this.getIndexMeta(r))return this.shuffle();if(null!=a&&!this.isThresholdMeta(a)){var l={position:o,value:r};e.push(l),i.push(l),n.set(a,o),s[o]={meta:a,targetIndex:r,recyclerKey:this._name+"_"+o}}}return this._smallValues=e,this._largeValues=i,this._metaToPositionMap=n,this._positionToMetaList=s.map((function(t){return null==t?void 0:t.meta})),this.resetOnTheFlies(),s}catch(t){return console.log("err ",t),this._positionToMetaList}finally{this.readyToStartNextLoop()}},h._pushToHeaps=function(t,e){var i={position:t,value:e};this._smallValues.push(i),this._largeValues.push(i)},h._setMetaPosition=function(t,e){this._positionToMetaList[e]=t,this._metaToPositionMap.set(t,e)},h.commitPosition=function(t){var e=t.newIndex,i=t.safeRange,s=t.position,n=this._onTheFlyIndices[s],o=s;if(n){if(n===t.meta)return s;if(this._isOnTheFlyFull)return this.getFliedPosition(e,i);for(o=this._replaceFurthestIndexPosition(e,i);this._onTheFlyIndices[o];)o=this._replaceFurthestIndexPosition(e,i)}return o},h._setMetaIndex=function(t,e){var i=this.getMetaIndex(t);return void 0!==i&&this._indexToMetaMap.delete(i),this.setMetaIndex(t,e),this._indexToMetaMap.set(e,t),!1},h.readyToStartNextLoop=function(){this._lastUpdatedMS=Date.now()},h.prepare=function(){this._loopMS!==this._lastUpdatedMS&&(this._loopMS=this._lastUpdatedMS,this._onTheFlyIndices=[],this._isOnTheFlyFull=!1)},h._cleanHeaps=function(){for(var t=0;t<this._positionToMetaList.length;t++)if(null==this._positionToMetaList[t])return void this._recreateHeaps();var e=Math.min(this._smallValues.size(),this._largeValues.size());Math.max(this._smallValues.size(),this._largeValues.size())>10*e&&this._recreateHeaps()},h._recreateHeaps=function(){for(var t=this.initialize(),e=t.smallValues,i=t.largeValues,s=0;s<this._positionToMetaList.length;s++){var n=this._positionToMetaList[s],o=this.getMetaIndex(n);n&&-1!==o&&null!=o||(o=Number.MAX_SAFE_INTEGER-s);var r={position:s,value:o};e.push(r),i.push(r),o>a&&(this._setMetaPosition(o,s),this._setMetaIndex(o,o))}this._largeValues.peek(),this._smallValues=e,this._largeValues=i},h._smallerComparator=function(t,e){return t.value<e.value},h._greaterComparator=function(t,e){return t.value>e.value},r=t,(l=[{key:"bufferSize",get:function(){return this._bufferSize}},{key:"isBufferFull",get:function(){return this._positionToMetaList.length>=this._bufferSize}}])&&function(t,e){for(var i=0;i<e.length;i++){var s=e[i];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(t,"symbol"==typeof(n=function(t,e){if("object"!=typeof t||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var s=i.call(t,"string");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(s.key))?n:String(n),s)}var n}(r.prototype,l),Object.defineProperty(r,"prototype",{writable:!1}),t}(),exports.defaultBufferSize=10;
1
+ "use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}Object.defineProperty(exports,"__esModule",{value:!0});var e=t(require("@x-oasis/heap")),i=t(require("@x-oasis/is-clamped")),s=t(require("@x-oasis/invariant")),n=t(require("@x-oasis/return-hook")),a=function(t){return t},o=Number.MAX_SAFE_INTEGER-1e5;exports.default=function(){function t(t){void 0===t&&(t={});var i=t.name,s=void 0===i?"default_buffer":i,o=t.indexExtractor,r=t.bufferSize,l=void 0===r?10:r,h=t.metaExtractor;this._metaExtractor=void 0===h?a:h,this._indexExtractor=o,this._name=s,this._indexToMetaMap=new Map,this._metaToPositionMap=new Map,this._positionToMetaList=[],this._metaToIndexMap=new Map,this._onTheFlyIndices=[],this._bufferSize=l,this._smallValues=new e([],this._smallerComparator),this._largeValues=new e([],this._greaterComparator),this.getNewPositionForIndex=this.getNewPositionForIndex.bind(this),this.getIndexPosition=this.getIndexPosition.bind(this),this.replaceFurthestIndexPosition=this.replaceFurthestIndexPosition.bind(this),this._isOnTheFlyFullReturnHook=n(this.setIsOnTheFlyFull.bind(this)),this._loopMS=Date.now(),this._lastUpdatedMS=this._loopMS}var r,l,h=t.prototype;return h.isThresholdMeta=function(t){return"number"==typeof t&&t>o},h.setIsOnTheFlyFull=function(t){if(null!=t){var e=this._onTheFlyIndices.filter((function(t){return null!=t}));this._isOnTheFlyFull=e.length===this._bufferSize}},h.resetOnTheFlies=function(){this._isOnTheFlyFull=!1,this._onTheFlyIndices=[]},h.getOnTheFlyUncriticalPosition=function(t){for(var e=t.startIndex,s=t.endIndex,n=0;n<this._onTheFlyIndices.length;n++){var a=this.getMetaIndex(this._onTheFlyIndices[n]);if(!i(e,a,s))return n}return null},h.initialize=function(){return{smallValues:new e([],this._smallerComparator),largeValues:new e([],this._greaterComparator)}},h.getIndexMeta=function(t){return null==t||t<0?null:this._metaExtractor(t)},h.getMetaIndex=function(t){return null==t||this.isThresholdMeta(t)?-1:this._indexExtractor?this._indexExtractor(t):this._metaToIndexMap.get(t)},h.setMetaIndex=function(t,e){return!this._indexExtractor&&this._metaToIndexMap.set(t,e)},h.deleteMetaIndex=function(t){return this._metaToIndexMap.delete(t)},h.replaceMetaToIndexMap=function(t){return!this._indexExtractor&&(this._metaToIndexMap=t)},h.getIndexPosition=function(t){return this.getMetaIndex(this.getIndexMeta(t))},h.getNewPositionForIndex=function(t){var e=this.getIndexMeta(t);void 0!==this._metaToPositionMap.get(e)&&s(!1);var i=this._positionToMetaList.length;return this._pushToHeaps(i,t),this._setMetaIndex(e,t),this._setMetaPosition(e,i),i},h.getMinValue=function(){var t;return null==(t=this._smallValues.peek())?void 0:t.value},h.getMaxValue=function(){var t;return null==(t=this._largeValues.peek())?void 0:t.value},h.getFliedPosition=function(t,e){return this._isOnTheFlyFull&&e&&i(e.startIndex,t,e.endIndex)?this.getOnTheFlyUncriticalPosition(e):null},h.getPosition=function(t,e){this.prepare();var i,s,n=this.getIndexMeta(t),a=this._metaToPositionMap.get(n);return void 0!==a?i=this.commitPosition({newIndex:t,meta:n,safeRange:e,position:a}):this.isBufferFull?this._isOnTheFlyFull?i=this.getFliedPosition(t,e):(s=this._indexToMetaMap.get(t))&&null!=this._metaToPositionMap.get(s)?i=this.commitPosition({newIndex:t,meta:n,safeRange:e,position:this._metaToPositionMap.get(s)}):(this._cleanHeaps(),i=this.commitPosition({newIndex:t,meta:n,safeRange:e,position:this._replaceFurthestIndexPosition(t,e)})):i=this.getNewPositionForIndex(t),null!=i?(this._onTheFlyIndices[i]=n,this._setMetaIndex(n,t),this._metaToPositionMap.set(n,i),this._isOnTheFlyFullReturnHook(i)):null},h.replaceFurthestIndexPosition=function(t,e){return this.isBufferFull?this._replaceFurthestIndexPosition(t,e):this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t))},h._replaceFurthestIndexPosition=function(t,e){if(this._largeValues.empty()||this._smallValues.empty())return this._isOnTheFlyFullReturnHook(this.getNewPositionForIndex(t));var s,n=this._smallValues.peek().value,a=this._largeValues.peek().value;if(a>o){s=a,this._largeValues.pop();var r=this._indexToMetaMap.get(s);return this._metaToPositionMap.get(r)}if(!e){Math.abs(t-n)>Math.abs(t-a)?(s=n,this._smallValues.pop()):(s=a,this._largeValues.pop());var l=this._indexToMetaMap.get(s);return this._metaToPositionMap.get(l)}var h=e.startIndex,u=e.endIndex;if(i(h,n,u)&&i(h,a,u))return null;i(h,n,u)&&!i(h,a,u)?(s=a,this._largeValues.pop()):!i(h,n,u)&&i(h,a,u)||h-n>a-u?(s=n,this._smallValues.pop()):(s=a,this._largeValues.pop());var p=this._indexToMetaMap.get(s);return this._metaToPositionMap.get(p)},h.shuffle=function(){for(var t=this,e=new Array(this.bufferSize),i=0;i<e.length;i++){var s=this.getMetaIndex(this._onTheFlyIndices[i]||this._positionToMetaList[i]);e[i]=s}for(var n=new Array(e.length),a=[],o=new Map,r=new Map,l=function(){var i=e[h],s=t._metaExtractor(i);if(null==s)return"continue";if(o.set(i,s),r.set(s,i),s===t._positionToMetaList[h])return n[h]=s,"continue";var l=t._positionToMetaList.findIndex((function(t){return t===s}));if(-1!==l)return n[l]=s,"continue";a.push(s)},h=0;h<e.length;h++)l();var u=[];this._indexToMetaMap=o,this.replaceMetaToIndexMap(r);for(var p=0;p<e.length;p++)if(null==n[p]){var _=a.shift();null!=_&&(u[p]=_)}else u[p]=n[p];return this._positionToMetaList=u,this.getIndices()},h.getIndices=function(){var t=this.initialize(),e=t.smallValues,i=t.largeValues;try{for(var s=new Array(this._positionToMetaList.length),n=new Map,a=new Map,o=new Map,r=0;r<s.length;r++){var l=this._onTheFlyIndices[r]||this._positionToMetaList[r],h=this.getMetaIndex(l);if(!this.isThresholdMeta(l)&&l!=this.getIndexMeta(h))return this.shuffle();if(null!=l&&!this.isThresholdMeta(l)){var u={position:r,value:h};e.push(u),i.push(u),n.set(l,r),a.set(h,l),o.set(l,h),s[r]={meta:l,targetIndex:h,recyclerKey:this._name+"_"+r}}}return this._smallValues=e,this._largeValues=i,this._metaToPositionMap=n,this._positionToMetaList=s.map((function(t){return null==t?void 0:t.meta})),this.resetOnTheFlies(),this._indexToMetaMap=a,this.replaceMetaToIndexMap(o),s}catch(t){return console.log("err ",t),this._positionToMetaList}finally{this.readyToStartNextLoop()}},h._pushToHeaps=function(t,e){var i={position:t,value:e};this._smallValues.push(i),this._largeValues.push(i)},h._setMetaPosition=function(t,e){this._positionToMetaList[e]=t,this._metaToPositionMap.set(t,e)},h.commitPosition=function(t){var e=t.newIndex,i=t.safeRange,s=t.position,n=this._onTheFlyIndices[s],a=s;if(n){if(n===t.meta)return s;if(this._isOnTheFlyFull)return this.getFliedPosition(e,i);for(a=this._replaceFurthestIndexPosition(e,i);this._onTheFlyIndices[a];)a=this._replaceFurthestIndexPosition(e,i)}return a},h._setMetaIndex=function(t,e){var i=this.getMetaIndex(t);return void 0!==i&&this._indexToMetaMap.delete(i),this.setMetaIndex(t,e),this._indexToMetaMap.set(e,t),!1},h.readyToStartNextLoop=function(){this._lastUpdatedMS=Date.now()},h.prepare=function(){this._loopMS!==this._lastUpdatedMS&&(this._loopMS=this._lastUpdatedMS,this._onTheFlyIndices=[],this._isOnTheFlyFull=!1)},h._cleanHeaps=function(){for(var t=0;t<this._positionToMetaList.length;t++)if(null==this._positionToMetaList[t])return void this._recreateHeaps();var e=Math.min(this._smallValues.size(),this._largeValues.size());Math.max(this._smallValues.size(),this._largeValues.size())>10*e&&this._recreateHeaps()},h._recreateHeaps=function(){for(var t=this.initialize(),e=t.smallValues,i=t.largeValues,s=0;s<this._positionToMetaList.length;s++){var n=this._positionToMetaList[s],a=this.getMetaIndex(n);n&&-1!==a&&null!=a||(a=Number.MAX_SAFE_INTEGER-s);var r={position:s,value:a};e.push(r),i.push(r),a>o&&(this._setMetaPosition(a,s),this._setMetaIndex(a,a))}this._smallValues=e,this._largeValues=i},h._smallerComparator=function(t,e){return t.value<e.value},h._greaterComparator=function(t,e){return t.value>e.value},r=t,(l=[{key:"bufferSize",get:function(){return this._bufferSize}},{key:"isBufferFull",get:function(){return this._positionToMetaList.length>=this._bufferSize}}])&&function(t,e){for(var i=0;i<e.length;i++){var s=e[i];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(t,"symbol"==typeof(n=function(t,e){if("object"!=typeof t||null===t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var s=i.call(t,"string");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(s.key))?n:String(n),s)}var n}(r.prototype,l),Object.defineProperty(r,"prototype",{writable:!1}),t}(),exports.defaultBufferSize=10;
2
2
  //# sourceMappingURL=integer-buffer-set.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"integer-buffer-set.cjs.production.min.js","sources":["../src/index.ts"],"sourcesContent":["import Heap from '@x-oasis/heap';\nimport isClamped from '@x-oasis/is-clamped';\nimport invariant from '@x-oasis/invariant';\nimport returnHook, { ReturnHook } from '@x-oasis/return-hook';\nimport {\n HeapItem,\n SafeRange,\n MetaExtractor,\n IndexExtractor,\n IntegerBufferSetProps,\n MetaToIndexMap,\n MetaToPositionMap,\n IndexToMetaMap,\n} from './types';\n\nconst defaultMetaExtractor = (value) => value;\nexport const defaultBufferSize = 10;\nconst thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _name: string;\n private _bufferSize: number;\n\n private _indexToMetaMap: IndexToMetaMap<Meta>;\n private _metaToPositionMap: MetaToPositionMap<Meta>;\n private _positionToMetaList: Array<Meta>;\n private _metaToIndexMap: MetaToIndexMap<Meta>;\n\n private _smallValues: Heap<HeapItem>;\n private _largeValues: Heap<HeapItem>;\n private _metaExtractor: MetaExtractor<Meta>;\n private _indexExtractor: IndexExtractor<Meta>;\n\n private _onTheFlyIndices: Array<Meta>;\n\n private _isOnTheFlyFull: boolean;\n private _isOnTheFlyFullReturnHook: ReturnHook;\n\n private _loopMS: number;\n private _lastUpdatedMS: number;\n\n constructor(props: IntegerBufferSetProps<Meta> = {}) {\n const {\n name = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._name = name;\n\n /**\n * this._indexToMetaMap is used to find the prev meta when finding a position for index.\n */\n this._indexToMetaMap = new Map();\n this._metaToPositionMap = new Map();\n this._positionToMetaList = [];\n this._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n\n this._bufferSize = bufferSize;\n\n this._smallValues = new Heap([], this._smallerComparator);\n this._largeValues = new Heap([], this._greaterComparator);\n\n this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);\n this.getIndexPosition = this.getIndexPosition.bind(this);\n this.replaceFurthestIndexPosition =\n this.replaceFurthestIndexPosition.bind(this);\n this._isOnTheFlyFullReturnHook = returnHook(\n this.setIsOnTheFlyFull.bind(this)\n );\n\n this._loopMS = Date.now();\n this._lastUpdatedMS = this._loopMS;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n isThresholdMeta(meta) {\n if (typeof meta === 'number' && meta > thresholdNumber) return true;\n return false;\n }\n\n setIsOnTheFlyFull(val: any) {\n if (val != null) {\n const data = this._onTheFlyIndices.filter((v) => v != null);\n this._isOnTheFlyFull = data.length === this._bufferSize;\n // console.log('fly ', this._isOnTheFlyFull, data.length, this._bufferSize);\n }\n }\n\n resetOnTheFlies() {\n this._isOnTheFlyFull = false;\n this._onTheFlyIndices = [];\n }\n\n get isBufferFull() {\n return this._positionToMetaList.length >= this._bufferSize;\n }\n\n getOnTheFlyUncriticalPosition(safeRange: SafeRange) {\n const { startIndex, endIndex } = safeRange;\n for (let idx = 0; idx < this._onTheFlyIndices.length; idx++) {\n const meta = this._onTheFlyIndices[idx];\n const metaIndex = this.getMetaIndex(meta);\n if (!isClamped(startIndex, metaIndex, endIndex)) {\n return idx;\n }\n }\n return null;\n }\n\n initialize() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n }\n\n getMetaIndex(meta: Meta) {\n if (meta == null) return -1;\n if (this.isThresholdMeta(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n getMinValue() {\n return this._smallValues.peek()?.value;\n }\n\n getMaxValue() {\n return this._largeValues.peek()?.value;\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta)\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n // console.log('commeit ---')\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._smallValues.peek()!.value;\n const maxValue = this._largeValues.peek()!.value;\n\n // console.log('mathc ', maxValue, maxValue > thresholdNumber)\n if (maxValue > thresholdNumber) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle() {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices();\n }\n\n // key point: `meta` should be preserved..\n getIndices() {\n const { smallValues, largeValues } = this.initialize();\n\n try {\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta =\n this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one element has been deleted\n if (\n !this.isThresholdMeta(meta) &&\n meta != this.getIndexMeta(targetIndex)\n ) {\n return this.shuffle();\n }\n if (meta != null && !this.isThresholdMeta(meta)) {\n const element = { position: idx, value: targetIndex };\n smallValues.push(element);\n largeValues.push(element);\n metaToPositionMap.set(meta, idx);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._name}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this._positionToMetaList;\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const element = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._smallValues.push(element);\n this._largeValues.push(element);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n // console.log('position ', newIndex, position);\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n // this._cleanHeap(this._smallValues);\n // this._cleanHeap(this._largeValues);\n\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n\n if (!meta || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const element = { position, value };\n smallValues.push(element);\n largeValues.push(element);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n\n this._largeValues.peek().value;\n\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n // _cleanHeap(heap: Heap<HeapItem>) {\n // while (\n // !heap.empty() &&\n // this._metaToPositionMap.get(\n // this._indexToMetaMap.get(heap.peek()!.value)\n // ) == null\n // ) {\n // console.log('pop ---', heap.peek()!.value);\n // heap.pop();\n // }\n // }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","thresholdNumber","Number","MAX_SAFE_INTEGER","IntegerBufferSet","props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","this","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","isThresholdMeta","meta","val","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","getMinValue","_this$_smallValues$pe","peek","getMaxValue","_this$_largeValues$pe","getFliedPosition","newIndex","getPosition","prepare","position","indexMeta","metaPosition","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","pop","replacedMeta","Math","abs","lowValue","highValue","shuffle","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","positionToMetaList","shift","getIndices","_this$initialize","metaToPositionMap","element","recyclerKey","map","err","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","max","_this$initialize2","lhs","rhs","key"],"mappings":"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"}
1
+ {"version":3,"file":"integer-buffer-set.cjs.production.min.js","sources":["../src/index.ts"],"sourcesContent":["import Heap from '@x-oasis/heap';\nimport isClamped from '@x-oasis/is-clamped';\nimport invariant from '@x-oasis/invariant';\nimport returnHook, { ReturnHook } from '@x-oasis/return-hook';\nimport {\n HeapItem,\n SafeRange,\n MetaExtractor,\n IndexExtractor,\n IntegerBufferSetProps,\n MetaToIndexMap,\n MetaToPositionMap,\n IndexToMetaMap,\n} from './types';\n\nconst defaultMetaExtractor = (value) => value;\nexport const defaultBufferSize = 10;\nconst thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _name: string;\n private _bufferSize: number;\n\n private _indexToMetaMap: IndexToMetaMap<Meta>;\n private _metaToPositionMap: MetaToPositionMap<Meta>;\n private _positionToMetaList: Array<Meta>;\n private _metaToIndexMap: MetaToIndexMap<Meta>;\n\n private _smallValues: Heap<HeapItem>;\n private _largeValues: Heap<HeapItem>;\n private _metaExtractor: MetaExtractor<Meta>;\n private _indexExtractor: IndexExtractor<Meta>;\n\n private _onTheFlyIndices: Array<Meta>;\n\n private _isOnTheFlyFull: boolean;\n private _isOnTheFlyFullReturnHook: ReturnHook;\n\n private _loopMS: number;\n private _lastUpdatedMS: number;\n\n constructor(props: IntegerBufferSetProps<Meta> = {}) {\n const {\n name = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._name = name;\n\n /**\n * this._indexToMetaMap is used to find the prev meta when finding a position for index.\n */\n this._indexToMetaMap = new Map();\n this._metaToPositionMap = new Map();\n this._positionToMetaList = [];\n this._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n\n this._bufferSize = bufferSize;\n\n this._smallValues = new Heap([], this._smallerComparator);\n this._largeValues = new Heap([], this._greaterComparator);\n\n this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);\n this.getIndexPosition = this.getIndexPosition.bind(this);\n this.replaceFurthestIndexPosition =\n this.replaceFurthestIndexPosition.bind(this);\n this._isOnTheFlyFullReturnHook = returnHook(\n this.setIsOnTheFlyFull.bind(this)\n );\n\n this._loopMS = Date.now();\n this._lastUpdatedMS = this._loopMS;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n isThresholdMeta(meta) {\n if (typeof meta === 'number' && meta > thresholdNumber) return true;\n return false;\n }\n\n setIsOnTheFlyFull(val: any) {\n if (val != null) {\n const data = this._onTheFlyIndices.filter((v) => v != null);\n this._isOnTheFlyFull = data.length === this._bufferSize;\n // console.log('fly ', this._isOnTheFlyFull, data.length, this._bufferSize);\n }\n }\n\n resetOnTheFlies() {\n this._isOnTheFlyFull = false;\n this._onTheFlyIndices = [];\n }\n\n get isBufferFull() {\n return this._positionToMetaList.length >= this._bufferSize;\n }\n\n getOnTheFlyUncriticalPosition(safeRange: SafeRange) {\n const { startIndex, endIndex } = safeRange;\n for (let idx = 0; idx < this._onTheFlyIndices.length; idx++) {\n const meta = this._onTheFlyIndices[idx];\n const metaIndex = this.getMetaIndex(meta);\n if (!isClamped(startIndex, metaIndex, endIndex)) {\n return idx;\n }\n }\n return null;\n }\n\n initialize() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n }\n\n getMetaIndex(meta: Meta) {\n if (meta == null) return -1;\n if (this.isThresholdMeta(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n getMinValue() {\n return this._smallValues.peek()?.value;\n }\n\n getMaxValue() {\n return this._largeValues.peek()?.value;\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta) != null\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n // console.log('commeit ---')\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._smallValues.peek()!.value;\n const maxValue = this._largeValues.peek()!.value;\n\n // console.log('mathc ', maxValue, maxValue > thresholdNumber)\n if (maxValue > thresholdNumber) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle() {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices();\n }\n\n // key point: `meta` should be preserved..\n getIndices() {\n const { smallValues, largeValues } = this.initialize();\n\n try {\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta =\n this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one element has been deleted\n if (\n !this.isThresholdMeta(meta) &&\n meta != this.getIndexMeta(targetIndex)\n ) {\n return this.shuffle();\n }\n if (meta != null && !this.isThresholdMeta(meta)) {\n const element = { position: idx, value: targetIndex };\n smallValues.push(element);\n largeValues.push(element);\n metaToPositionMap.set(meta, idx);\n indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._name}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this._positionToMetaList;\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const element = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._smallValues.push(element);\n this._largeValues.push(element);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n // console.log('position ', newIndex, position);\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n // this._cleanHeap(this._smallValues);\n // this._cleanHeap(this._largeValues);\n\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n\n if (!meta || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const element = { position, value };\n smallValues.push(element);\n largeValues.push(element);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n\n // this._largeValues.peek().value;\n\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n // _cleanHeap(heap: Heap<HeapItem>) {\n // while (\n // !heap.empty() &&\n // this._metaToPositionMap.get(\n // this._indexToMetaMap.get(heap.peek()!.value)\n // ) == null\n // ) {\n // console.log('pop ---', heap.peek()!.value);\n // heap.pop();\n // }\n // }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","thresholdNumber","Number","MAX_SAFE_INTEGER","IntegerBufferSet","props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","this","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","isThresholdMeta","meta","val","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","getMinValue","_this$_smallValues$pe","peek","getMaxValue","_this$_largeValues$pe","getFliedPosition","newIndex","getPosition","prepare","position","indexMeta","metaPosition","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","pop","replacedMeta","Math","abs","lowValue","highValue","shuffle","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","positionToMetaList","shift","getIndices","_this$initialize","metaToPositionMap","element","recyclerKey","map","err","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","max","_this$initialize2","lhs","rhs","key"],"mappings":"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"}
@@ -175,7 +175,7 @@ var IntegerBufferSet = /*#__PURE__*/function () {
175
175
  position = this.getNewPositionForIndex(newIndex);
176
176
  } else if (this._isOnTheFlyFull) {
177
177
  position = this.getFliedPosition(newIndex, safeRange);
178
- } else if ((indexMeta = this._indexToMetaMap.get(newIndex)) && this._metaToPositionMap.get(indexMeta)) {
178
+ } else if ((indexMeta = this._indexToMetaMap.get(newIndex)) && this._metaToPositionMap.get(indexMeta) != null) {
179
179
  position = this.commitPosition({
180
180
  newIndex: newIndex,
181
181
  meta: meta,
@@ -310,6 +310,8 @@ var IntegerBufferSet = /*#__PURE__*/function () {
310
310
  try {
311
311
  var indices = new Array(this._positionToMetaList.length);
312
312
  var metaToPositionMap = new Map();
313
+ var indexToMetaMap = new Map();
314
+ var metaToIndexMap = new Map();
313
315
  for (var idx = 0; idx < indices.length; idx++) {
314
316
  var meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
315
317
  var targetIndex = this.getMetaIndex(meta);
@@ -324,6 +326,8 @@ var IntegerBufferSet = /*#__PURE__*/function () {
324
326
  smallValues.push(element);
325
327
  largeValues.push(element);
326
328
  metaToPositionMap.set(meta, idx);
329
+ indexToMetaMap.set(targetIndex, meta);
330
+ metaToIndexMap.set(meta, targetIndex);
327
331
  indices[idx] = {
328
332
  meta: meta,
329
333
  targetIndex: targetIndex,
@@ -338,6 +342,8 @@ var IntegerBufferSet = /*#__PURE__*/function () {
338
342
  return v == null ? void 0 : v.meta;
339
343
  });
340
344
  this.resetOnTheFlies();
345
+ this._indexToMetaMap = indexToMetaMap;
346
+ this.replaceMetaToIndexMap(metaToIndexMap);
341
347
  return indices;
342
348
  } catch (err) {
343
349
  console.log('err ', err);
@@ -427,7 +433,6 @@ var IntegerBufferSet = /*#__PURE__*/function () {
427
433
  this._setMetaIndex(value, value);
428
434
  }
429
435
  }
430
- this._largeValues.peek().value;
431
436
  this._smallValues = smallValues;
432
437
  this._largeValues = largeValues;
433
438
  };
@@ -1 +1 @@
1
- {"version":3,"file":"integer-buffer-set.esm.js","sources":["../src/index.ts"],"sourcesContent":["import Heap from '@x-oasis/heap';\nimport isClamped from '@x-oasis/is-clamped';\nimport invariant from '@x-oasis/invariant';\nimport returnHook, { ReturnHook } from '@x-oasis/return-hook';\nimport {\n HeapItem,\n SafeRange,\n MetaExtractor,\n IndexExtractor,\n IntegerBufferSetProps,\n MetaToIndexMap,\n MetaToPositionMap,\n IndexToMetaMap,\n} from './types';\n\nconst defaultMetaExtractor = (value) => value;\nexport const defaultBufferSize = 10;\nconst thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _name: string;\n private _bufferSize: number;\n\n private _indexToMetaMap: IndexToMetaMap<Meta>;\n private _metaToPositionMap: MetaToPositionMap<Meta>;\n private _positionToMetaList: Array<Meta>;\n private _metaToIndexMap: MetaToIndexMap<Meta>;\n\n private _smallValues: Heap<HeapItem>;\n private _largeValues: Heap<HeapItem>;\n private _metaExtractor: MetaExtractor<Meta>;\n private _indexExtractor: IndexExtractor<Meta>;\n\n private _onTheFlyIndices: Array<Meta>;\n\n private _isOnTheFlyFull: boolean;\n private _isOnTheFlyFullReturnHook: ReturnHook;\n\n private _loopMS: number;\n private _lastUpdatedMS: number;\n\n constructor(props: IntegerBufferSetProps<Meta> = {}) {\n const {\n name = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._name = name;\n\n /**\n * this._indexToMetaMap is used to find the prev meta when finding a position for index.\n */\n this._indexToMetaMap = new Map();\n this._metaToPositionMap = new Map();\n this._positionToMetaList = [];\n this._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n\n this._bufferSize = bufferSize;\n\n this._smallValues = new Heap([], this._smallerComparator);\n this._largeValues = new Heap([], this._greaterComparator);\n\n this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);\n this.getIndexPosition = this.getIndexPosition.bind(this);\n this.replaceFurthestIndexPosition =\n this.replaceFurthestIndexPosition.bind(this);\n this._isOnTheFlyFullReturnHook = returnHook(\n this.setIsOnTheFlyFull.bind(this)\n );\n\n this._loopMS = Date.now();\n this._lastUpdatedMS = this._loopMS;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n isThresholdMeta(meta) {\n if (typeof meta === 'number' && meta > thresholdNumber) return true;\n return false;\n }\n\n setIsOnTheFlyFull(val: any) {\n if (val != null) {\n const data = this._onTheFlyIndices.filter((v) => v != null);\n this._isOnTheFlyFull = data.length === this._bufferSize;\n // console.log('fly ', this._isOnTheFlyFull, data.length, this._bufferSize);\n }\n }\n\n resetOnTheFlies() {\n this._isOnTheFlyFull = false;\n this._onTheFlyIndices = [];\n }\n\n get isBufferFull() {\n return this._positionToMetaList.length >= this._bufferSize;\n }\n\n getOnTheFlyUncriticalPosition(safeRange: SafeRange) {\n const { startIndex, endIndex } = safeRange;\n for (let idx = 0; idx < this._onTheFlyIndices.length; idx++) {\n const meta = this._onTheFlyIndices[idx];\n const metaIndex = this.getMetaIndex(meta);\n if (!isClamped(startIndex, metaIndex, endIndex)) {\n return idx;\n }\n }\n return null;\n }\n\n initialize() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n }\n\n getMetaIndex(meta: Meta) {\n if (meta == null) return -1;\n if (this.isThresholdMeta(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n getMinValue() {\n return this._smallValues.peek()?.value;\n }\n\n getMaxValue() {\n return this._largeValues.peek()?.value;\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta)\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n // console.log('commeit ---')\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._smallValues.peek()!.value;\n const maxValue = this._largeValues.peek()!.value;\n\n // console.log('mathc ', maxValue, maxValue > thresholdNumber)\n if (maxValue > thresholdNumber) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle() {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices();\n }\n\n // key point: `meta` should be preserved..\n getIndices() {\n const { smallValues, largeValues } = this.initialize();\n\n try {\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta =\n this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one element has been deleted\n if (\n !this.isThresholdMeta(meta) &&\n meta != this.getIndexMeta(targetIndex)\n ) {\n return this.shuffle();\n }\n if (meta != null && !this.isThresholdMeta(meta)) {\n const element = { position: idx, value: targetIndex };\n smallValues.push(element);\n largeValues.push(element);\n metaToPositionMap.set(meta, idx);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._name}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this._positionToMetaList;\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const element = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._smallValues.push(element);\n this._largeValues.push(element);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n // console.log('position ', newIndex, position);\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n // this._cleanHeap(this._smallValues);\n // this._cleanHeap(this._largeValues);\n\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n\n if (!meta || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const element = { position, value };\n smallValues.push(element);\n largeValues.push(element);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n\n this._largeValues.peek().value;\n\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n // _cleanHeap(heap: Heap<HeapItem>) {\n // while (\n // !heap.empty() &&\n // this._metaToPositionMap.get(\n // this._indexToMetaMap.get(heap.peek()!.value)\n // ) == null\n // ) {\n // console.log('pop ---', heap.peek()!.value);\n // heap.pop();\n // }\n // }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","defaultBufferSize","thresholdNumber","Number","MAX_SAFE_INTEGER","IntegerBufferSet","props","_props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","isThresholdMeta","meta","val","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","process","env","NODE_ENV","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","getMinValue","_this$_smallValues$pe","peek","getMaxValue","_this$_largeValues$pe","getFliedPosition","newIndex","getPosition","prepare","metaPosition","position","indexMeta","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","pop","replacedMeta","Math","abs","lowValue","highValue","shuffle","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","_ret","positionToMetaList","shift","getIndices","_this$initialize","metaToPositionMap","element","recyclerKey","map","err","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","lhs","rhs","_createClass","key"],"mappings":"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"}
1
+ {"version":3,"file":"integer-buffer-set.esm.js","sources":["../src/index.ts"],"sourcesContent":["import Heap from '@x-oasis/heap';\nimport isClamped from '@x-oasis/is-clamped';\nimport invariant from '@x-oasis/invariant';\nimport returnHook, { ReturnHook } from '@x-oasis/return-hook';\nimport {\n HeapItem,\n SafeRange,\n MetaExtractor,\n IndexExtractor,\n IntegerBufferSetProps,\n MetaToIndexMap,\n MetaToPositionMap,\n IndexToMetaMap,\n} from './types';\n\nconst defaultMetaExtractor = (value) => value;\nexport const defaultBufferSize = 10;\nconst thresholdNumber = Number.MAX_SAFE_INTEGER - 100000;\n\n// !!!!! should do meta validation...meta should has an index...\n// value: original data `index` value\n// value(index) => meta => position\n// `index to getIndices, meta to find index`\n\n// Data structure that allows to store values and assign positions to them\n// in a way to minimize changing positions of stored values when new ones are\n// added or when some values are replaced. Stored elements are alwasy assigned\n// a consecutive set of positoins startin from 0 up to count of elements less 1\n// Following actions can be executed\n// * get position assigned to given value (null if value is not stored)\n// * create new entry for new value and get assigned position back\n// * replace value that is furthest from specified value range with new value\n// and get it's position back\n// All operations take amortized log(n) time where n is number of elements in\n// the set.\n// feature: add / delete / update item will also in consider..\nclass IntegerBufferSet<Meta = any> {\n private _name: string;\n private _bufferSize: number;\n\n private _indexToMetaMap: IndexToMetaMap<Meta>;\n private _metaToPositionMap: MetaToPositionMap<Meta>;\n private _positionToMetaList: Array<Meta>;\n private _metaToIndexMap: MetaToIndexMap<Meta>;\n\n private _smallValues: Heap<HeapItem>;\n private _largeValues: Heap<HeapItem>;\n private _metaExtractor: MetaExtractor<Meta>;\n private _indexExtractor: IndexExtractor<Meta>;\n\n private _onTheFlyIndices: Array<Meta>;\n\n private _isOnTheFlyFull: boolean;\n private _isOnTheFlyFullReturnHook: ReturnHook;\n\n private _loopMS: number;\n private _lastUpdatedMS: number;\n\n constructor(props: IntegerBufferSetProps<Meta> = {}) {\n const {\n name = 'default_buffer',\n indexExtractor,\n bufferSize = defaultBufferSize,\n metaExtractor = defaultMetaExtractor,\n } = props;\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n\n this._name = name;\n\n /**\n * this._indexToMetaMap is used to find the prev meta when finding a position for index.\n */\n this._indexToMetaMap = new Map();\n this._metaToPositionMap = new Map();\n this._positionToMetaList = [];\n this._metaToIndexMap = new Map();\n this._onTheFlyIndices = [];\n\n this._bufferSize = bufferSize;\n\n this._smallValues = new Heap([], this._smallerComparator);\n this._largeValues = new Heap([], this._greaterComparator);\n\n this.getNewPositionForIndex = this.getNewPositionForIndex.bind(this);\n this.getIndexPosition = this.getIndexPosition.bind(this);\n this.replaceFurthestIndexPosition =\n this.replaceFurthestIndexPosition.bind(this);\n this._isOnTheFlyFullReturnHook = returnHook(\n this.setIsOnTheFlyFull.bind(this)\n );\n\n this._loopMS = Date.now();\n this._lastUpdatedMS = this._loopMS;\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n isThresholdMeta(meta) {\n if (typeof meta === 'number' && meta > thresholdNumber) return true;\n return false;\n }\n\n setIsOnTheFlyFull(val: any) {\n if (val != null) {\n const data = this._onTheFlyIndices.filter((v) => v != null);\n this._isOnTheFlyFull = data.length === this._bufferSize;\n // console.log('fly ', this._isOnTheFlyFull, data.length, this._bufferSize);\n }\n }\n\n resetOnTheFlies() {\n this._isOnTheFlyFull = false;\n this._onTheFlyIndices = [];\n }\n\n get isBufferFull() {\n return this._positionToMetaList.length >= this._bufferSize;\n }\n\n getOnTheFlyUncriticalPosition(safeRange: SafeRange) {\n const { startIndex, endIndex } = safeRange;\n for (let idx = 0; idx < this._onTheFlyIndices.length; idx++) {\n const meta = this._onTheFlyIndices[idx];\n const metaIndex = this.getMetaIndex(meta);\n if (!isClamped(startIndex, metaIndex, endIndex)) {\n return idx;\n }\n }\n return null;\n }\n\n initialize() {\n return {\n smallValues: new Heap([], this._smallerComparator),\n largeValues: new Heap([], this._greaterComparator),\n };\n }\n\n getIndexMeta(index: number) {\n if (index == null || index < 0) return null;\n return this._metaExtractor(index);\n }\n\n getMetaIndex(meta: Meta) {\n if (meta == null) return -1;\n if (this.isThresholdMeta(meta)) return -1;\n if (this._indexExtractor) return this._indexExtractor(meta);\n return this._metaToIndexMap.get(meta);\n }\n\n setMetaIndex(meta: Meta, index: number) {\n if (!this._indexExtractor) {\n return this._metaToIndexMap.set(meta, index);\n }\n return false;\n }\n\n deleteMetaIndex(meta: Meta) {\n return this._metaToIndexMap.delete(meta);\n }\n\n replaceMetaToIndexMap(newMetaToIndexMap: MetaToIndexMap<Meta>) {\n if (!this._indexExtractor) {\n return (this._metaToIndexMap = newMetaToIndexMap);\n }\n return false;\n }\n\n getIndexPosition(index: number): undefined | number {\n return this.getMetaIndex(this.getIndexMeta(index));\n }\n\n getNewPositionForIndex(index: number) {\n const meta = this.getIndexMeta(index);\n invariant(\n this._metaToPositionMap.get(meta) === undefined,\n \"Shouldn't try to find new position for value already stored in BufferSet\"\n );\n const newPosition = this._positionToMetaList.length;\n\n this._pushToHeaps(newPosition, index);\n this._setMetaIndex(meta, index);\n this._setMetaPosition(meta, newPosition);\n\n return newPosition;\n }\n\n getMinValue() {\n return this._smallValues.peek()?.value;\n }\n\n getMaxValue() {\n return this._largeValues.peek()?.value;\n }\n\n getFliedPosition(newIndex: number, safeRange: SafeRange) {\n if (this._isOnTheFlyFull) {\n // newIndex is not critical index, do nothing\n if (\n safeRange &&\n isClamped(safeRange.startIndex, newIndex, safeRange.endIndex)\n ) {\n return this.getOnTheFlyUncriticalPosition(safeRange);\n }\n // if `newIndex` is critical index, replace an un-committed\n // index value from _onTheFlyIndices.\n // const pos = this.getOnTheFlyUncriticalPosition(safeRange);\n // if (pos != null) return pos;\n }\n return null;\n }\n\n /**\n *\n * @param newIndex\n * @param safeRange\n * @returns\n *\n *\n * _positionToMetaList maybe undefined on next loop\n */\n getPosition(newIndex: number, safeRange?: SafeRange) {\n this.prepare();\n const meta = this.getIndexMeta(newIndex);\n const metaPosition = this._metaToPositionMap.get(meta);\n let position, indexMeta;\n\n // if (this._name === 'normal_goods')\n // console.log(\n // 'getPosition ',\n // newIndex,\n // !this.isBufferFull,\n // this._isOnTheFlyFull,\n // this._onTheFlyIndices.slice(),\n // this._indexToMetaMap.get(newIndex),\n // this._metaToPositionMap.get(this._indexToMetaMap.get(newIndex))\n // );\n\n if (metaPosition !== undefined) {\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: metaPosition,\n });\n } else if (!this.isBufferFull) {\n /** placed on new buffered position */\n position = this.getNewPositionForIndex(newIndex);\n } else if (this._isOnTheFlyFull) {\n position = this.getFliedPosition(newIndex, safeRange);\n } else if (\n (indexMeta = this._indexToMetaMap.get(newIndex)) &&\n this._metaToPositionMap.get(indexMeta) != null\n ) {\n /**\n Index has already been stored, but we cant use its old position directly...\n 1:index -> meta, meta may be reused later\n 2: temp use index -> meta -> position, this issue should exist for follows...\n */\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._metaToPositionMap.get(indexMeta),\n });\n } else {\n this._cleanHeaps();\n // console.log('commeit ---')\n position = this.commitPosition({\n newIndex,\n meta,\n safeRange,\n position: this._replaceFurthestIndexPosition(newIndex, safeRange),\n });\n }\n\n // console.log('position ', position)\n\n if (position != null) {\n this._onTheFlyIndices[position] = meta;\n this._setMetaIndex(meta, newIndex);\n this._metaToPositionMap.set(meta, position);\n\n // this._setMetaPosition(meta, position);\n // should not push to heap, pop only\n // this._pushToHeaps(position, newIndex)\n\n return this._isOnTheFlyFullReturnHook(position);\n }\n\n return null;\n }\n\n replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (!this.isBufferFull) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n return this._replaceFurthestIndexPosition(newIndex, safeRange);\n }\n\n _replaceFurthestIndexPosition(\n newIndex: number,\n safeRange?: {\n startIndex: number;\n endIndex: number;\n }\n ) {\n if (this._largeValues.empty() || this._smallValues.empty()) {\n return this._isOnTheFlyFullReturnHook(\n this.getNewPositionForIndex(newIndex)\n );\n }\n\n let indexToReplace;\n\n const minValue = this._smallValues.peek()!.value;\n const maxValue = this._largeValues.peek()!.value;\n\n // console.log('mathc ', maxValue, maxValue > thresholdNumber)\n if (maxValue > thresholdNumber) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n\n const position = this._metaToPositionMap.get(replacedMeta);\n return position;\n }\n\n if (!safeRange) {\n // far from min\n if (Math.abs(newIndex - minValue) > Math.abs(newIndex - maxValue)) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n return position;\n }\n\n const { startIndex: lowValue, endIndex: highValue } = safeRange;\n\n // All values currently stored are necessary, we can't reuse any of them.\n if (\n isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n return null;\n } else if (\n isClamped(lowValue, minValue, highValue) &&\n !isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = maxValue;\n this._largeValues.pop();\n } else if (\n !isClamped(lowValue, minValue, highValue) &&\n isClamped(lowValue, maxValue, highValue)\n ) {\n indexToReplace = minValue;\n this._smallValues.pop();\n } else if (lowValue - minValue > maxValue - highValue) {\n // minValue is further from provided range. We will reuse it's position.\n indexToReplace = minValue;\n this._smallValues.pop();\n } else {\n indexToReplace = maxValue;\n this._largeValues.pop();\n }\n\n const replacedMeta = this._indexToMetaMap.get(indexToReplace);\n const position = this._metaToPositionMap.get(replacedMeta);\n\n // console.log('index ', indexToReplace, replacedMeta, position)\n\n return position;\n }\n\n shuffle() {\n const indices = new Array(this.bufferSize);\n for (let idx = 0; idx < indices.length; idx++) {\n const meta = this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n // console.log('ix ', idx,this.getMetaIndex(meta) )\n const targetIndex = this.getMetaIndex(meta);\n indices[idx] = targetIndex;\n }\n\n // console.log(\n // 'indices ',\n // this._positionToMetaList,\n // this._onTheFlyIndices.slice(),\n // indices\n // );\n\n const _arr = new Array(indices.length);\n const _available = [];\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n\n for (let idx = 0; idx < indices.length; idx++) {\n const currentIndex = indices[idx];\n const currentMeta = this._metaExtractor(currentIndex);\n // console.log(\"current \", currentIndex, currentMeta)\n if (currentMeta == null) continue;\n indexToMetaMap.set(currentIndex, currentMeta);\n metaToIndexMap.set(currentMeta, currentIndex);\n if (currentMeta === this._positionToMetaList[idx]) {\n _arr[idx] = currentMeta;\n continue;\n }\n const _i = this._positionToMetaList.findIndex((v) => v === currentMeta);\n if (_i !== -1) {\n _arr[_i] = currentMeta;\n continue;\n }\n\n _available.push(currentMeta);\n }\n\n const positionToMetaList = [];\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n for (let position = 0; position < indices.length; position++) {\n if (_arr[position] != null) {\n positionToMetaList[position] = _arr[position];\n continue;\n }\n const meta = _available.shift();\n if (meta != null) {\n positionToMetaList[position] = meta;\n }\n }\n\n this._positionToMetaList = positionToMetaList;\n\n return this.getIndices();\n }\n\n // key point: `meta` should be preserved..\n getIndices() {\n const { smallValues, largeValues } = this.initialize();\n\n try {\n const indices = new Array(this._positionToMetaList.length);\n const metaToPositionMap = new Map();\n const indexToMetaMap = new Map();\n const metaToIndexMap = new Map();\n for (let idx = 0; idx < indices.length; idx++) {\n const meta =\n this._onTheFlyIndices[idx] || this._positionToMetaList[idx];\n const targetIndex = this.getMetaIndex(meta);\n // which means source data has changed. such as one element has been deleted\n if (\n !this.isThresholdMeta(meta) &&\n meta != this.getIndexMeta(targetIndex)\n ) {\n return this.shuffle();\n }\n if (meta != null && !this.isThresholdMeta(meta)) {\n const element = { position: idx, value: targetIndex };\n smallValues.push(element);\n largeValues.push(element);\n metaToPositionMap.set(meta, idx);\n indexToMetaMap.set(targetIndex, meta);\n metaToIndexMap.set(meta, targetIndex);\n indices[idx] = {\n meta,\n targetIndex,\n recyclerKey: `${this._name}_${idx}`,\n };\n }\n }\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n this._metaToPositionMap = metaToPositionMap;\n this._positionToMetaList = indices.map((v) => v?.meta);\n this.resetOnTheFlies();\n this._indexToMetaMap = indexToMetaMap;\n this.replaceMetaToIndexMap(metaToIndexMap);\n\n return indices;\n } catch (err) {\n console.log('err ', err);\n return this._positionToMetaList;\n } finally {\n this.readyToStartNextLoop();\n // clear on the fly indices after return indices.\n }\n }\n\n _pushToHeaps(position: number, value: number) {\n const element = { position, value };\n // We can reuse the same object in both heaps, because we don't mutate them\n this._smallValues.push(element);\n this._largeValues.push(element);\n }\n\n _setMetaPosition(meta: Meta, position: number) {\n // do not delete meta2position; because getPosition will get by meta first...\n // const prevMetaOnPosition = this._positionToMetaList[position];\n // if (prevMetaOnPosition) this._metaToPositionMap.delete(prevMetaOnPosition);\n this._positionToMetaList[position] = meta;\n this._metaToPositionMap.set(meta, position);\n }\n\n commitPosition(props: {\n newIndex: number;\n position: number;\n meta: Meta;\n safeRange: SafeRange;\n }) {\n const { newIndex, safeRange, position, meta } = props;\n const onTheFlyPositionMeta = this._onTheFlyIndices[position];\n let positionToReplace = position;\n\n // console.log('position ', newIndex, position);\n\n if (onTheFlyPositionMeta) {\n // such as place item 11 twice...\n if (onTheFlyPositionMeta === meta) return position;\n if (this._isOnTheFlyFull)\n return this.getFliedPosition(newIndex, safeRange);\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n\n while (this._onTheFlyIndices[positionToReplace]) {\n positionToReplace = this._replaceFurthestIndexPosition(\n newIndex,\n safeRange\n );\n }\n }\n return positionToReplace;\n }\n\n /**\n *\n * @param meta\n * @param index\n * @returns true means index not changed\n */\n _setMetaIndex(meta: Meta, index: number) {\n const prevMetaIndex = this.getMetaIndex(meta);\n if (prevMetaIndex !== undefined) {\n // no need to set\n // if (prevMetaIndex === index) return true;\n this._indexToMetaMap.delete(prevMetaIndex);\n }\n this.setMetaIndex(meta, index);\n this._indexToMetaMap.set(index, meta);\n return false;\n }\n\n readyToStartNextLoop() {\n this._lastUpdatedMS = Date.now();\n }\n\n prepare() {\n if (this._loopMS === this._lastUpdatedMS) return;\n this._loopMS = this._lastUpdatedMS;\n\n this._onTheFlyIndices = [];\n this._isOnTheFlyFull = false;\n }\n\n _cleanHeaps() {\n // We not usually only remove object from one heap while moving value.\n // Here we make sure that there is no stale data on top of heaps.\n // this._cleanHeap(this._smallValues);\n // this._cleanHeap(this._largeValues);\n\n for (let idx = 0; idx < this._positionToMetaList.length; idx++) {\n if (this._positionToMetaList[idx] == null) {\n this._recreateHeaps();\n return;\n }\n }\n\n const minHeapSize = Math.min(\n this._smallValues.size(),\n this._largeValues.size()\n );\n const maxHeapSize = Math.max(\n this._smallValues.size(),\n this._largeValues.size()\n );\n if (maxHeapSize > 10 * minHeapSize) {\n // There are many old values in one of heaps. We need to get rid of them\n // to not use too avoid memory leaks\n this._recreateHeaps();\n }\n }\n _recreateHeaps() {\n const { smallValues, largeValues } = this.initialize();\n for (\n let position = 0;\n position < this._positionToMetaList.length;\n position++\n ) {\n const meta = this._positionToMetaList[position];\n let value = this.getMetaIndex(meta);\n\n if (!meta || value === -1 || value == null) {\n value = Number.MAX_SAFE_INTEGER - position;\n }\n\n const element = { position, value };\n smallValues.push(element);\n largeValues.push(element);\n if (value > thresholdNumber) {\n // @ts-ignore\n this._setMetaPosition(value, position);\n // @ts-ignore\n this._setMetaIndex(value, value);\n }\n }\n\n // this._largeValues.peek().value;\n\n this._smallValues = smallValues;\n this._largeValues = largeValues;\n }\n\n // _cleanHeap(heap: Heap<HeapItem>) {\n // while (\n // !heap.empty() &&\n // this._metaToPositionMap.get(\n // this._indexToMetaMap.get(heap.peek()!.value)\n // ) == null\n // ) {\n // console.log('pop ---', heap.peek()!.value);\n // heap.pop();\n // }\n // }\n\n _smallerComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value < rhs.value;\n }\n\n _greaterComparator(lhs: HeapItem, rhs: HeapItem) {\n return lhs.value > rhs.value;\n }\n}\n\nexport default IntegerBufferSet;\n"],"names":["defaultMetaExtractor","value","defaultBufferSize","thresholdNumber","Number","MAX_SAFE_INTEGER","IntegerBufferSet","props","_props","_props$name","name","indexExtractor","_props$bufferSize","bufferSize","_props$metaExtractor","metaExtractor","_metaExtractor","_indexExtractor","_name","_indexToMetaMap","Map","_metaToPositionMap","_positionToMetaList","_metaToIndexMap","_onTheFlyIndices","_bufferSize","_smallValues","Heap","_smallerComparator","_largeValues","_greaterComparator","getNewPositionForIndex","bind","getIndexPosition","replaceFurthestIndexPosition","_isOnTheFlyFullReturnHook","returnHook","setIsOnTheFlyFull","_loopMS","Date","now","_lastUpdatedMS","_proto","prototype","isThresholdMeta","meta","val","data","filter","v","_isOnTheFlyFull","length","resetOnTheFlies","getOnTheFlyUncriticalPosition","safeRange","startIndex","endIndex","idx","metaIndex","getMetaIndex","isClamped","initialize","smallValues","largeValues","getIndexMeta","index","get","setMetaIndex","set","deleteMetaIndex","replaceMetaToIndexMap","newMetaToIndexMap","undefined","process","env","NODE_ENV","invariant","newPosition","_pushToHeaps","_setMetaIndex","_setMetaPosition","getMinValue","_this$_smallValues$pe","peek","getMaxValue","_this$_largeValues$pe","getFliedPosition","newIndex","getPosition","prepare","metaPosition","position","indexMeta","commitPosition","isBufferFull","_cleanHeaps","_replaceFurthestIndexPosition","empty","indexToReplace","minValue","maxValue","pop","replacedMeta","Math","abs","lowValue","highValue","shuffle","indices","Array","targetIndex","_arr","_available","indexToMetaMap","metaToIndexMap","_loop","currentIndex","currentMeta","_this","_i","findIndex","push","_ret","positionToMetaList","shift","getIndices","_this$initialize","metaToPositionMap","element","recyclerKey","map","err","console","log","readyToStartNextLoop","onTheFlyPositionMeta","positionToReplace","prevMetaIndex","_recreateHeaps","minHeapSize","min","size","maxHeapSize","max","_this$initialize2","lhs","rhs","_createClass","key"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x-oasis/integer-buffer-set",
3
- "version": "0.1.24",
3
+ "version": "0.1.27",
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.24",
19
+ "@x-oasis/heap": "0.1.27",
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
@@ -253,7 +253,7 @@ class IntegerBufferSet<Meta = any> {
253
253
  position = this.getFliedPosition(newIndex, safeRange);
254
254
  } else if (
255
255
  (indexMeta = this._indexToMetaMap.get(newIndex)) &&
256
- this._metaToPositionMap.get(indexMeta)
256
+ this._metaToPositionMap.get(indexMeta) != null
257
257
  ) {
258
258
  /**
259
259
  Index has already been stored, but we cant use its old position directly...
@@ -333,6 +333,7 @@ class IntegerBufferSet<Meta = any> {
333
333
  indexToReplace = maxValue;
334
334
  this._largeValues.pop();
335
335
  const replacedMeta = this._indexToMetaMap.get(indexToReplace);
336
+
336
337
  const position = this._metaToPositionMap.get(replacedMeta);
337
338
  return position;
338
339
  }
@@ -457,6 +458,8 @@ class IntegerBufferSet<Meta = any> {
457
458
  try {
458
459
  const indices = new Array(this._positionToMetaList.length);
459
460
  const metaToPositionMap = new Map();
461
+ const indexToMetaMap = new Map();
462
+ const metaToIndexMap = new Map();
460
463
  for (let idx = 0; idx < indices.length; idx++) {
461
464
  const meta =
462
465
  this._onTheFlyIndices[idx] || this._positionToMetaList[idx];
@@ -473,6 +476,8 @@ class IntegerBufferSet<Meta = any> {
473
476
  smallValues.push(element);
474
477
  largeValues.push(element);
475
478
  metaToPositionMap.set(meta, idx);
479
+ indexToMetaMap.set(targetIndex, meta);
480
+ metaToIndexMap.set(meta, targetIndex);
476
481
  indices[idx] = {
477
482
  meta,
478
483
  targetIndex,
@@ -485,6 +490,8 @@ class IntegerBufferSet<Meta = any> {
485
490
  this._metaToPositionMap = metaToPositionMap;
486
491
  this._positionToMetaList = indices.map((v) => v?.meta);
487
492
  this.resetOnTheFlies();
493
+ this._indexToMetaMap = indexToMetaMap;
494
+ this.replaceMetaToIndexMap(metaToIndexMap);
488
495
 
489
496
  return indices;
490
497
  } catch (err) {
@@ -625,7 +632,7 @@ class IntegerBufferSet<Meta = any> {
625
632
  }
626
633
  }
627
634
 
628
- this._largeValues.peek().value;
635
+ // this._largeValues.peek().value;
629
636
 
630
637
  this._smallValues = smallValues;
631
638
  this._largeValues = largeValues;