@x-oasis/recycler 0.1.20 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,4 +22,28 @@ $ pnpm test
22
22
 
23
23
  Basically, give an List index then get a placed position(recycler list index); In order to reuse more elements, object ref should be considered..
24
24
 
25
- For Example, remove / delete / add an element, they all cause index change of original source data. but
25
+ For Example, remove / delete / add an element, they all cause index change of original source data. but
26
+
27
+ ## API
28
+
29
+ ### updateIndices
30
+
31
+ ```js
32
+ updateIndices(props: {
33
+ /**
34
+ * index in range should not be recycled
35
+ */
36
+ safeRange: {
37
+ startIndex: number;
38
+ endIndex: number;
39
+ };
40
+ startIndex: number;
41
+ maxCount: number;
42
+ step?: number;
43
+
44
+ /**
45
+ * return boolean value, true means the current processing index should be counted in.
46
+ */
47
+ onProcess?: (type?: string, index?: number) => boolean
48
+ })
49
+ ```
package/dist/common.d.ts CHANGED
@@ -2,5 +2,4 @@ export declare const DEFAULT_RECYCLER_TYPE = "__default_recycler_buffer__";
2
2
  export declare const RECYCLER_THRESHOLD_INDEX_VALUE = 0;
3
3
  export declare const RECYCLER_RESERVED_BUFFER_PER_BATCH = 4;
4
4
  export declare const RECYCLER_BUFFER_SIZE = 10;
5
- export declare const RECYCLER_RESERVED_BUFFER_SIZE_RATIO = 1.5;
6
5
  export declare const defaultGetType: () => string;
package/dist/index.d.ts CHANGED
@@ -1,11 +1,10 @@
1
1
  import FixedBuffer from './FixedBuffer';
2
- import { RecyclerProps } from './types';
2
+ import { OnProcess, RecyclerProps } from './types';
3
3
  declare class Recycler {
4
4
  private _queue;
5
5
  private _thresholdIndexValue;
6
6
  private _recyclerReservedBufferPerBatch;
7
7
  private _recyclerBufferSize;
8
- private _recyclerReservedBufferSize;
9
8
  private _metaExtractor;
10
9
  private _indexExtractor;
11
10
  private _getType;
@@ -23,9 +22,9 @@ declare class Recycler {
23
22
  };
24
23
  startIndex: number;
25
24
  maxCount: number;
26
- step: number;
27
- maxIndex: number;
28
- }): any;
25
+ step?: number;
26
+ onProcess?: OnProcess;
27
+ }): void;
29
28
  getMinValue(): number;
30
29
  getMaxValue(): number;
31
30
  }
@@ -42,7 +42,6 @@ var DEFAULT_RECYCLER_TYPE = '__default_recycler_buffer__';
42
42
  var RECYCLER_THRESHOLD_INDEX_VALUE = 0;
43
43
  var RECYCLER_RESERVED_BUFFER_PER_BATCH = 4;
44
44
  var RECYCLER_BUFFER_SIZE = 10;
45
- var RECYCLER_RESERVED_BUFFER_SIZE_RATIO = 1.5;
46
45
 
