@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/esm/index-dev.js
CHANGED
|
@@ -12,7 +12,7 @@ function a$1(t){return "boolean"==typeof t}function c$1(t){return "function"==ty
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
// module vars
|
|
15
|
-
const { assertPositive: assertPositive$
|
|
15
|
+
const { assertPositive: assertPositive$2 } = C;
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* A set that has a fixed capacity and automatically removes the oldest element when the capacity is reached.
|
|
@@ -27,7 +27,7 @@ class CappedSet {
|
|
|
27
27
|
* @throws {Error} If capacity is less than or equal to 0
|
|
28
28
|
*/
|
|
29
29
|
constructor (capacity) {
|
|
30
|
-
assertPositive$
|
|
30
|
+
assertPositive$2(capacity, 'capacity');
|
|
31
31
|
this.capacity = capacity;
|
|
32
32
|
/**
|
|
33
33
|
* 1. key is the Value stored in CappedSet
|
|
@@ -171,7 +171,7 @@ class CappedSet {
|
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
-
var e={isFunction:t,isNil:
|
|
174
|
+
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}}
|
|
175
175
|
|
|
176
176
|
// 3rd
|
|
177
177
|
// internal
|
|
@@ -242,6 +242,11 @@ class TimeWheelCache extends k {
|
|
|
242
242
|
this._autoStart && this._startAutoEvict();
|
|
243
243
|
}
|
|
244
244
|
|
|
245
|
+
get first () {
|
|
246
|
+
// Based on the ES6 Standard, Map keeps order of elements added
|
|
247
|
+
return this._cache.keys().next().value
|
|
248
|
+
}
|
|
249
|
+
|
|
245
250
|
get tickInterval () {
|
|
246
251
|
return this._tickInterval
|
|
247
252
|
}
|
|
@@ -382,6 +387,19 @@ class TimeWheelCache extends k {
|
|
|
382
387
|
return true
|
|
383
388
|
}
|
|
384
389
|
|
|
390
|
+
/**
|
|
391
|
+
* Delete and Return the first key
|
|
392
|
+
* @returns {any|undefined}
|
|
393
|
+
*/
|
|
394
|
+
deleteFirst () {
|
|
395
|
+
const firstKey = this.first;
|
|
396
|
+
if (firstKey == null) {
|
|
397
|
+
return false
|
|
398
|
+
}
|
|
399
|
+
this.delete(firstKey);
|
|
400
|
+
return firstKey
|
|
401
|
+
}
|
|
402
|
+
|
|
385
403
|
/**
|
|
386
404
|
* Checks if the cache contains the specified key.
|
|
387
405
|
* @param {any} key - The key to check for existence in the cache.
|
|
@@ -525,6 +543,11 @@ class Hour24TimeWheelCache extends k {
|
|
|
525
543
|
this._init();
|
|
526
544
|
}
|
|
527
545
|
|
|
546
|
+
get first () {
|
|
547
|
+
// Based on the ES6 Standard, Map keeps order of elements added
|
|
548
|
+
return this._cache.keys().next().value
|
|
549
|
+
}
|
|
550
|
+
|
|
528
551
|
/**
|
|
529
552
|
* Max Time to Live, atom unit "millisecond"
|
|
530
553
|
* @returns {number}
|
|
@@ -590,6 +613,7 @@ class Hour24TimeWheelCache extends k {
|
|
|
590
613
|
});
|
|
591
614
|
|
|
592
615
|
this._secondWheel.on('expired', (/** @type {any} */key, /** @type {any} */value, /** @type {Timestamp} */expireTimestamp) => {
|
|
616
|
+
this._cache.delete(key);
|
|
593
617
|
this.emit(Event.Expired, key, value, expireTimestamp);
|
|
594
618
|
});
|
|
595
619
|
}
|
|
@@ -648,9 +672,23 @@ class Hour24TimeWheelCache extends k {
|
|
|
648
672
|
if (!wheel) {
|
|
649
673
|
return false
|
|
650
674
|
}
|
|
675
|
+
this._cache.delete(key);
|
|
651
676
|
return wheel.delete(key)
|
|
652
677
|
}
|
|
653
678
|
|
|
679
|
+
/**
|
|
680
|
+
* Delete and Return the first key
|
|
681
|
+
* @returns {any|undefined}
|
|
682
|
+
*/
|
|
683
|
+
deleteFirst () {
|
|
684
|
+
const firstKey = this.first;
|
|
685
|
+
if (firstKey == null) {
|
|
686
|
+
return false
|
|
687
|
+
}
|
|
688
|
+
this.delete(firstKey);
|
|
689
|
+
return firstKey
|
|
690
|
+
}
|
|
691
|
+
|
|
654
692
|
/**
|
|
655
693
|
* Checks if the cache contains the specified key.
|
|
656
694
|
* @param {any} key - The key to check for existence in the cache.
|
|
@@ -730,7 +768,7 @@ class Hour24TimeWheelCache extends k {
|
|
|
730
768
|
*/
|
|
731
769
|
|
|
732
770
|
// module vars
|
|
733
|
-
const { assertNotNegative } = C;
|
|
771
|
+
const { assertNotNegative, assertPositive: assertPositive$1 } = C;
|
|
734
772
|
|
|
735
773
|
/**
|
|
736
774
|
* A doubly linked list implementation.
|
|
@@ -968,6 +1006,92 @@ class LinkedList {
|
|
|
968
1006
|
return undefined
|
|
969
1007
|
}
|
|
970
1008
|
|
|
1009
|
+
/**
|
|
1010
|
+
* Remove speicied count elements from head
|
|
1011
|
+
* @param {number} count - The count of elements to remove
|
|
1012
|
+
* @returns {boolean} True if any element was removed, false otherwise
|
|
1013
|
+
*/
|
|
1014
|
+
removeFromHead (count) {
|
|
1015
|
+
assertPositive$1(count, 'count');
|
|
1016
|
+
|
|
1017
|
+
// do nothing, it list is empty
|
|
1018
|
+
if (this._size === 0) {
|
|
1019
|
+
return false
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
// beyond size, remove all elements
|
|
1023
|
+
if (count >= this._size) {
|
|
1024
|
+
this.clear();
|
|
1025
|
+
return true
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
// Find the node at the specified index
|
|
1029
|
+
let current = this._head;
|
|
1030
|
+
for (let i = 1; i < count; i++) {
|
|
1031
|
+
if (!current) {
|
|
1032
|
+
return false
|
|
1033
|
+
}
|
|
1034
|
+
current = current.next;
|
|
1035
|
+
}
|
|
1036
|
+
// Remove the nodes
|
|
1037
|
+
if (current) {
|
|
1038
|
+
if (current.next) {
|
|
1039
|
+
this._head = current.next;
|
|
1040
|
+
this._head.prev = undefined;
|
|
1041
|
+
} else {
|
|
1042
|
+
this._head = undefined;
|
|
1043
|
+
this._tail = undefined;
|
|
1044
|
+
}
|
|
1045
|
+
this._size = this._size - count;
|
|
1046
|
+
return true
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
return false
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
/**
|
|
1053
|
+
* Remove specified count elements from tail
|
|
1054
|
+
* @param {number} count - The count of elements to remove
|
|
1055
|
+
* @returns {boolean} True if any element was removed, false otherwise
|
|
1056
|
+
*/
|
|
1057
|
+
removeFromTail (count) {
|
|
1058
|
+
assertPositive$1(count, 'count');
|
|
1059
|
+
|
|
1060
|
+
// do nothing, if list is empty
|
|
1061
|
+
if (this._size === 0) {
|
|
1062
|
+
return false
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
// beyond size, remove all elements
|
|
1066
|
+
if (count >= this._size) {
|
|
1067
|
+
this.clear();
|
|
1068
|
+
return true
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
// Find the node at the specified position from tail
|
|
1072
|
+
let current = this._tail;
|
|
1073
|
+
for (let i = 1; i < count; i++) {
|
|
1074
|
+
if (!current) {
|
|
1075
|
+
return false
|
|
1076
|
+
}
|
|
1077
|
+
current = current.prev;
|
|
1078
|
+
}
|
|
1079
|
+
// Remove the nodes
|
|
1080
|
+
if (current) {
|
|
1081
|
+
if (current.prev) {
|
|
1082
|
+
this._tail = current.prev;
|
|
1083
|
+
this._tail.next = undefined;
|
|
1084
|
+
} else {
|
|
1085
|
+
this._head = undefined;
|
|
1086
|
+
this._tail = undefined;
|
|
1087
|
+
}
|
|
1088
|
+
this._size = this._size - count;
|
|
1089
|
+
return true
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
return false
|
|
1093
|
+
}
|
|
1094
|
+
|
|
971
1095
|
/**
|
|
972
1096
|
* Checks if the linked list contains the specified value.
|
|
973
1097
|
* @param {*} value - The value to check for
|