@creejs/commons-collection 2.0.5 → 2.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index-dev.cjs +128 -4
- package/dist/cjs/index-dev.cjs.map +1 -1
- package/dist/cjs/index-min.cjs +1 -1
- package/dist/cjs/index-min.cjs.map +1 -1
- package/dist/esm/index-dev.js +128 -4
- package/dist/esm/index-dev.js.map +1 -1
- package/dist/esm/index-min.js +1 -1
- package/dist/esm/index-min.js.map +1 -1
- package/dist/umd/index.dev.js +128 -4
- package/dist/umd/index.dev.js.map +1 -1
- package/dist/umd/index.min.js +1 -1
- package/dist/umd/index.min.js.map +1 -1
- package/package.json +1 -1
- package/types/hour24-time-wheel-cache.d.ts +6 -0
- package/types/linked-list.d.ts +12 -0
- package/types/time-wheel-cache.d.ts +6 -0
package/dist/umd/index.dev.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
// module vars
|
|
21
|
-
const { assertPositive: assertPositive$
|
|
21
|
+
const { assertPositive: assertPositive$2 } = C;
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* A set that has a fixed capacity and automatically removes the oldest element when the capacity is reached.
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
* @throws {Error} If capacity is less than or equal to 0
|
|
34
34
|
*/
|
|
35
35
|
constructor (capacity) {
|
|
36
|
-
assertPositive$
|
|
36
|
+
assertPositive$2(capacity, 'capacity');
|
|
37
37
|
this.capacity = capacity;
|
|
38
38
|
/**
|
|
39
39
|
* 1. key is the Value stored in CappedSet
|
|
@@ -177,7 +177,7 @@
|
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
179
|
|
|
180
|
-
var e={isFunction:t,isNil:
|
|
180
|
+
var e={isFunction:t,isNil:n};function t(e){return "function"==typeof e}function n(e){return null==e}function s(e){return null!=e&&"string"==typeof e}var r={assertNumber:function(e,t){if(!function(e){return null!=e&&"number"==typeof e}(e))throw new Error(`${t?'"'+t+'" ':""}Not Number: type=${typeof e} value=${i(e)}`)},assertFunction:function(e,n){if(!t(e))throw new Error(`${n?'"'+n+'" ':""}Not Function: type=${typeof e} value=${i(e)}`)},assertNotNil:function(e,t){if(n(e))throw new Error((t?'"'+t+'" ':"")+"Should Not Nil")},assertString:function(e,t){if(!s(e))throw new Error(`${t?'"'+t+'" ':""}Not String: type=${typeof e} value=${i(e)}`)},assertStringOrSymbol:function(e,t){if(!s(e)&&!function(e){return null!=e&&"symbol"==typeof e}(e))throw new Error(`${t?'"'+t+'" ':""}Not String or Symbol: type=${typeof e} value=${i(e)}`)}};function i(e){if(null===e)return "null";if(void 0===e)return "undefined";const t=typeof e;if("string"===t)return e;if("symbol"===t)return `Symbol(${e.description})`;if("function"===t)return `Function ${e.name}(){}`;if(e instanceof String)return e.toString();if(Number.isNaN(e))return "NaN";if(e===1/0)return "Infinity";if(e===-1/0)return "-Infinity";if(e instanceof Error)return `${e.constructor.name}: ${e.message}`;if(e instanceof Promise)return "Promise";if(e instanceof Set)return `Set: ${i(Array.from(e))}`;if(e instanceof Map)return `Map: ${i(Array.from(e.entries()))}`;if(e instanceof RegExp)return e.toString();if(Array.isArray(e))return `[${e.map(i).join(", ")}]`;let n;try{n=JSON.stringify(e);}catch(t){n=e.toString();}return n}new TextDecoder,new TextEncoder;const l="DOwner$#$",{assertFunction:a,assertNotNil:o}=r;class c{constructor(e,t,n=false){o(e,"event"),a(t,"callback"),this._event=e,this._callback=t,this._isOnce=!!n,this._owner=void 0;}set owner(e){this._owner=e;}get owner(){return this._owner===l?void 0:this._owner}get event(){return this._event}get isOnce(){return this._isOnce}isSameCallback(e){return this._callback===e}get callback(){return this._callback}invoke(...e){try{return this._callback(...e)}finally{if(this._isOnce)try{this._event._remove(this);}catch(e){console.warn(e);}}}listener(...e){return this.invoke(...e)}}const{isFunction:h,isNil:u}=e,{assertStringOrSymbol:_,assertFunction:f}=r;class m{static get DefaultOwner(){return l}constructor(e){_(e,"eventName"),this._name=e,this._callbacks=new Set,this._listeners=[],this._callback2Listeners=new Map,this._listener2Owner=new Map,this._owner2Listeners=new Map;}get name(){return this._name}isEmpty(){return 0===this._callbacks.size}rawListeners(){return [...this._listeners]}listenerCount(e){return null==e?this._listeners.length:this._callback2Listeners.get(e)?.size??0}callbacks(){return [...this.rawListeners().map(e=>e.callback)]}emit(...e){if(0===this._listeners.length)return false;for(const t of [...this._listeners])t.invoke(...e);return true}emitOwner(e,...t){if(0===this._listeners.length)return false;const n=this._owner2Listeners.get(e);if(null==n)return false;for(const e of [...n])e.invoke(...t);return true}hasListener(e){return !!h(e)&&this._callbacks.has(e)}hasOwner(e){return !u(e)&&this._owner2Listeners.has(e)}addListener(e,t){return this._addListener(e,t,false,false)}prependListener(e,t){return this._addListener(e,t,false,true)}addOnceListener(e,t){return this._addListener(e,t,true,false)}prependOnceListener(e,t){return this._addListener(e,t,true,true)}_addListener(e,t,n,s){if(u(e))return false;f(e),this._callbacks.has(e)||this._callbacks.add(e),t=t??l;const r=new c(this,e,n);r.owner=t,s?this._listeners.unshift(r):this._listeners.push(r),this._listener2Owner.set(r,t);let i=this._callback2Listeners.get(e);null==i&&(i=new Set,this._callback2Listeners.set(e,i)),i.add(r);let a=this._owner2Listeners.get(t);return null==a&&(a=new Set,this._owner2Listeners.set(t,a)),a.add(r),true}removeListener(e){if(u(e))return false;if(!this._callbacks.has(e))return false;this._callbacks.delete(e);const t=this._callback2Listeners.get(e);if(null==t)return false;this._callback2Listeners.delete(e);for(const e of t){ -1!==this._listeners.indexOf(e)&&this._listeners.splice(this._listeners.indexOf(e),1);const t=this._listener2Owner.get(e);if(null==t)continue;this._listener2Owner.delete(e);const n=this._owner2Listeners.get(t);null!=n&&(n.delete(e),0===n.size&&this._owner2Listeners.delete(t));}return true}_remove(e){const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1);const{callback:n}=e,s=this._callback2Listeners.get(n);null!=s&&(s.delete(e),0===s.size&&(this._callback2Listeners.delete(n),this._callbacks.delete(n)));const r=this._listener2Owner.get(e);if(null==r)return;this._listener2Owner.delete(e);const i=this._owner2Listeners.get(r);null!=i&&(i.delete(e),0===i.size&&this._owner2Listeners.delete(r));}removeAllListeners(e){if(u(e))return this._callbacks.clear(),this._listeners.length=0,this._callback2Listeners.clear(),this._listener2Owner.clear(),this._owner2Listeners.clear(),this;const t=this._owner2Listeners.get(e);if(null==t)return this;this._owner2Listeners.delete(e);for(const e of t){ -1!==this._listeners.indexOf(e)&&this._listeners.splice(this._listeners.indexOf(e),1),this._listener2Owner.delete(e);const{callback:t}=e,n=this._callback2Listeners.get(t);null!=n&&(n.delete(e),0===n.size&&(this._callback2Listeners.delete(t),this._callbacks.delete(t)));}return this}}const{isNil:d}=e,{assertString:w,assertFunction:L,assertNumber:v,assertStringOrSymbol:g,assertNotNil:p}=r,b=["on","once","addListener","prependListener","prependOnceListener","off","offAll","offOwner","removeAllListeners","removeListener","emit","emitOwner","setMaxListeners","getMaxListeners","hasOwner","listeners","listenerCount","eventNames","rawListeners"];let O=10;class k{static mixin(e){const t=new k;e.__emitter=t;for(const n of b){const s=t[n];e[n]=s.bind(t);}return e}static get defaultMaxListeners(){return O}static set defaultMaxListeners(e){v(e),O=e??10;}constructor(){this._name2Event=new Map,this._maxListeners=O;}addListener(e,t,n){return this.on(e,t,n)}prependListener(e,t,n){w(e),L(t),this._checkMaxListeners(e);return this._getOrCreateEvent(e).prependListener(t,n),this}prependOnceListener(e,t,n){w(e),L(t),this._checkMaxListeners(e);return this._getOrCreateEvent(e).prependOnceListener(t,n),this}emit(e,...t){const n=this._name2Event.get(e);return null!=n&&!n.isEmpty()&&(n.emit(...t),true)}emitOwner(e,t,...n){if(null==t)throw new Error('Missing "owner"');const s=this._name2Event.get(e);return null!=s&&!s.isEmpty()&&(s.emitOwner(t,...n),true)}eventNames(){return [...this._name2Event.keys()]}getMaxListeners(){return this._maxListeners}listenerCount(e,t){g(e,"eventName");const n=this._name2Event.get(e);return null==n||n.isEmpty()?0:n.listenerCount(t)}listeners(e){g(e,"eventName");const t=this._name2Event.get(e);return null==t||t.isEmpty()?[]:t.callbacks()}off(e,t){const n=this._name2Event.get(e);return null==n?this:(n.removeListener(t),n.isEmpty()?(this._name2Event.delete(e),this):this)}offAll(e,t){g(e,"eventName");const n=this._name2Event.get(e);return null==n?this:(n.removeAllListeners(t),n.isEmpty()?(this._name2Event.delete(e),this):this)}offOwner(e){p(e,"owner");const t=[...this._name2Event.values()];for(const n of t)n.removeAllListeners(e),n.isEmpty()&&this._name2Event.delete(n.name);return this}on(e,t,n){w(e),L(t),this._checkMaxListeners(e);return this._getOrCreateEvent(e).addListener(t,n),this}_checkMaxListeners(e){let t=0;0!==this._maxListeners&&this._maxListeners!==1/0&&(t=this.listenerCount(e))>=this._maxListeners&&console.warn(`maxlistenersexceededwarning: Possible EventEmitter memory leak detected. ${t} ${e} listeners added to [${this}]. Use emitter.setMaxListeners() to increase limit`);}once(e,t,n){w(e),L(t);return this._getOrCreateEvent(e).addOnceListener(t,n),this}rawListeners(e){return this._name2Event.get(e)?.rawListeners()||[]}removeAllListeners(e,t){return this.offAll(e,t)}removeListener(e,t){return this.off(e,t)}setMaxListeners(e){if(v(e),e<0)throw new RangeError("maxListeners must >=0");return this._maxListeners=e,this}_getOrCreateEvent(e){if(this._name2Event.has(e))return this._name2Event.get(e);const t=new m(e);return this._name2Event.set(e,t),t}hasOwner(e){if(d(e))return false;for(const t of this._name2Event.values())if(t.hasOwner(e))return true;return false}}
|
|
181
181
|
|
|
182
182
|
// 3rd
|
|
183
183
|
// internal
|
|
@@ -248,6 +248,11 @@
|
|
|
248
248
|
this._autoStart && this._startAutoEvict();
|
|
249
249
|
}
|
|
250
250
|
|
|
251
|
+
get first () {
|
|
252
|
+
// Based on the ES6 Standard, Map keeps order of elements added
|
|
253
|
+
return this._cache.keys().next().value
|
|
254
|
+
}
|
|
255
|
+
|
|
251
256
|
get tickInterval () {
|
|
252
257
|
return this._tickInterval
|
|
253
258
|
}
|
|
@@ -388,6 +393,19 @@
|
|
|
388
393
|
return true
|
|
389
394
|
}
|
|
390
395
|
|
|
396
|
+
/**
|
|
397
|
+
* Delete and Return the first key
|
|
398
|
+
* @returns {any|undefined}
|
|
399
|
+
*/
|
|
400
|
+
deleteFirst () {
|
|
401
|
+
const firstKey = this.first;
|
|
402
|
+
if (firstKey == null) {
|
|
403
|
+
return false
|
|
404
|
+
}
|
|
405
|
+
this.delete(firstKey);
|
|
406
|
+
return firstKey
|
|
407
|
+
}
|
|
408
|
+
|
|
391
409
|
/**
|
|
392
410
|
* Checks if the cache contains the specified key.
|
|
393
411
|
* @param {any} key - The key to check for existence in the cache.
|
|
@@ -531,6 +549,11 @@
|
|
|
531
549
|
this._init();
|
|
532
550
|
}
|
|
533
551
|
|
|
552
|
+
get first () {
|
|
553
|
+
// Based on the ES6 Standard, Map keeps order of elements added
|
|
554
|
+
return this._cache.keys().next().value
|
|
555
|
+
}
|
|
556
|
+
|
|
534
557
|
/**
|
|
535
558
|
* Max Time to Live, atom unit "millisecond"
|
|
536
559
|
* @returns {number}
|
|
@@ -596,6 +619,7 @@
|
|
|
596
619
|
});
|
|
597
620
|
|
|
598
621
|
this._secondWheel.on('expired', (/** @type {any} */key, /** @type {any} */value, /** @type {Timestamp} */expireTimestamp) => {
|
|
622
|
+
this._cache.delete(key);
|
|
599
623
|
this.emit(Event.Expired, key, value, expireTimestamp);
|
|
600
624
|
});
|
|
601
625
|
}
|
|
@@ -654,9 +678,23 @@
|
|
|
654
678
|
if (!wheel) {
|
|
655
679
|
return false
|
|
656
680
|
}
|
|
681
|
+
this._cache.delete(key);
|
|
657
682
|
return wheel.delete(key)
|
|
658
683
|
}
|
|
659
684
|
|
|
685
|
+
/**
|
|
686
|
+
* Delete and Return the first key
|
|
687
|
+
* @returns {any|undefined}
|
|
688
|
+
*/
|
|
689
|
+
deleteFirst () {
|
|
690
|
+
const firstKey = this.first;
|
|
691
|
+
if (firstKey == null) {
|
|
692
|
+
return false
|
|
693
|
+
}
|
|
694
|
+
this.delete(firstKey);
|
|
695
|
+
return firstKey
|
|
696
|
+
}
|
|
697
|
+
|
|
660
698
|
/**
|
|
661
699
|
* Checks if the cache contains the specified key.
|
|
662
700
|
* @param {any} key - The key to check for existence in the cache.
|
|
@@ -736,7 +774,7 @@
|
|
|
736
774
|
*/
|
|
737
775
|
|
|
738
776
|
// module vars
|
|
739
|
-
const { assertNotNegative } = C;
|
|
777
|
+
const { assertNotNegative, assertPositive: assertPositive$1 } = C;
|
|
740
778
|
|
|
741
779
|
/**
|
|
742
780
|
* A doubly linked list implementation.
|
|
@@ -974,6 +1012,92 @@
|
|
|
974
1012
|
return undefined
|
|
975
1013
|
}
|
|
976
1014
|
|
|
1015
|
+
/**
|
|
1016
|
+
* Remove speicied count elements from head
|
|
1017
|
+
* @param {number} count - The count of elements to remove
|
|
1018
|
+
* @returns {boolean} True if any element was removed, false otherwise
|
|
1019
|
+
*/
|
|
1020
|
+
removeFromHead (count) {
|
|
1021
|
+
assertPositive$1(count, 'count');
|
|
1022
|
+
|
|
1023
|
+
// do nothing, it list is empty
|
|
1024
|
+
if (this._size === 0) {
|
|
1025
|
+
return false
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
// beyond size, remove all elements
|
|
1029
|
+
if (count >= this._size) {
|
|
1030
|
+
this.clear();
|
|
1031
|
+
return true
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
// Find the node at the specified index
|
|
1035
|
+
let current = this._head;
|
|
1036
|
+
for (let i = 1; i < count; i++) {
|
|
1037
|
+
if (!current) {
|
|
1038
|
+
return false
|
|
1039
|
+
}
|
|
1040
|
+
current = current.next;
|
|
1041
|
+
}
|
|
1042
|
+
// Remove the nodes
|
|
1043
|
+
if (current) {
|
|
1044
|
+
if (current.next) {
|
|
1045
|
+
this._head = current.next;
|
|
1046
|
+
this._head.prev = undefined;
|
|
1047
|
+
} else {
|
|
1048
|
+
this._head = undefined;
|
|
1049
|
+
this._tail = undefined;
|
|
1050
|
+
}
|
|
1051
|
+
this._size = this._size - count;
|
|
1052
|
+
return true
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
return false
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
/**
|
|
1059
|
+
* Remove specified count elements from tail
|
|
1060
|
+
* @param {number} count - The count of elements to remove
|
|
1061
|
+
* @returns {boolean} True if any element was removed, false otherwise
|
|
1062
|
+
*/
|
|
1063
|
+
removeFromTail (count) {
|
|
1064
|
+
assertPositive$1(count, 'count');
|
|
1065
|
+
|
|
1066
|
+
// do nothing, if list is empty
|
|
1067
|
+
if (this._size === 0) {
|
|
1068
|
+
return false
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
// beyond size, remove all elements
|
|
1072
|
+
if (count >= this._size) {
|
|
1073
|
+
this.clear();
|
|
1074
|
+
return true
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
// Find the node at the specified position from tail
|
|
1078
|
+
let current = this._tail;
|
|
1079
|
+
for (let i = 1; i < count; i++) {
|
|
1080
|
+
if (!current) {
|
|
1081
|
+
return false
|
|
1082
|
+
}
|
|
1083
|
+
current = current.prev;
|
|
1084
|
+
}
|
|
1085
|
+
// Remove the nodes
|
|
1086
|
+
if (current) {
|
|
1087
|
+
if (current.prev) {
|
|
1088
|
+
this._tail = current.prev;
|
|
1089
|
+
this._tail.next = undefined;
|
|
1090
|
+
} else {
|
|
1091
|
+
this._head = undefined;
|
|
1092
|
+
this._tail = undefined;
|
|
1093
|
+
}
|
|
1094
|
+
this._size = this._size - count;
|
|
1095
|
+
return true
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
return false
|
|
1099
|
+
}
|
|
1100
|
+
|
|
977
1101
|
/**
|
|
978
1102
|
* Checks if the linked list contains the specified value.
|
|
979
1103
|
* @param {*} value - The value to check for
|