47
46
  var FixedBuffer = /*#__PURE__*/function () {
48
47
  function FixedBuffer(props) {
@@ -113,7 +112,6 @@ var Recycler = /*#__PURE__*/function () {
113
112
  this._getType = getType;
114
113
  this._recyclerBufferSize = recyclerBufferSize;
115
114
  this._thresholdIndexValue = thresholdIndexValue;
116
- this._recyclerReservedBufferSize = Math.floor(recyclerBufferSize * RECYCLER_RESERVED_BUFFER_SIZE_RATIO);
117
115
  this._recyclerReservedBufferPerBatch = recyclerReservedBufferPerBatch;
118
116
  recyclerTypes.forEach(function (type) {
119
117
  return _this.addBuffer(type);
@@ -145,24 +143,24 @@ var Recycler = /*#__PURE__*/function () {
145
143
  return this.addBuffer(type || DEFAULT_RECYCLER_TYPE);
146
144
  };
147
145
  _proto.updateIndices = function updateIndices(props) {
148
- var _startIndex = props.startIndex,
146
+ var startIndex = props.startIndex,
149
147
  safeRange = props.safeRange,
150
- step = props.step,
148
+ _props$step = props.step,
149
+ step = _props$step === void 0 ? 1 : _props$step,
151
150
  maxCount = props.maxCount,
152
- maxIndex = props.maxIndex;
153
- var startIndex = Math.max(_startIndex, 0);
151
+ onProcess = props.onProcess;
154
152
  var count = 0;
155
- if (maxCount < 0) return null;
156
- for (var index = startIndex; step > 0 ? index <= maxIndex : index >= 0; index += step) {
157
- if (index < this._thresholdIndexValue) continue;
158
- var recyclerType = this._getType(index);
159
- if (count < maxCount) {
153
+ var _index = Math.max(startIndex, 0);
154
+ while (count < maxCount) {
155
+ if (_index >= this._thresholdIndexValue) {
156
+ var recyclerType = this._getType(_index);
160
157
  var buffer = this.ensureBuffer(recyclerType);
161
- buffer.place(index, safeRange);
162
- } else {
163
- break;
158
+ buffer.place(_index, safeRange);
159
+ if (typeof onProcess !== 'function' || onProcess(recyclerType, _index)) {
160
+ count += 1;
161
+ }
164
162
  }
165
- if (index >= this._thresholdIndexValue) count++;
163
+ _index += step;
166
164
  }
167
165
  };
168
166
  _proto.getMinValue = function getMinValue() {
@@ -1 +1 @@
1
- {"version":3,"file":"recycler.cjs.development.js","sources":["../src/common.ts","../src/FixedBuffer.ts","../src/index.ts"],"sourcesContent":["export const DEFAULT_RECYCLER_TYPE = '__default_recycler_buffer__';\nexport const RECYCLER_THRESHOLD_INDEX_VALUE = 0;\nexport const RECYCLER_RESERVED_BUFFER_PER_BATCH = 4;\nexport const RECYCLER_BUFFER_SIZE = 10;\nexport const RECYCLER_RESERVED_BUFFER_SIZE_RATIO = 1.5;\n\nexport const defaultGetType = () => DEFAULT_RECYCLER_TYPE;\n","import IntegerBufferSet from '@x-oasis/integer-buffer-set';\nimport { SafeRange, FixedBufferProps } from './types';\nimport { DEFAULT_RECYCLER_TYPE, RECYCLER_BUFFER_SIZE } from './common';\n\nclass FixedBuffer {\n private _bufferSet: IntegerBufferSet;\n private _thresholdIndexValue = 0;\n\n private _recyclerType: string;\n\n constructor(props: FixedBufferProps) {\n const {\n thresholdIndexValue = 0,\n bufferSize = RECYCLER_BUFFER_SIZE,\n recyclerType = DEFAULT_RECYCLER_TYPE,\n metaExtractor,\n indexExtractor,\n } = props;\n this._bufferSet = new IntegerBufferSet({\n bufferSize,\n metaExtractor,\n indexExtractor,\n name: recyclerType,\n });\n this._recyclerType = recyclerType;\n this._thresholdIndexValue = thresholdIndexValue;\n }\n\n get thresholdIndexValue() {\n return this._thresholdIndexValue;\n }\n\n get recyclerType() {\n return this._recyclerType;\n }\n\n place(index: number, safeRange: SafeRange) {\n this._bufferSet.getPosition(index, safeRange);\n }\n\n getMaxValue() {\n return this._bufferSet.getMaxValue();\n }\n\n getMinValue() {\n return this._bufferSet.getMinValue();\n }\n\n getIndices() {\n return this._bufferSet.getIndices();\n }\n}\n\nexport default FixedBuffer;\n","import FixedBuffer from './FixedBuffer';\nimport { RecyclerProps } from './types';\nimport {\n DEFAULT_RECYCLER_TYPE,\n RECYCLER_BUFFER_SIZE,\n RECYCLER_RESERVED_BUFFER_PER_BATCH,\n RECYCLER_RESERVED_BUFFER_SIZE_RATIO,\n RECYCLER_THRESHOLD_INDEX_VALUE,\n} from './common';\n\nclass Recycler {\n private _queue: Array<FixedBuffer> = [];\n\n /**\n * start index\n */\n private _thresholdIndexValue = 0;\n private _recyclerReservedBufferPerBatch: number;\n /**\n * buffer size, the oversize node will run into recycle strategy\n */\n private _recyclerBufferSize: number;\n private _recyclerReservedBufferSize: number;\n private _metaExtractor: (index: number) => any;\n private _indexExtractor: (meta: any) => number;\n private _getType: (index: number) => string;\n\n constructor(props?: RecyclerProps) {\n const {\n getType,\n metaExtractor,\n indexExtractor,\n recyclerTypes = [],\n recyclerBufferSize = RECYCLER_BUFFER_SIZE,\n thresholdIndexValue = RECYCLER_THRESHOLD_INDEX_VALUE,\n recyclerReservedBufferPerBatch = RECYCLER_RESERVED_BUFFER_PER_BATCH,\n } = props || {};\n\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n this._getType = getType;\n this._recyclerBufferSize = recyclerBufferSize;\n this._thresholdIndexValue = thresholdIndexValue;\n this._recyclerReservedBufferSize = Math.floor(\n recyclerBufferSize * RECYCLER_RESERVED_BUFFER_SIZE_RATIO\n );\n this._recyclerReservedBufferPerBatch = recyclerReservedBufferPerBatch;\n recyclerTypes.forEach((type) => this.addBuffer(type));\n }\n\n get queue() {\n return this._queue;\n }\n\n get thresholdIndexValue() {\n return this._thresholdIndexValue;\n }\n\n get recyclerReservedBufferPerBatch() {\n return this._recyclerReservedBufferPerBatch;\n }\n\n getIndices() {\n return this._queue.reduce((acc, cur) => acc.concat(cur.getIndices()), []);\n }\n\n addBuffer(type: string) {\n if (!type) return null;\n const index = this._queue.findIndex(\n (buffer) => buffer.recyclerType === type\n );\n if (index !== -1) return this._queue[index];\n const buffer = new FixedBuffer({\n recyclerType: type,\n metaExtractor: this._metaExtractor,\n indexExtractor: this._indexExtractor,\n bufferSize: this._recyclerBufferSize,\n thresholdIndexValue: this._thresholdIndexValue,\n });\n this._queue.push(buffer);\n return buffer;\n }\n\n ensureBuffer(type: string) {\n return this.addBuffer(type || DEFAULT_RECYCLER_TYPE);\n }\n\n updateIndices(props: {\n /**\n * index in range should not be recycled\n */\n safeRange: {\n startIndex: number;\n endIndex: number;\n };\n startIndex: number;\n maxCount: number;\n step: number;\n\n // /** the max index value, always be the length of data */\n maxIndex: number;\n }) {\n // this._queue.forEach((buffer) => buffer.start());\n const {\n startIndex: _startIndex,\n safeRange,\n step,\n maxCount,\n maxIndex,\n } = props;\n const startIndex = Math.max(_startIndex, 0);\n let count = 0;\n if (maxCount < 0) return null;\n for (\n let index = startIndex;\n step > 0 ? index <= maxIndex : index >= 0;\n index += step\n ) {\n if (index < this._thresholdIndexValue) continue;\n const recyclerType = this._getType(index);\n\n // itemLayout should not be a condition, may cause too many unLayout item\n if (count < maxCount) {\n const buffer = this.ensureBuffer(recyclerType);\n buffer.place(index, safeRange);\n } else {\n break;\n }\n\n if (index >= this._thresholdIndexValue) count++;\n }\n }\n\n getMinValue() {\n let minValue = Number.MAX_SAFE_INTEGER;\n this._queue.forEach((buffer) => {\n const v = buffer.getMinValue();\n if (typeof v === 'number') minValue = Math.min(v, minValue);\n });\n return minValue;\n }\n\n getMaxValue() {\n let maxValue = 0;\n this._queue.forEach((buffer) => {\n const v = buffer.getMaxValue();\n if (typeof v === 'number') maxValue = Math.max(v, maxValue);\n });\n return maxValue;\n }\n}\n\nexport default Recycler;\n\n// const origin = [163, 168, 142, 147, 152, 173, 178, 137, 157, 162]\n\n// const target = [163, 163, 142, 147, 152, 168, 173, 137, 157]\n\n// const next = [168, 168, 142, 147, 152, 173, 178, 137, 157, 162]\n\n// Next Sample\n// const origin = [35, 36, 37, 38, 39, 40, 41, 32, 33, 34]\n// const target = [35, 36, 37, 36, 37, 40, 41, 32, 33, 34]\n// const target = [35, 38, 39, 38, 39, 40, 41, 32, 33, 34]\n"],"names":["DEFAULT_RECYCLER_TYPE","RECYCLER_THRESHOLD_INDEX_VALUE","RECYCLER_RESERVED_BUFFER_PER_BATCH","RECYCLER_BUFFER_SIZE","RECYCLER_RESERVED_BUFFER_SIZE_RATIO","FixedBuffer","props","_props$thresholdIndex","thresholdIndexValue","_props$bufferSize","bufferSize","_props$recyclerType","recyclerType","metaExtractor","indexExtractor","_bufferSet","IntegerBufferSet","name","_recyclerType","_thresholdIndexValue","_proto","prototype","place","index","safeRange","getPosition","getMaxValue","getMinValue","getIndices","_createClass","key","get","Recycler","_ref","getType","_ref$recyclerTypes","recyclerTypes","_ref$recyclerBufferSi","recyclerBufferSize","_ref$thresholdIndexVa","_ref$recyclerReserved","recyclerReservedBufferPerBatch","_metaExtractor","_indexExtractor","_getType","_recyclerBufferSize","_recyclerReservedBufferSize","Math","floor","_recyclerReservedBufferPerBatch","forEach","type","_this","addBuffer","_queue","reduce","acc","cur","concat","findIndex","buffer","push","ensureBuffer","updateIndices","_startIndex","startIndex","step","maxCount","maxIndex","max","count","minValue","Number","MAX_SAFE_INTEGER","v","min","maxValue"],"mappings":"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"}
1
+ {"version":3,"file":"recycler.cjs.development.js","sources":["../src/common.ts","../src/FixedBuffer.ts","../src/index.ts"],"sourcesContent":["export const DEFAULT_RECYCLER_TYPE = '__default_recycler_buffer__';\nexport const RECYCLER_THRESHOLD_INDEX_VALUE = 0;\nexport const RECYCLER_RESERVED_BUFFER_PER_BATCH = 4;\nexport const RECYCLER_BUFFER_SIZE = 10;\n// export const RECYCLER_RESERVED_BUFFER_SIZE_RATIO = 1.5;\n\nexport const defaultGetType = () => DEFAULT_RECYCLER_TYPE;\n","import IntegerBufferSet from '@x-oasis/integer-buffer-set';\nimport { SafeRange, FixedBufferProps } from './types';\nimport { DEFAULT_RECYCLER_TYPE, RECYCLER_BUFFER_SIZE } from './common';\n\nclass FixedBuffer {\n private _bufferSet: IntegerBufferSet;\n private _thresholdIndexValue = 0;\n\n private _recyclerType: string;\n\n constructor(props: FixedBufferProps) {\n const {\n thresholdIndexValue = 0,\n bufferSize = RECYCLER_BUFFER_SIZE,\n recyclerType = DEFAULT_RECYCLER_TYPE,\n metaExtractor,\n indexExtractor,\n } = props;\n this._bufferSet = new IntegerBufferSet({\n bufferSize,\n metaExtractor,\n indexExtractor,\n name: recyclerType,\n });\n this._recyclerType = recyclerType;\n this._thresholdIndexValue = thresholdIndexValue;\n }\n\n get thresholdIndexValue() {\n return this._thresholdIndexValue;\n }\n\n get recyclerType() {\n return this._recyclerType;\n }\n\n place(index: number, safeRange: SafeRange) {\n this._bufferSet.getPosition(index, safeRange);\n }\n\n getMaxValue() {\n return this._bufferSet.getMaxValue();\n }\n\n getMinValue() {\n return this._bufferSet.getMinValue();\n }\n\n getIndices() {\n return this._bufferSet.getIndices();\n }\n}\n\nexport default FixedBuffer;\n","import FixedBuffer from './FixedBuffer';\nimport { OnProcess, RecyclerProps } from './types';\nimport {\n DEFAULT_RECYCLER_TYPE,\n RECYCLER_BUFFER_SIZE,\n RECYCLER_RESERVED_BUFFER_PER_BATCH,\n // RECYCLER_RESERVED_BUFFER_SIZE_RATIO,\n RECYCLER_THRESHOLD_INDEX_VALUE,\n} from './common';\n\nclass Recycler {\n private _queue: Array<FixedBuffer> = [];\n\n /**\n * start index\n */\n private _thresholdIndexValue = 0;\n private _recyclerReservedBufferPerBatch: number;\n /**\n * buffer size, the oversize node will run into recycle strategy\n */\n private _recyclerBufferSize: number;\n private _metaExtractor: (index: number) => any;\n private _indexExtractor: (meta: any) => number;\n private _getType: (index: number) => string;\n\n constructor(props?: RecyclerProps) {\n const {\n getType,\n metaExtractor,\n indexExtractor,\n recyclerTypes = [],\n recyclerBufferSize = RECYCLER_BUFFER_SIZE,\n thresholdIndexValue = RECYCLER_THRESHOLD_INDEX_VALUE,\n recyclerReservedBufferPerBatch = RECYCLER_RESERVED_BUFFER_PER_BATCH,\n } = props || {};\n\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n this._getType = getType;\n this._recyclerBufferSize = recyclerBufferSize;\n this._thresholdIndexValue = thresholdIndexValue;\n this._recyclerReservedBufferPerBatch = recyclerReservedBufferPerBatch;\n recyclerTypes.forEach((type) => this.addBuffer(type));\n }\n\n get queue() {\n return this._queue;\n }\n\n get thresholdIndexValue() {\n return this._thresholdIndexValue;\n }\n\n get recyclerReservedBufferPerBatch() {\n return this._recyclerReservedBufferPerBatch;\n }\n\n getIndices() {\n return this._queue.reduce((acc, cur) => acc.concat(cur.getIndices()), []);\n }\n\n addBuffer(type: string) {\n if (!type) return null;\n const index = this._queue.findIndex(\n (buffer) => buffer.recyclerType === type\n );\n if (index !== -1) return this._queue[index];\n const buffer = new FixedBuffer({\n recyclerType: type,\n metaExtractor: this._metaExtractor,\n indexExtractor: this._indexExtractor,\n bufferSize: this._recyclerBufferSize,\n thresholdIndexValue: this._thresholdIndexValue,\n });\n this._queue.push(buffer);\n return buffer;\n }\n\n ensureBuffer(type: string) {\n return this.addBuffer(type || DEFAULT_RECYCLER_TYPE);\n }\n\n updateIndices(props: {\n /**\n * index in range should not be recycled\n */\n safeRange: {\n startIndex: number;\n endIndex: number;\n };\n startIndex: number;\n maxCount: number;\n step?: number;\n onProcess?: OnProcess;\n }) {\n const { startIndex, safeRange, step = 1, maxCount, onProcess } = props;\n let count = 0;\n let _index = Math.max(startIndex, 0);\n while (count < maxCount) {\n if (_index >= this._thresholdIndexValue) {\n const recyclerType = this._getType(_index);\n const buffer = this.ensureBuffer(recyclerType);\n buffer.place(_index, safeRange);\n\n if (\n typeof onProcess !== 'function' ||\n onProcess(recyclerType, _index)\n ) {\n count += 1;\n }\n }\n _index += step;\n }\n }\n\n getMinValue() {\n let minValue = Number.MAX_SAFE_INTEGER;\n this._queue.forEach((buffer) => {\n const v = buffer.getMinValue();\n if (typeof v === 'number') minValue = Math.min(v, minValue);\n });\n return minValue;\n }\n\n getMaxValue() {\n let maxValue = 0;\n this._queue.forEach((buffer) => {\n const v = buffer.getMaxValue();\n if (typeof v === 'number') maxValue = Math.max(v, maxValue);\n });\n return maxValue;\n }\n}\n\nexport default Recycler;\n"],"names":["DEFAULT_RECYCLER_TYPE","RECYCLER_THRESHOLD_INDEX_VALUE","RECYCLER_RESERVED_BUFFER_PER_BATCH","RECYCLER_BUFFER_SIZE","FixedBuffer","props","_props$thresholdIndex","thresholdIndexValue","_props$bufferSize","bufferSize","_props$recyclerType","recyclerType","metaExtractor","indexExtractor","_bufferSet","IntegerBufferSet","name","_recyclerType","_thresholdIndexValue","_proto","prototype","place","index","safeRange","getPosition","getMaxValue","getMinValue","getIndices","_createClass","key","get","Recycler","_ref","getType","_ref$recyclerTypes","recyclerTypes","_ref$recyclerBufferSi","recyclerBufferSize","_ref$thresholdIndexVa","_ref$recyclerReserved","recyclerReservedBufferPerBatch","_metaExtractor","_indexExtractor","_getType","_recyclerBufferSize","_recyclerReservedBufferPerBatch","forEach","type","_this","addBuffer","_queue","reduce","acc","cur","concat","findIndex","buffer","push","ensureBuffer","updateIndices","startIndex","_props$step","step","maxCount","onProcess","count","_index","Math","max","minValue","Number","MAX_SAFE_INTEGER","v","min","maxValue"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=(e=require("@x-oasis/integer-buffer-set"))&&"object"==typeof e&&"default"in e?e.default:e;function t(e,r){for(var t=0;t<r.length;t++){var u=r[t];u.enumerable=u.enumerable||!1,u.configurable=!0,"value"in u&&(u.writable=!0),Object.defineProperty(e,"symbol"==typeof(n=function(e,r){if("object"!=typeof e||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var u=t.call(e,"string");if("object"!=typeof u)return u;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(u.key))?n:String(n),u)}var n}function u(e,r,u){return r&&t(e.prototype,r),u&&t(e,u),Object.defineProperty(e,"prototype",{writable:!1}),e}var n=function(){function e(e){this._thresholdIndexValue=0;var t=e.thresholdIndexValue,u=void 0===t?0:t,n=e.bufferSize,i=e.recyclerType,a=void 0===i?"__default_recycler_buffer__":i;this._bufferSet=new r({bufferSize:void 0===n?10:n,metaExtractor:e.metaExtractor,indexExtractor:e.indexExtractor,name:a}),this._recyclerType=a,this._thresholdIndexValue=u}var t=e.prototype;return t.place=function(e,r){this._bufferSet.getPosition(e,r)},t.getMaxValue=function(){return this._bufferSet.getMaxValue()},t.getMinValue=function(){return this._bufferSet.getMinValue()},t.getIndices=function(){return this._bufferSet.getIndices()},u(e,[{key:"thresholdIndexValue",get:function(){return this._thresholdIndexValue}},{key:"recyclerType",get:function(){return this._recyclerType}}]),e}();exports.default=function(){function e(e){var r=this;this._queue=[],this._thresholdIndexValue=0;var t=e||{},u=t.getType,n=t.indexExtractor,i=t.recyclerTypes,a=void 0===i?[]:i,f=t.recyclerBufferSize,o=void 0===f?10:f,c=t.thresholdIndexValue,l=void 0===c?0:c,s=t.recyclerReservedBufferPerBatch,h=void 0===s?4:s;this._metaExtractor=t.metaExtractor,this._indexExtractor=n,this._getType=u,this._recyclerBufferSize=o,this._thresholdIndexValue=l,this._recyclerReservedBufferSize=Math.floor(1.5*o),this._recyclerReservedBufferPerBatch=h,a.forEach((function(e){return r.addBuffer(e)}))}var r=e.prototype;return r.getIndices=function(){return this._queue.reduce((function(e,r){return e.concat(r.getIndices())}),[])},r.addBuffer=function(e){if(!e)return null;var r=this._queue.findIndex((function(r){return r.recyclerType===e}));if(-1!==r)return this._queue[r];var t=new n({recyclerType:e,metaExtractor:this._metaExtractor,indexExtractor:this._indexExtractor,bufferSize:this._recyclerBufferSize,thresholdIndexValue:this._thresholdIndexValue});return this._queue.push(t),t},r.ensureBuffer=function(e){return this.addBuffer(e||"__default_recycler_buffer__")},r.updateIndices=function(e){var r=e.safeRange,t=e.step,u=e.maxCount,n=e.maxIndex,i=Math.max(e.startIndex,0),a=0;if(u<0)return null;for(var f=i;t>0?f<=n:f>=0;f+=t)if(!(f<this._thresholdIndexValue)){var o=this._getType(f);if(!(a<u))break;this.ensureBuffer(o).place(f,r),f>=this._thresholdIndexValue&&a++}},r.getMinValue=function(){var e=Number.MAX_SAFE_INTEGER;return this._queue.forEach((function(r){var t=r.getMinValue();"number"==typeof t&&(e=Math.min(t,e))})),e},r.getMaxValue=function(){var e=0;return this._queue.forEach((function(r){var t=r.getMaxValue();"number"==typeof t&&(e=Math.max(t,e))})),e},u(e,[{key:"queue",get:function(){return this._queue}},{key:"thresholdIndexValue",get:function(){return this._thresholdIndexValue}},{key:"recyclerReservedBufferPerBatch",get:function(){return this._recyclerReservedBufferPerBatch}}]),e}();
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=(e=require("@x-oasis/integer-buffer-set"))&&"object"==typeof e&&"default"in e?e.default:e;function r(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,"symbol"==typeof(u=function(e,t){if("object"!=typeof e||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(n.key))?u:String(u),n)}var u}function n(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}var u=function(){function e(e){this._thresholdIndexValue=0;var r=e.thresholdIndexValue,n=void 0===r?0:r,u=e.bufferSize,i=e.recyclerType,o=void 0===i?"__default_recycler_buffer__":i;this._bufferSet=new t({bufferSize:void 0===u?10:u,metaExtractor:e.metaExtractor,indexExtractor:e.indexExtractor,name:o}),this._recyclerType=o,this._thresholdIndexValue=n}var r=e.prototype;return r.place=function(e,t){this._bufferSet.getPosition(e,t)},r.getMaxValue=function(){return this._bufferSet.getMaxValue()},r.getMinValue=function(){return this._bufferSet.getMinValue()},r.getIndices=function(){return this._bufferSet.getIndices()},n(e,[{key:"thresholdIndexValue",get:function(){return this._thresholdIndexValue}},{key:"recyclerType",get:function(){return this._recyclerType}}]),e}();exports.default=function(){function e(e){var t=this;this._queue=[],this._thresholdIndexValue=0;var r=e||{},n=r.getType,u=r.indexExtractor,i=r.recyclerTypes,o=void 0===i?[]:i,a=r.recyclerBufferSize,f=void 0===a?10:a,c=r.thresholdIndexValue,s=void 0===c?0:c,h=r.recyclerReservedBufferPerBatch,l=void 0===h?4:h;this._metaExtractor=r.metaExtractor,this._indexExtractor=u,this._getType=n,this._recyclerBufferSize=f,this._thresholdIndexValue=s,this._recyclerReservedBufferPerBatch=l,o.forEach((function(e){return t.addBuffer(e)}))}var t=e.prototype;return t.getIndices=function(){return this._queue.reduce((function(e,t){return e.concat(t.getIndices())}),[])},t.addBuffer=function(e){if(!e)return null;var t=this._queue.findIndex((function(t){return t.recyclerType===e}));if(-1!==t)return this._queue[t];var r=new u({recyclerType:e,metaExtractor:this._metaExtractor,indexExtractor:this._indexExtractor,bufferSize:this._recyclerBufferSize,thresholdIndexValue:this._thresholdIndexValue});return this._queue.push(r),r},t.ensureBuffer=function(e){return this.addBuffer(e||"__default_recycler_buffer__")},t.updateIndices=function(e){for(var t=e.safeRange,r=e.step,n=void 0===r?1:r,u=e.maxCount,i=e.onProcess,o=0,a=Math.max(e.startIndex,0);o<u;){if(a>=this._thresholdIndexValue){var f=this._getType(a);this.ensureBuffer(f).place(a,t),("function"!=typeof i||i(f,a))&&(o+=1)}a+=n}},t.getMinValue=function(){var e=Number.MAX_SAFE_INTEGER;return this._queue.forEach((function(t){var r=t.getMinValue();"number"==typeof r&&(e=Math.min(r,e))})),e},t.getMaxValue=function(){var e=0;return this._queue.forEach((function(t){var r=t.getMaxValue();"number"==typeof r&&(e=Math.max(r,e))})),e},n(e,[{key:"queue",get:function(){return this._queue}},{key:"thresholdIndexValue",get:function(){return this._thresholdIndexValue}},{key:"recyclerReservedBufferPerBatch",get:function(){return this._recyclerReservedBufferPerBatch}}]),e}();
2
2
  //# sourceMappingURL=recycler.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recycler.cjs.production.min.js","sources":["../src/common.ts","../src/FixedBuffer.ts","../src/index.ts"],"sourcesContent":["export const DEFAULT_RECYCLER_TYPE = '__default_recycler_buffer__';\nexport const RECYCLER_THRESHOLD_INDEX_VALUE = 0;\nexport const RECYCLER_RESERVED_BUFFER_PER_BATCH = 4;\nexport const RECYCLER_BUFFER_SIZE = 10;\nexport const RECYCLER_RESERVED_BUFFER_SIZE_RATIO = 1.5;\n\nexport const defaultGetType = () => DEFAULT_RECYCLER_TYPE;\n","import IntegerBufferSet from '@x-oasis/integer-buffer-set';\nimport { SafeRange, FixedBufferProps } from './types';\nimport { DEFAULT_RECYCLER_TYPE, RECYCLER_BUFFER_SIZE } from './common';\n\nclass FixedBuffer {\n private _bufferSet: IntegerBufferSet;\n private _thresholdIndexValue = 0;\n\n private _recyclerType: string;\n\n constructor(props: FixedBufferProps) {\n const {\n thresholdIndexValue = 0,\n bufferSize = RECYCLER_BUFFER_SIZE,\n recyclerType = DEFAULT_RECYCLER_TYPE,\n metaExtractor,\n indexExtractor,\n } = props;\n this._bufferSet = new IntegerBufferSet({\n bufferSize,\n metaExtractor,\n indexExtractor,\n name: recyclerType,\n });\n this._recyclerType = recyclerType;\n this._thresholdIndexValue = thresholdIndexValue;\n }\n\n get thresholdIndexValue() {\n return this._thresholdIndexValue;\n }\n\n get recyclerType() {\n return this._recyclerType;\n }\n\n place(index: number, safeRange: SafeRange) {\n this._bufferSet.getPosition(index, safeRange);\n }\n\n getMaxValue() {\n return this._bufferSet.getMaxValue();\n }\n\n getMinValue() {\n return this._bufferSet.getMinValue();\n }\n\n getIndices() {\n return this._bufferSet.getIndices();\n }\n}\n\nexport default FixedBuffer;\n","import FixedBuffer from './FixedBuffer';\nimport { RecyclerProps } from './types';\nimport {\n DEFAULT_RECYCLER_TYPE,\n RECYCLER_BUFFER_SIZE,\n RECYCLER_RESERVED_BUFFER_PER_BATCH,\n RECYCLER_RESERVED_BUFFER_SIZE_RATIO,\n RECYCLER_THRESHOLD_INDEX_VALUE,\n} from './common';\n\nclass Recycler {\n private _queue: Array<FixedBuffer> = [];\n\n /**\n * start index\n */\n private _thresholdIndexValue = 0;\n private _recyclerReservedBufferPerBatch: number;\n /**\n * buffer size, the oversize node will run into recycle strategy\n */\n private _recyclerBufferSize: number;\n private _recyclerReservedBufferSize: number;\n private _metaExtractor: (index: number) => any;\n private _indexExtractor: (meta: any) => number;\n private _getType: (index: number) => string;\n\n constructor(props?: RecyclerProps) {\n const {\n getType,\n metaExtractor,\n indexExtractor,\n recyclerTypes = [],\n recyclerBufferSize = RECYCLER_BUFFER_SIZE,\n thresholdIndexValue = RECYCLER_THRESHOLD_INDEX_VALUE,\n recyclerReservedBufferPerBatch = RECYCLER_RESERVED_BUFFER_PER_BATCH,\n } = props || {};\n\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n this._getType = getType;\n this._recyclerBufferSize = recyclerBufferSize;\n this._thresholdIndexValue = thresholdIndexValue;\n this._recyclerReservedBufferSize = Math.floor(\n recyclerBufferSize * RECYCLER_RESERVED_BUFFER_SIZE_RATIO\n );\n this._recyclerReservedBufferPerBatch = recyclerReservedBufferPerBatch;\n recyclerTypes.forEach((type) => this.addBuffer(type));\n }\n\n get queue() {\n return this._queue;\n }\n\n get thresholdIndexValue() {\n return this._thresholdIndexValue;\n }\n\n get recyclerReservedBufferPerBatch() {\n return this._recyclerReservedBufferPerBatch;\n }\n\n getIndices() {\n return this._queue.reduce((acc, cur) => acc.concat(cur.getIndices()), []);\n }\n\n addBuffer(type: string) {\n if (!type) return null;\n const index = this._queue.findIndex(\n (buffer) => buffer.recyclerType === type\n );\n if (index !== -1) return this._queue[index];\n const buffer = new FixedBuffer({\n recyclerType: type,\n metaExtractor: this._metaExtractor,\n indexExtractor: this._indexExtractor,\n bufferSize: this._recyclerBufferSize,\n thresholdIndexValue: this._thresholdIndexValue,\n });\n this._queue.push(buffer);\n return buffer;\n }\n\n ensureBuffer(type: string) {\n return this.addBuffer(type || DEFAULT_RECYCLER_TYPE);\n }\n\n updateIndices(props: {\n /**\n * index in range should not be recycled\n */\n safeRange: {\n startIndex: number;\n endIndex: number;\n };\n startIndex: number;\n maxCount: number;\n step: number;\n\n // /** the max index value, always be the length of data */\n maxIndex: number;\n }) {\n // this._queue.forEach((buffer) => buffer.start());\n const {\n startIndex: _startIndex,\n safeRange,\n step,\n maxCount,\n maxIndex,\n } = props;\n const startIndex = Math.max(_startIndex, 0);\n let count = 0;\n if (maxCount < 0) return null;\n for (\n let index = startIndex;\n step > 0 ? index <= maxIndex : index >= 0;\n index += step\n ) {\n if (index < this._thresholdIndexValue) continue;\n const recyclerType = this._getType(index);\n\n // itemLayout should not be a condition, may cause too many unLayout item\n if (count < maxCount) {\n const buffer = this.ensureBuffer(recyclerType);\n buffer.place(index, safeRange);\n } else {\n break;\n }\n\n if (index >= this._thresholdIndexValue) count++;\n }\n }\n\n getMinValue() {\n let minValue = Number.MAX_SAFE_INTEGER;\n this._queue.forEach((buffer) => {\n const v = buffer.getMinValue();\n if (typeof v === 'number') minValue = Math.min(v, minValue);\n });\n return minValue;\n }\n\n getMaxValue() {\n let maxValue = 0;\n this._queue.forEach((buffer) => {\n const v = buffer.getMaxValue();\n if (typeof v === 'number') maxValue = Math.max(v, maxValue);\n });\n return maxValue;\n }\n}\n\nexport default Recycler;\n\n// const origin = [163, 168, 142, 147, 152, 173, 178, 137, 157, 162]\n\n// const target = [163, 163, 142, 147, 152, 168, 173, 137, 157]\n\n// const next = [168, 168, 142, 147, 152, 173, 178, 137, 157, 162]\n\n// Next Sample\n// const origin = [35, 36, 37, 38, 39, 40, 41, 32, 33, 34]\n// const target = [35, 36, 37, 36, 37, 40, 41, 32, 33, 34]\n// const target = [35, 38, 39, 38, 39, 40, 41, 32, 33, 34]\n"],"names":["FixedBuffer","props","this","_props$thresholdIndex","thresholdIndexValue","_props$bufferSize","bufferSize","_props$recyclerType","recyclerType","_bufferSet","IntegerBufferSet","metaExtractor","indexExtractor","name","_recyclerType","_thresholdIndexValue","_proto","prototype","place","index","safeRange","getPosition","getMaxValue","getMinValue","getIndices","_createClass","key","get","Recycler","_ref","getType","_ref$recyclerTypes","recyclerTypes","_ref$recyclerBufferSi","recyclerBufferSize","_ref$thresholdIndexVa","_ref$recyclerReserved","recyclerReservedBufferPerBatch","_metaExtractor","_indexExtractor","_getType","_recyclerBufferSize","_recyclerReservedBufferSize","Math","floor","_recyclerReservedBufferPerBatch","forEach","type","_this","addBuffer","_queue","reduce","acc","cur","concat","findIndex","buffer","push","ensureBuffer","updateIndices","step","maxCount","maxIndex","startIndex","max","count","minValue","Number","MAX_SAFE_INTEGER","v","min","maxValue"],"mappings":"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"}
1
+ {"version":3,"file":"recycler.cjs.production.min.js","sources":["../src/common.ts","../src/FixedBuffer.ts","../src/index.ts"],"sourcesContent":["export const DEFAULT_RECYCLER_TYPE = '__default_recycler_buffer__';\nexport const RECYCLER_THRESHOLD_INDEX_VALUE = 0;\nexport const RECYCLER_RESERVED_BUFFER_PER_BATCH = 4;\nexport const RECYCLER_BUFFER_SIZE = 10;\n// export const RECYCLER_RESERVED_BUFFER_SIZE_RATIO = 1.5;\n\nexport const defaultGetType = () => DEFAULT_RECYCLER_TYPE;\n","import IntegerBufferSet from '@x-oasis/integer-buffer-set';\nimport { SafeRange, FixedBufferProps } from './types';\nimport { DEFAULT_RECYCLER_TYPE, RECYCLER_BUFFER_SIZE } from './common';\n\nclass FixedBuffer {\n private _bufferSet: IntegerBufferSet;\n private _thresholdIndexValue = 0;\n\n private _recyclerType: string;\n\n constructor(props: FixedBufferProps) {\n const {\n thresholdIndexValue = 0,\n bufferSize = RECYCLER_BUFFER_SIZE,\n recyclerType = DEFAULT_RECYCLER_TYPE,\n metaExtractor,\n indexExtractor,\n } = props;\n this._bufferSet = new IntegerBufferSet({\n bufferSize,\n metaExtractor,\n indexExtractor,\n name: recyclerType,\n });\n this._recyclerType = recyclerType;\n this._thresholdIndexValue = thresholdIndexValue;\n }\n\n get thresholdIndexValue() {\n return this._thresholdIndexValue;\n }\n\n get recyclerType() {\n return this._recyclerType;\n }\n\n place(index: number, safeRange: SafeRange) {\n this._bufferSet.getPosition(index, safeRange);\n }\n\n getMaxValue() {\n return this._bufferSet.getMaxValue();\n }\n\n getMinValue() {\n return this._bufferSet.getMinValue();\n }\n\n getIndices() {\n return this._bufferSet.getIndices();\n }\n}\n\nexport default FixedBuffer;\n","import FixedBuffer from './FixedBuffer';\nimport { OnProcess, RecyclerProps } from './types';\nimport {\n DEFAULT_RECYCLER_TYPE,\n RECYCLER_BUFFER_SIZE,\n RECYCLER_RESERVED_BUFFER_PER_BATCH,\n // RECYCLER_RESERVED_BUFFER_SIZE_RATIO,\n RECYCLER_THRESHOLD_INDEX_VALUE,\n} from './common';\n\nclass Recycler {\n private _queue: Array<FixedBuffer> = [];\n\n /**\n * start index\n */\n private _thresholdIndexValue = 0;\n private _recyclerReservedBufferPerBatch: number;\n /**\n * buffer size, the oversize node will run into recycle strategy\n */\n private _recyclerBufferSize: number;\n private _metaExtractor: (index: number) => any;\n private _indexExtractor: (meta: any) => number;\n private _getType: (index: number) => string;\n\n constructor(props?: RecyclerProps) {\n const {\n getType,\n metaExtractor,\n indexExtractor,\n recyclerTypes = [],\n recyclerBufferSize = RECYCLER_BUFFER_SIZE,\n thresholdIndexValue = RECYCLER_THRESHOLD_INDEX_VALUE,\n recyclerReservedBufferPerBatch = RECYCLER_RESERVED_BUFFER_PER_BATCH,\n } = props || {};\n\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n this._getType = getType;\n this._recyclerBufferSize = recyclerBufferSize;\n this._thresholdIndexValue = thresholdIndexValue;\n this._recyclerReservedBufferPerBatch = recyclerReservedBufferPerBatch;\n recyclerTypes.forEach((type) => this.addBuffer(type));\n }\n\n get queue() {\n return this._queue;\n }\n\n get thresholdIndexValue() {\n return this._thresholdIndexValue;\n }\n\n get recyclerReservedBufferPerBatch() {\n return this._recyclerReservedBufferPerBatch;\n }\n\n getIndices() {\n return this._queue.reduce((acc, cur) => acc.concat(cur.getIndices()), []);\n }\n\n addBuffer(type: string) {\n if (!type) return null;\n const index = this._queue.findIndex(\n (buffer) => buffer.recyclerType === type\n );\n if (index !== -1) return this._queue[index];\n const buffer = new FixedBuffer({\n recyclerType: type,\n metaExtractor: this._metaExtractor,\n indexExtractor: this._indexExtractor,\n bufferSize: this._recyclerBufferSize,\n thresholdIndexValue: this._thresholdIndexValue,\n });\n this._queue.push(buffer);\n return buffer;\n }\n\n ensureBuffer(type: string) {\n return this.addBuffer(type || DEFAULT_RECYCLER_TYPE);\n }\n\n updateIndices(props: {\n /**\n * index in range should not be recycled\n */\n safeRange: {\n startIndex: number;\n endIndex: number;\n };\n startIndex: number;\n maxCount: number;\n step?: number;\n onProcess?: OnProcess;\n }) {\n const { startIndex, safeRange, step = 1, maxCount, onProcess } = props;\n let count = 0;\n let _index = Math.max(startIndex, 0);\n while (count < maxCount) {\n if (_index >= this._thresholdIndexValue) {\n const recyclerType = this._getType(_index);\n const buffer = this.ensureBuffer(recyclerType);\n buffer.place(_index, safeRange);\n\n if (\n typeof onProcess !== 'function' ||\n onProcess(recyclerType, _index)\n ) {\n count += 1;\n }\n }\n _index += step;\n }\n }\n\n getMinValue() {\n let minValue = Number.MAX_SAFE_INTEGER;\n this._queue.forEach((buffer) => {\n const v = buffer.getMinValue();\n if (typeof v === 'number') minValue = Math.min(v, minValue);\n });\n return minValue;\n }\n\n getMaxValue() {\n let maxValue = 0;\n this._queue.forEach((buffer) => {\n const v = buffer.getMaxValue();\n if (typeof v === 'number') maxValue = Math.max(v, maxValue);\n });\n return maxValue;\n }\n}\n\nexport default Recycler;\n"],"names":["FixedBuffer","props","this","_props$thresholdIndex","thresholdIndexValue","_props$bufferSize","bufferSize","_props$recyclerType","recyclerType","_bufferSet","IntegerBufferSet","metaExtractor","indexExtractor","name","_recyclerType","_thresholdIndexValue","_proto","prototype","place","index","safeRange","getPosition","getMaxValue","getMinValue","getIndices","_createClass","key","get","Recycler","_ref","getType","_ref$recyclerTypes","recyclerTypes","_ref$recyclerBufferSi","recyclerBufferSize","_ref$thresholdIndexVa","_ref$recyclerReserved","recyclerReservedBufferPerBatch","_metaExtractor","_indexExtractor","_getType","_recyclerBufferSize","_recyclerReservedBufferPerBatch","forEach","type","_this","addBuffer","_queue","reduce","acc","cur","concat","findIndex","buffer","push","ensureBuffer","updateIndices","_props$step","step","maxCount","onProcess","count","_index","Math","max","startIndex","minValue","Number","MAX_SAFE_INTEGER","v","min","maxValue"],"mappings":"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"}
@@ -36,7 +36,6 @@ var DEFAULT_RECYCLER_TYPE = '__default_recycler_buffer__';
36
36
  var RECYCLER_THRESHOLD_INDEX_VALUE = 0;
37
37
  var RECYCLER_RESERVED_BUFFER_PER_BATCH = 4;
38
38
  var RECYCLER_BUFFER_SIZE = 10;
39
- var RECYCLER_RESERVED_BUFFER_SIZE_RATIO = 1.5;
40
39
 
41
40
  var FixedBuffer = /*#__PURE__*/function () {
42
41
  function FixedBuffer(props) {
@@ -107,7 +106,6 @@ var Recycler = /*#__PURE__*/function () {
107
106
  this._getType = getType;
108
107
  this._recyclerBufferSize = recyclerBufferSize;
109
108
  this._thresholdIndexValue = thresholdIndexValue;
110
- this._recyclerReservedBufferSize = Math.floor(recyclerBufferSize * RECYCLER_RESERVED_BUFFER_SIZE_RATIO);
111
109
  this._recyclerReservedBufferPerBatch = recyclerReservedBufferPerBatch;
112
110
  recyclerTypes.forEach(function (type) {
113
111
  return _this.addBuffer(type);
@@ -139,24 +137,24 @@ var Recycler = /*#__PURE__*/function () {
139
137
  return this.addBuffer(type || DEFAULT_RECYCLER_TYPE);
140
138
  };
141
139
  _proto.updateIndices = function updateIndices(props) {
142
- var _startIndex = props.startIndex,
140
+ var startIndex = props.startIndex,
143
141
  safeRange = props.safeRange,
144
- step = props.step,
142
+ _props$step = props.step,
143
+ step = _props$step === void 0 ? 1 : _props$step,
145
144
  maxCount = props.maxCount,
146
- maxIndex = props.maxIndex;
147
- var startIndex = Math.max(_startIndex, 0);
145
+ onProcess = props.onProcess;
148
146
  var count = 0;
149
- if (maxCount < 0) return null;
150
- for (var index = startIndex; step > 0 ? index <= maxIndex : index >= 0; index += step) {
151
- if (index < this._thresholdIndexValue) continue;
152
- var recyclerType = this._getType(index);
153
- if (count < maxCount) {
147
+ var _index = Math.max(startIndex, 0);
148
+ while (count < maxCount) {
149
+ if (_index >= this._thresholdIndexValue) {
150
+ var recyclerType = this._getType(_index);
154
151
  var buffer = this.ensureBuffer(recyclerType);
155
- buffer.place(index, safeRange);
156
- } else {
157
- break;
152
+ buffer.place(_index, safeRange);
153
+ if (typeof onProcess !== 'function' || onProcess(recyclerType, _index)) {
154
+ count += 1;
155
+ }
158
156
  }
159
- if (index >= this._thresholdIndexValue) count++;
157
+ _index += step;
160
158
  }
161
159
  };
162
160
  _proto.getMinValue = function getMinValue() {
@@ -1 +1 @@
1
- {"version":3,"file":"recycler.esm.js","sources":["../src/common.ts","../src/FixedBuffer.ts","../src/index.ts"],"sourcesContent":["export const DEFAULT_RECYCLER_TYPE = '__default_recycler_buffer__';\nexport const RECYCLER_THRESHOLD_INDEX_VALUE = 0;\nexport const RECYCLER_RESERVED_BUFFER_PER_BATCH = 4;\nexport const RECYCLER_BUFFER_SIZE = 10;\nexport const RECYCLER_RESERVED_BUFFER_SIZE_RATIO = 1.5;\n\nexport const defaultGetType = () => DEFAULT_RECYCLER_TYPE;\n","import IntegerBufferSet from '@x-oasis/integer-buffer-set';\nimport { SafeRange, FixedBufferProps } from './types';\nimport { DEFAULT_RECYCLER_TYPE, RECYCLER_BUFFER_SIZE } from './common';\n\nclass FixedBuffer {\n private _bufferSet: IntegerBufferSet;\n private _thresholdIndexValue = 0;\n\n private _recyclerType: string;\n\n constructor(props: FixedBufferProps) {\n const {\n thresholdIndexValue = 0,\n bufferSize = RECYCLER_BUFFER_SIZE,\n recyclerType = DEFAULT_RECYCLER_TYPE,\n metaExtractor,\n indexExtractor,\n } = props;\n this._bufferSet = new IntegerBufferSet({\n bufferSize,\n metaExtractor,\n indexExtractor,\n name: recyclerType,\n });\n this._recyclerType = recyclerType;\n this._thresholdIndexValue = thresholdIndexValue;\n }\n\n get thresholdIndexValue() {\n return this._thresholdIndexValue;\n }\n\n get recyclerType() {\n return this._recyclerType;\n }\n\n place(index: number, safeRange: SafeRange) {\n this._bufferSet.getPosition(index, safeRange);\n }\n\n getMaxValue() {\n return this._bufferSet.getMaxValue();\n }\n\n getMinValue() {\n return this._bufferSet.getMinValue();\n }\n\n getIndices() {\n return this._bufferSet.getIndices();\n }\n}\n\nexport default FixedBuffer;\n","import FixedBuffer from './FixedBuffer';\nimport { RecyclerProps } from './types';\nimport {\n DEFAULT_RECYCLER_TYPE,\n RECYCLER_BUFFER_SIZE,\n RECYCLER_RESERVED_BUFFER_PER_BATCH,\n RECYCLER_RESERVED_BUFFER_SIZE_RATIO,\n RECYCLER_THRESHOLD_INDEX_VALUE,\n} from './common';\n\nclass Recycler {\n private _queue: Array<FixedBuffer> = [];\n\n /**\n * start index\n */\n private _thresholdIndexValue = 0;\n private _recyclerReservedBufferPerBatch: number;\n /**\n * buffer size, the oversize node will run into recycle strategy\n */\n private _recyclerBufferSize: number;\n private _recyclerReservedBufferSize: number;\n private _metaExtractor: (index: number) => any;\n private _indexExtractor: (meta: any) => number;\n private _getType: (index: number) => string;\n\n constructor(props?: RecyclerProps) {\n const {\n getType,\n metaExtractor,\n indexExtractor,\n recyclerTypes = [],\n recyclerBufferSize = RECYCLER_BUFFER_SIZE,\n thresholdIndexValue = RECYCLER_THRESHOLD_INDEX_VALUE,\n recyclerReservedBufferPerBatch = RECYCLER_RESERVED_BUFFER_PER_BATCH,\n } = props || {};\n\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n this._getType = getType;\n this._recyclerBufferSize = recyclerBufferSize;\n this._thresholdIndexValue = thresholdIndexValue;\n this._recyclerReservedBufferSize = Math.floor(\n recyclerBufferSize * RECYCLER_RESERVED_BUFFER_SIZE_RATIO\n );\n this._recyclerReservedBufferPerBatch = recyclerReservedBufferPerBatch;\n recyclerTypes.forEach((type) => this.addBuffer(type));\n }\n\n get queue() {\n return this._queue;\n }\n\n get thresholdIndexValue() {\n return this._thresholdIndexValue;\n }\n\n get recyclerReservedBufferPerBatch() {\n return this._recyclerReservedBufferPerBatch;\n }\n\n getIndices() {\n return this._queue.reduce((acc, cur) => acc.concat(cur.getIndices()), []);\n }\n\n addBuffer(type: string) {\n if (!type) return null;\n const index = this._queue.findIndex(\n (buffer) => buffer.recyclerType === type\n );\n if (index !== -1) return this._queue[index];\n const buffer = new FixedBuffer({\n recyclerType: type,\n metaExtractor: this._metaExtractor,\n indexExtractor: this._indexExtractor,\n bufferSize: this._recyclerBufferSize,\n thresholdIndexValue: this._thresholdIndexValue,\n });\n this._queue.push(buffer);\n return buffer;\n }\n\n ensureBuffer(type: string) {\n return this.addBuffer(type || DEFAULT_RECYCLER_TYPE);\n }\n\n updateIndices(props: {\n /**\n * index in range should not be recycled\n */\n safeRange: {\n startIndex: number;\n endIndex: number;\n };\n startIndex: number;\n maxCount: number;\n step: number;\n\n // /** the max index value, always be the length of data */\n maxIndex: number;\n }) {\n // this._queue.forEach((buffer) => buffer.start());\n const {\n startIndex: _startIndex,\n safeRange,\n step,\n maxCount,\n maxIndex,\n } = props;\n const startIndex = Math.max(_startIndex, 0);\n let count = 0;\n if (maxCount < 0) return null;\n for (\n let index = startIndex;\n step > 0 ? index <= maxIndex : index >= 0;\n index += step\n ) {\n if (index < this._thresholdIndexValue) continue;\n const recyclerType = this._getType(index);\n\n // itemLayout should not be a condition, may cause too many unLayout item\n if (count < maxCount) {\n const buffer = this.ensureBuffer(recyclerType);\n buffer.place(index, safeRange);\n } else {\n break;\n }\n\n if (index >= this._thresholdIndexValue) count++;\n }\n }\n\n getMinValue() {\n let minValue = Number.MAX_SAFE_INTEGER;\n this._queue.forEach((buffer) => {\n const v = buffer.getMinValue();\n if (typeof v === 'number') minValue = Math.min(v, minValue);\n });\n return minValue;\n }\n\n getMaxValue() {\n let maxValue = 0;\n this._queue.forEach((buffer) => {\n const v = buffer.getMaxValue();\n if (typeof v === 'number') maxValue = Math.max(v, maxValue);\n });\n return maxValue;\n }\n}\n\nexport default Recycler;\n\n// const origin = [163, 168, 142, 147, 152, 173, 178, 137, 157, 162]\n\n// const target = [163, 163, 142, 147, 152, 168, 173, 137, 157]\n\n// const next = [168, 168, 142, 147, 152, 173, 178, 137, 157, 162]\n\n// Next Sample\n// const origin = [35, 36, 37, 38, 39, 40, 41, 32, 33, 34]\n// const target = [35, 36, 37, 36, 37, 40, 41, 32, 33, 34]\n// const target = [35, 38, 39, 38, 39, 40, 41, 32, 33, 34]\n"],"names":["DEFAULT_RECYCLER_TYPE","RECYCLER_THRESHOLD_INDEX_VALUE","RECYCLER_RESERVED_BUFFER_PER_BATCH","RECYCLER_BUFFER_SIZE","RECYCLER_RESERVED_BUFFER_SIZE_RATIO","FixedBuffer","props","_props$thresholdIndex","thresholdIndexValue","_props$bufferSize","bufferSize","_props$recyclerType","recyclerType","metaExtractor","indexExtractor","_bufferSet","IntegerBufferSet","name","_recyclerType","_thresholdIndexValue","_proto","prototype","place","index","safeRange","getPosition","getMaxValue","getMinValue","getIndices","_createClass","key","get","Recycler","_ref","getType","_ref$recyclerTypes","recyclerTypes","_ref$recyclerBufferSi","recyclerBufferSize","_ref$thresholdIndexVa","_ref$recyclerReserved","recyclerReservedBufferPerBatch","_metaExtractor","_indexExtractor","_getType","_recyclerBufferSize","_recyclerReservedBufferSize","Math","floor","_recyclerReservedBufferPerBatch","forEach","type","_this","addBuffer","_queue","reduce","acc","cur","concat","findIndex","buffer","push","ensureBuffer","updateIndices","_startIndex","startIndex","step","maxCount","maxIndex","max","count","minValue","Number","MAX_SAFE_INTEGER","v","min","maxValue"],"mappings":"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"}
1
+ {"version":3,"file":"recycler.esm.js","sources":["../src/common.ts","../src/FixedBuffer.ts","../src/index.ts"],"sourcesContent":["export const DEFAULT_RECYCLER_TYPE = '__default_recycler_buffer__';\nexport const RECYCLER_THRESHOLD_INDEX_VALUE = 0;\nexport const RECYCLER_RESERVED_BUFFER_PER_BATCH = 4;\nexport const RECYCLER_BUFFER_SIZE = 10;\n// export const RECYCLER_RESERVED_BUFFER_SIZE_RATIO = 1.5;\n\nexport const defaultGetType = () => DEFAULT_RECYCLER_TYPE;\n","import IntegerBufferSet from '@x-oasis/integer-buffer-set';\nimport { SafeRange, FixedBufferProps } from './types';\nimport { DEFAULT_RECYCLER_TYPE, RECYCLER_BUFFER_SIZE } from './common';\n\nclass FixedBuffer {\n private _bufferSet: IntegerBufferSet;\n private _thresholdIndexValue = 0;\n\n private _recyclerType: string;\n\n constructor(props: FixedBufferProps) {\n const {\n thresholdIndexValue = 0,\n bufferSize = RECYCLER_BUFFER_SIZE,\n recyclerType = DEFAULT_RECYCLER_TYPE,\n metaExtractor,\n indexExtractor,\n } = props;\n this._bufferSet = new IntegerBufferSet({\n bufferSize,\n metaExtractor,\n indexExtractor,\n name: recyclerType,\n });\n this._recyclerType = recyclerType;\n this._thresholdIndexValue = thresholdIndexValue;\n }\n\n get thresholdIndexValue() {\n return this._thresholdIndexValue;\n }\n\n get recyclerType() {\n return this._recyclerType;\n }\n\n place(index: number, safeRange: SafeRange) {\n this._bufferSet.getPosition(index, safeRange);\n }\n\n getMaxValue() {\n return this._bufferSet.getMaxValue();\n }\n\n getMinValue() {\n return this._bufferSet.getMinValue();\n }\n\n getIndices() {\n return this._bufferSet.getIndices();\n }\n}\n\nexport default FixedBuffer;\n","import FixedBuffer from './FixedBuffer';\nimport { OnProcess, RecyclerProps } from './types';\nimport {\n DEFAULT_RECYCLER_TYPE,\n RECYCLER_BUFFER_SIZE,\n RECYCLER_RESERVED_BUFFER_PER_BATCH,\n // RECYCLER_RESERVED_BUFFER_SIZE_RATIO,\n RECYCLER_THRESHOLD_INDEX_VALUE,\n} from './common';\n\nclass Recycler {\n private _queue: Array<FixedBuffer> = [];\n\n /**\n * start index\n */\n private _thresholdIndexValue = 0;\n private _recyclerReservedBufferPerBatch: number;\n /**\n * buffer size, the oversize node will run into recycle strategy\n */\n private _recyclerBufferSize: number;\n private _metaExtractor: (index: number) => any;\n private _indexExtractor: (meta: any) => number;\n private _getType: (index: number) => string;\n\n constructor(props?: RecyclerProps) {\n const {\n getType,\n metaExtractor,\n indexExtractor,\n recyclerTypes = [],\n recyclerBufferSize = RECYCLER_BUFFER_SIZE,\n thresholdIndexValue = RECYCLER_THRESHOLD_INDEX_VALUE,\n recyclerReservedBufferPerBatch = RECYCLER_RESERVED_BUFFER_PER_BATCH,\n } = props || {};\n\n this._metaExtractor = metaExtractor;\n this._indexExtractor = indexExtractor;\n this._getType = getType;\n this._recyclerBufferSize = recyclerBufferSize;\n this._thresholdIndexValue = thresholdIndexValue;\n this._recyclerReservedBufferPerBatch = recyclerReservedBufferPerBatch;\n recyclerTypes.forEach((type) => this.addBuffer(type));\n }\n\n get queue() {\n return this._queue;\n }\n\n get thresholdIndexValue() {\n return this._thresholdIndexValue;\n }\n\n get recyclerReservedBufferPerBatch() {\n return this._recyclerReservedBufferPerBatch;\n }\n\n getIndices() {\n return this._queue.reduce((acc, cur) => acc.concat(cur.getIndices()), []);\n }\n\n addBuffer(type: string) {\n if (!type) return null;\n const index = this._queue.findIndex(\n (buffer) => buffer.recyclerType === type\n );\n if (index !== -1) return this._queue[index];\n const buffer = new FixedBuffer({\n recyclerType: type,\n metaExtractor: this._metaExtractor,\n indexExtractor: this._indexExtractor,\n bufferSize: this._recyclerBufferSize,\n thresholdIndexValue: this._thresholdIndexValue,\n });\n this._queue.push(buffer);\n return buffer;\n }\n\n ensureBuffer(type: string) {\n return this.addBuffer(type || DEFAULT_RECYCLER_TYPE);\n }\n\n updateIndices(props: {\n /**\n * index in range should not be recycled\n */\n safeRange: {\n startIndex: number;\n endIndex: number;\n };\n startIndex: number;\n maxCount: number;\n step?: number;\n onProcess?: OnProcess;\n }) {\n const { startIndex, safeRange, step = 1, maxCount, onProcess } = props;\n let count = 0;\n let _index = Math.max(startIndex, 0);\n while (count < maxCount) {\n if (_index >= this._thresholdIndexValue) {\n const recyclerType = this._getType(_index);\n const buffer = this.ensureBuffer(recyclerType);\n buffer.place(_index, safeRange);\n\n if (\n typeof onProcess !== 'function' ||\n onProcess(recyclerType, _index)\n ) {\n count += 1;\n }\n }\n _index += step;\n }\n }\n\n getMinValue() {\n let minValue = Number.MAX_SAFE_INTEGER;\n this._queue.forEach((buffer) => {\n const v = buffer.getMinValue();\n if (typeof v === 'number') minValue = Math.min(v, minValue);\n });\n return minValue;\n }\n\n getMaxValue() {\n let maxValue = 0;\n this._queue.forEach((buffer) => {\n const v = buffer.getMaxValue();\n if (typeof v === 'number') maxValue = Math.max(v, maxValue);\n });\n return maxValue;\n }\n}\n\nexport default Recycler;\n"],"names":["DEFAULT_RECYCLER_TYPE","RECYCLER_THRESHOLD_INDEX_VALUE","RECYCLER_RESERVED_BUFFER_PER_BATCH","RECYCLER_BUFFER_SIZE","FixedBuffer","props","_props$thresholdIndex","thresholdIndexValue","_props$bufferSize","bufferSize","_props$recyclerType","recyclerType","metaExtractor","indexExtractor","_bufferSet","IntegerBufferSet","name","_recyclerType","_thresholdIndexValue","_proto","prototype","place","index","safeRange","getPosition","getMaxValue","getMinValue","getIndices","_createClass","key","get","Recycler","_ref","getType","_ref$recyclerTypes","recyclerTypes","_ref$recyclerBufferSi","recyclerBufferSize","_ref$thresholdIndexVa","_ref$recyclerReserved","recyclerReservedBufferPerBatch","_metaExtractor","_indexExtractor","_getType","_recyclerBufferSize","_recyclerReservedBufferPerBatch","forEach","type","_this","addBuffer","_queue","reduce","acc","cur","concat","findIndex","buffer","push","ensureBuffer","updateIndices","startIndex","_props$step","step","maxCount","onProcess","count","_index","Math","max","minValue","Number","MAX_SAFE_INTEGER","v","min","maxValue"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -25,3 +25,4 @@ export declare type FixedBufferStateItem = {
25
25
  itemMeta: any;
26
26
  };
27
27
  export declare type FixedBufferState = Array<FixedBufferStateItem>;
28
+ export declare type OnProcess = (type?: string, index?: number) => boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x-oasis/recycler",
3
- "version": "0.1.20",
3
+ "version": "0.1.23",
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/integer-buffer-set": "0.1.20"
19
+ "@x-oasis/integer-buffer-set": "0.1.23"
20
20
  },
21
21
  "scripts": {
22
22
  "build": "tsdx build --tsconfig tsconfig.build.json",
package/src/common.ts CHANGED
@@ -2,6 +2,6 @@ export const DEFAULT_RECYCLER_TYPE = '__default_recycler_buffer__';
2
2
  export const RECYCLER_THRESHOLD_INDEX_VALUE = 0;
3
3
  export const RECYCLER_RESERVED_BUFFER_PER_BATCH = 4;
4
4
  export const RECYCLER_BUFFER_SIZE = 10;
5
- export const RECYCLER_RESERVED_BUFFER_SIZE_RATIO = 1.5;
5
+ // export const RECYCLER_RESERVED_BUFFER_SIZE_RATIO = 1.5;
6
6
 
7
7
  export const defaultGetType = () => DEFAULT_RECYCLER_TYPE;
package/src/index.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import FixedBuffer from './FixedBuffer';
2
- import { RecyclerProps } from './types';
2
+ import { OnProcess, RecyclerProps } from './types';
3
3
  import {
4
4
  DEFAULT_RECYCLER_TYPE,
5
5
  RECYCLER_BUFFER_SIZE,
6
6
  RECYCLER_RESERVED_BUFFER_PER_BATCH,
7
- RECYCLER_RESERVED_BUFFER_SIZE_RATIO,
7
+ // RECYCLER_RESERVED_BUFFER_SIZE_RATIO,
8
8
  RECYCLER_THRESHOLD_INDEX_VALUE,
9
9
  } from './common';
10
10
 
@@ -20,7 +20,6 @@ class Recycler {
20
20
  * buffer size, the oversize node will run into recycle strategy
21
21
  */
22
22
  private _recyclerBufferSize: number;
23
- private _recyclerReservedBufferSize: number;
24
23
  private _metaExtractor: (index: number) => any;
25
24
  private _indexExtractor: (meta: any) => number;
26
25
  private _getType: (index: number) => string;
@@ -41,9 +40,6 @@ class Recycler {
41
40
  this._getType = getType;
42
41
  this._recyclerBufferSize = recyclerBufferSize;
43
42
  this._thresholdIndexValue = thresholdIndexValue;
44
- this._recyclerReservedBufferSize = Math.floor(
45
- recyclerBufferSize * RECYCLER_RESERVED_BUFFER_SIZE_RATIO
46
- );
47
43
  this._recyclerReservedBufferPerBatch = recyclerReservedBufferPerBatch;
48
44
  recyclerTypes.forEach((type) => this.addBuffer(type));
49
45
  }
@@ -95,39 +91,26 @@ class Recycler {
95
91
  };
96
92
  startIndex: number;
97
93
  maxCount: number;
98
- step: number;
99
-
100
- // /** the max index value, always be the length of data */
101
- maxIndex: number;
94
+ step?: number;
95
+ onProcess?: OnProcess;
102
96
  }) {
103
- // this._queue.forEach((buffer) => buffer.start());
104
- const {
105
- startIndex: _startIndex,
106
- safeRange,
107
- step,
108
- maxCount,
109
- maxIndex,
110
- } = props;
111
- const startIndex = Math.max(_startIndex, 0);
97
+ const { startIndex, safeRange, step = 1, maxCount, onProcess } = props;
112
98
  let count = 0;
113
- if (maxCount < 0) return null;
114
- for (
115
- let index = startIndex;
116
- step > 0 ? index <= maxIndex : index >= 0;
117
- index += step
118
- ) {
119
- if (index < this._thresholdIndexValue) continue;
120
- const recyclerType = this._getType(index);
121
-
122
- // itemLayout should not be a condition, may cause too many unLayout item
123
- if (count < maxCount) {
99
+ let _index = Math.max(startIndex, 0);
100
+ while (count < maxCount) {
101
+ if (_index >= this._thresholdIndexValue) {
102
+ const recyclerType = this._getType(_index);
124
103
  const buffer = this.ensureBuffer(recyclerType);
125
- buffer.place(index, safeRange);
126
- } else {
127
- break;
104
+ buffer.place(_index, safeRange);
105
+
106
+ if (
107
+ typeof onProcess !== 'function' ||
108
+ onProcess(recyclerType, _index)
109
+ ) {
110
+ count += 1;
111
+ }
128
112
  }
129
-
130
- if (index >= this._thresholdIndexValue) count++;
113
+ _index += step;
131
114
  }
132
115
  }
133
116
 
@@ -151,14 +134,3 @@ class Recycler {
151
134
  }
152
135
 
153
136
  export default Recycler;
154
-
155
- // const origin = [163, 168, 142, 147, 152, 173, 178, 137, 157, 162]
156
-
157
- // const target = [163, 163, 142, 147, 152, 168, 173, 137, 157]
158
-
159
- // const next = [168, 168, 142, 147, 152, 173, 178, 137, 157, 162]
160
-
161
- // Next Sample
162
- // const origin = [35, 36, 37, 38, 39, 40, 41, 32, 33, 34]
163
- // const target = [35, 36, 37, 36, 37, 40, 41, 32, 33, 34]
164
- // const target = [35, 38, 39, 38, 39, 40, 41, 32, 33, 34]
package/src/types.ts CHANGED
@@ -38,3 +38,5 @@ export type FixedBufferStateItem = {
38
38
  };
39
39
 
40
40
  export type FixedBufferState = Array<FixedBufferStateItem>;
41
+
42
+ export type OnProcess = (type?: string, index?: number) => boolean;