@creejs/commons-collection
Version:
Commons Collection
3 lines (2 loc) • 19.1 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).CommonsLang={})}(this,function(e){"use strict";function t(e){return null==e}function r(e){return null===e}function n(e){return null!=e&&"number"==typeof e}function i(e){return null!==e&&"object"==typeof e&&(e.constructor===Object||void 0===e.constructor)}function s(e){return null!=e&&"string"==typeof e}function o(e){return null!=e&&"symbol"==typeof e}var a={assertNumber:function(e,t){if(!n(e))throw new Error(`${t?'"'+t+'" ':""}Not Number: type=${typeof e} value=${l(e)}`)},assertPositive:function(e,t){if(!function(e){return!!n(e)&&e>0}(e))throw new Error(`${t?'"'+t+'" ':""}Not Positive: ${e}`)},assertNegative:function(e,t){if(!function(e){return!!n(e)&&e<0}(e))throw new Error(`${t?'"'+t+'" ':""}Not Negative: ${e}`)},assertNotNegative:function(e,t){if(!function(e){return!!n(e)&&e>=0}(e))throw new Error(`${t?'"'+t+'" ':""}Not "0 or Positive": ${e}`)},assertBoolean:function(e,t){if(!function(e){return"boolean"==typeof e}(e))throw new Error(`${t?'"'+t+'" ':""}Not Boolean: type=${typeof e} value=${l(e)}`)},assertObject:function(e,t){if(!function(e){return null!=e&&"object"==typeof e}(e))throw new Error(`${t?'"'+t+'" ':""}Not Object: type=${typeof e} value=${l(e)}`)},assertPlainObject:function(e,t){if(!i(e))throw new Error(`${t?'"'+t+'" ':""}Not PlainObject: type=${typeof e} value=${l(e)}`)},assertSymbol:function(e,t){if(!o(e))throw new Error(`${t?'"'+t+'" ':""}Not Symbol: type=${typeof e} value=${l(e)}`)},assertFunction:function(e,t){if(!function(e){return"function"==typeof e}(e))throw new Error(`${t?'"'+t+'" ':""}Not Function: type=${typeof e} value=${l(e)}`)},assertInstance:function(e,t){if(!function(e){return null!=e&&"object"==typeof e&&!i(e)}(e))throw new Error(`${t?'"'+t+'" ':""}Not Class Instance: type=${typeof e} value=${l(e)}`)},assertPromise:function(e,t){if(!function(e){return null!=e&&"function"==typeof e.then}(e))throw new Error(`${t?'"'+t+'" ':""}Not Promise: type=${typeof e} value=${l(e)}`)},assertNil:function(e,r){if(!t(e))throw new Error(`${r?'"'+r+'" ':""}Neither Null nor Undefined: type=${typeof e} value=${l(e)}`)},assertNotNil:function(e,r){if(t(e))throw new Error((r?'"'+r+'" ':"")+"Should Not Nil")},assertNull:function(e,t){if(!r(e))throw new Error(`${t?'"'+t+'" ':""}Not Null: type=${typeof e} value=${l(e)}`)},assertNotNull:function(e,t){if(r(e))throw new Error((t?'"'+t+'" ':"")+"Should Not Null")},assertUndefined:function(e,t){if(!function(e){return void 0===e}(e))throw new Error(`${t?'"'+t+'" ':""}Not Undefined: type=${typeof e} value=${l(e)}`)},assertString:function(e,t){if(!s(e))throw new Error(`${t?'"'+t+'" ':""}Not String: type=${typeof e} value=${l(e)}`)},assertArray:function(e,t){if(!Array.isArray(e))throw new Error(`${t?'"'+t+'" ':""}Not Array: type=${typeof e} value=${l(e)}`)},assertStringOrSymbol:function(e,t){if(!s(e)&&!o(e))throw new Error(`${t?'"'+t+'" ':""}Not String or Symbol: type=${typeof e} value=${l(e)}`)},assertInt8Array:function(e,t){if(function(e){return e instanceof Int8Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Int8Array")},assertUint8Array:function(e,t){if(function(e){return e instanceof Uint8Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Uint8Array")},assertUint8ClampedArray:function(e,t){if(function(e){return e instanceof Uint8ClampedArray}(e))throw new Error((t?'"'+t+'" ':"")+"Not Uint8ClampedArray")},assertInt16Array:function(e,t){if(function(e){return e instanceof Int16Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Int16Array")},assertUint16Array:function(e,t){if(function(e){return e instanceof Uint16Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Uint16Array")},assertInt32Array:function(e,t){if(function(e){return e instanceof Int32Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Int32Array")},assertUint32Array:function(e,t){if(function(e){return e instanceof Uint32Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Uint32Array")},assertFloat32Array:function(e,t){if(function(e){return e instanceof Float32Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Float32Array")},assertFloat64Array:function(e,t){if(function(e){return e instanceof Float64Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Float64Array")},assertBigInt64Array:function(e,t){if(function(e){return e instanceof BigInt64Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not BigInt64Array")},assertBigUint64Array:function(e,t){if(function(e){return e instanceof BigUint64Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not BigUint64Array")},assertTypedArray:function(e,t){if(function(e){return ArrayBuffer.isView(e)&&e.constructor!==DataView}(e))throw new Error((t?'"'+t+'" ':"")+"Not TypedArray")},assertArrayBuffer:function(e,t){if(!function(e){return e instanceof ArrayBuffer}(e))throw new Error((t?'"'+t+'" ':"")+"Not ArrayBuffer")}};function l(e){if(null===e)return"null";if(void 0===e)return"undefined";let t;try{t=JSON.stringify(e)}catch(r){t=e.toString()}return t}new TextDecoder,new TextEncoder;const h=1e6;var c=function(){if("undefined"!=typeof performance&&"number"==typeof performance.timeOrigin){const e=performance.timeOrigin,t=performance.now();return Math.ceil((e+t)/h)}return Date.now()};const{assertPositive:u}=a;class f{constructor(e){u(e,"capacity"),this.capacity=e,this._map=new Map,this._head=void 0,this._tail=void 0}get size(){return this._map.size}get oldest(){return this._head?.value}get newest(){return this._tail?.value}[Symbol.iterator](){return this._map.keys()}add(e){if(this._map.has(e)){const t=this._map.get(e);t&&this._removeNode(t)}else this.size>=this.capacity&&this._removeOldest();this._addNew(e)}has(e){return this._map.has(e)}delete(e){if(this._map.has(e)){const t=this._map.get(e);return t&&this._removeNode(t),!0}return!1}clear(){this._map.clear(),this._head=void 0,this._tail=void 0}values(){return this._map.keys()}_addNew(e){const t={value:e,prev:this._tail,next:void 0};this._tail?this._tail.next=t:this._head=t,this._tail=t,this._map.set(e,t)}_removeNode(e){e.prev?e.prev.next=e.next:this._head=e.next,e.next?e.next.prev=e.prev:this._tail=e.prev,this._map.delete(e.value)}_removeOldest(){this._head&&this._removeNode(this._head)}}var _={isFunction:d,isNil:m};function d(e){return"function"==typeof e}function m(e){return null==e}function p(e){return null!=e&&"string"==typeof e}var w={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=${v(e)}`)},assertFunction:function(e,t){if(!d(e))throw new Error(`${t?'"'+t+'" ':""}Not Function: type=${typeof e} value=${v(e)}`)},assertNotNil:function(e,t){if(m(e))throw new Error((t?'"'+t+'" ':"")+"Should Not Nil")},assertString:function(e,t){if(!p(e))throw new Error(`${t?'"'+t+'" ':""}Not String: type=${typeof e} value=${v(e)}`)},assertStringOrSymbol:function(e,t){if(!p(e)&&!function(e){return null!=e&&"symbol"==typeof e}(e))throw new Error(`${t?'"'+t+'" ':""}Not String or Symbol: type=${typeof e} value=${v(e)}`)}};function v(e){if(null===e)return"null";if(void 0===e)return"undefined";let t;try{t=JSON.stringify(e)}catch(r){t=e.toString()}return t}new TextDecoder,new TextEncoder;const y="DOwner$#$",{assertFunction:g,assertNotNil:E}=w;class N{constructor(e,t,r=!1){E(e,"event"),g(t,"callback"),this._event=e,this._callback=t,this._isOnce=!!r,this._owner=void 0}set owner(e){this._owner=e}get owner(){return this._owner===y?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:x,isNil:L}=_,{assertStringOrSymbol:$,assertFunction:k}=w;class b{static get DefaultOwner(){return y}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!1;for(const t of[...this._listeners])t.invoke(...e);return!0}emitOwner(e,...t){if(0===this._listeners.length)return!1;const r=this._owner2Listeners.get(e);if(null==r)return!1;for(const e of[...r])e.invoke(...t);return!0}hasListener(e){return!!x(e)&&this._callbacks.has(e)}hasOwner(e){return!L(e)&&this._owner2Listeners.has(e)}addListener(e,t){return this._addListener(e,t,!1,!1)}prependListener(e,t){return this._addListener(e,t,!1,!0)}addOnceListener(e,t){return this._addListener(e,t,!0,!1)}prependOnceListener(e,t){return this._addListener(e,t,!0,!0)}_addListener(e,t,r,n){if(L(e))return!1;k(e),this._callbacks.has(e)||this._callbacks.add(e),t=t??y;const i=new N(this,e,r);i.owner=t,n?this._listeners.unshift(i):this._listeners.push(i),this._listener2Owner.set(i,t);let s=this._callback2Listeners.get(e);null==s&&(s=new Set,this._callback2Listeners.set(e,s)),s.add(i);let o=this._owner2Listeners.get(t);return null==o&&(o=new Set,this._owner2Listeners.set(t,o)),o.add(i),!0}removeListener(e){if(L(e))return!1;if(!this._callbacks.has(e))return!1;this._callbacks.delete(e);const t=this._callback2Listeners.get(e);if(null==t)return!1;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 r=this._owner2Listeners.get(t);null!=r&&(r.delete(e),0===r.size&&this._owner2Listeners.delete(t))}return!0}_remove(e){const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1);const{callback:r}=e,n=this._callback2Listeners.get(r);null!=n&&(n.delete(e),0===n.size&&(this._callback2Listeners.delete(r),this._callbacks.delete(r)));const i=this._listener2Owner.get(e);if(null==i)return;this._listener2Owner.delete(e);const s=this._owner2Listeners.get(i);null!=s&&(s.delete(e),0===s.size&&this._owner2Listeners.delete(i))}removeAllListeners(e){if(L(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,r=this._callback2Listeners.get(t);null!=r&&(r.delete(e),0===r.size&&(this._callback2Listeners.delete(t),this._callbacks.delete(t)))}return this}}const{isNil:A}=_,{assertString:O,assertFunction:S,assertNumber:W,assertStringOrSymbol:T,assertNotNil:I}=w,C=["on","once","addListener","prependListener","prependOnceListener","off","offAll","offOwner","removeAllListeners","removeListener","emit","emitOwner","setMaxListeners","getMaxListeners","hasOwner","listeners","listenerCount","eventNames","rawListeners"];let M=10;class U{static mixin(e){const t=new U;e.__emitter=t;for(const r of C){const n=t[r];e[r]=n.bind(t)}return e}static get defaultMaxListeners(){return M}static set defaultMaxListeners(e){W(e),M=e??10}constructor(){this._name2Event=new Map,this._maxListeners=M}addListener(e,t,r){return this.on(e,t,r)}prependListener(e,t,r){return O(e),S(t),this._checkMaxListeners(e),this._getOrCreateEvent(e).prependListener(t,r),this}prependOnceListener(e,t,r){return O(e),S(t),this._checkMaxListeners(e),this._getOrCreateEvent(e).prependOnceListener(t,r),this}emit(e,...t){const r=this._name2Event.get(e);return null!=r&&!r.isEmpty()&&(r.emit(...t),!0)}emitOwner(e,t,...r){if(null==t)throw new Error('Missing "owner"');const n=this._name2Event.get(e);return null!=n&&!n.isEmpty()&&(n.emitOwner(t,...r),!0)}eventNames(){return[...this._name2Event.keys()]}getMaxListeners(){return this._maxListeners}listenerCount(e,t){T(e,"eventName");const r=this._name2Event.get(e);return null==r||r.isEmpty()?0:r.listenerCount(t)}listeners(e){T(e,"eventName");const t=this._name2Event.get(e);return null==t||t.isEmpty()?[]:t.callbacks()}off(e,t){const r=this._name2Event.get(e);return null==r?this:(r.removeListener(t),r.isEmpty()?(this._name2Event.delete(e),this):this)}offAll(e,t){T(e,"eventName");const r=this._name2Event.get(e);return null==r?this:(r.removeAllListeners(t),r.isEmpty()?(this._name2Event.delete(e),this):this)}offOwner(e){I(e,"owner");const t=[...this._name2Event.values()];for(const r of t)r.removeAllListeners(e),r.isEmpty()&&this._name2Event.delete(r.name);return this}on(e,t,r){return O(e),S(t),this._checkMaxListeners(e),this._getOrCreateEvent(e).addListener(t,r),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,r){return O(e),S(t),this._getOrCreateEvent(e).addOnceListener(t,r),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(W(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 b(e);return this._name2Event.set(e,t),t}hasOwner(e){if(A(e))return!1;for(const t of this._name2Event.values())if(t.hasOwner(e))return!0;return!1}}const z={Advance:"advance",Expired:"expired"};class B extends U{get Event(){return z}constructor(e){super(),this.options=e??{},this._tickInterval=this.options.tickInterval??1e3,this._tickCount=this.options.tickCount??60,this._slots=Array(this._tickCount).fill(void 0).map(()=>new Map),this._cache=new Map,this._currentSlotIndex=0,this._timer=void 0,this._startAutoEvict()}get tickInterval(){return this._tickInterval}get tickCount(){return this._tickCount}get maxTtl(){return null==this._maxTtl&&(this._maxTtl=this._tickCount*this._tickInterval),this._maxTtl}assertStarted(){if(!this.autoEvictRunning)throw new Error(`${this.constructor.name} is not started`)}get autoEvictRunning(){return null!=this._timer}_startAutoEvict(){this._timer=setInterval(()=>this._advance(),this._tickInterval)}_stopAutoEvict(){this._timer&&clearInterval(this._timer),this._timer=void 0}_advance(){const e=(this._currentSlotIndex+1)%this._tickCount,t=this._slots[e],r=this._slots[this._currentSlotIndex];if(this.emit(z.Advance,this._currentSlotIndex,r,t),r.size>0){for(const e of r.keys()){const t=this._cache.get(e);this._cache.delete(e),this.emit(z.Expired,e,t.value,t.expireTimestamp)}r.clear()}this._currentSlotIndex=e}start(){this.autoEvictRunning||this._startAutoEvict()}stop(){this.autoEvictRunning&&this._stopAutoEvict()}destroy(){this._stopAutoEvict(),this.clear()}set(e,t,r){if(this.assertStarted(),a.assertNotNil(e,"key"),a.assertNotNil(t,"value"),r<=0)throw new Error(`Bad ttl "${r}", must > 0`);if(r>this.maxTtl)throw new Error(`Bad ttl "${r}", must <= maxTtl(${this.maxTtl})`);this._cache.has(e)&&this.delete(e);const n=c()+r,i=Math.floor((r-1)/this._tickInterval),s=(this._currentSlotIndex+i)%this._tickCount,o={value:t,slotIndex:s,expireTimestamp:n};return this._slots[s].set(e,o),this._cache.set(e,o),!0}delete(e){const t=this._cache.get(e);if(!t)return!1;this._cache.delete(e);const{slotIndex:r}=t;return this._slots[r].delete(e),!0}has(e){const t=this._cache.get(e);return!!t&&(!(t.expireTimestamp<=c())||(this.delete(e),this.emit("expired",e,t.value,t.expireTimestamp),!1))}clear(){this._cache.clear(),this._slots.forEach(e=>e.clear()),this._currentSlotIndex=0}get(e){const t=this._cache.get(e);if(t)return t.expireTimestamp<=c()?(this.delete(e),void this.emit("expired",e,t.value,t.expireTimestamp)):t.value}size(){const e=this._slots[this._currentSlotIndex];if(e.size>0){const t=c();for(const[r,{expireTimestamp:n}]of e.entries())if(n<=t){const t=this._cache.get(r);this.emit("expired",r,t.value,t.expireTimestamp),e.delete(r),this._cache.delete(r)}}return this._cache.size}}const F=6e4,D=36e5,j=864e5,P={HourToSecond:"hour->second",HourToMinute:"hour->minute",MinuteToSecond:"minute->second"},R={Downgrade:"downgrade",Expired:"expired"};class H extends U{static get DowngradType(){return P}static get Event(){return R}constructor(){super(),this._secondWheel=new B({tickInterval:1e3,tickCount:60}),this._minuteWheel=new B({tickInterval:F,tickCount:60}),this._hourWheel=new B({tickInterval:D,tickCount:24}),this._cache=new Map,this._init()}get maxTtl(){return 86399999}get autoEvictRunning(){return this._secondWheel.autoEvictRunning||this._minuteWheel.autoEvictRunning||this._hourWheel.autoEvictRunning}_init(){this._hourWheel.on("advance",(e,t,r)=>{for(const[e,{value:t,expireTimestamp:n}]of r){let r,i=n-c();i<=0?(i=1e3,r=P.HourToSecond,this._secondWheel.set(e,t,i),this.emit(R.Downgrade,e,t,r,i)):i<F?(r=P.HourToSecond,this._secondWheel.set(e,t,i),this.emit(R.Downgrade,e,t,r,i)):(r=P.HourToMinute,this._minuteWheel.set(e,t,i)),this._hourWheel.delete(e),this.emit(R.Downgrade,e,t,r,i)}}),this._minuteWheel.on("advance",(e,t,r)=>{for(const[e,{value:t,expireTimestamp:n}]of r){let r=n-c();r<=0&&(r=999),this._secondWheel.set(e,t,r),this.emit(R.Downgrade,e,t,P.MinuteToSecond,r),this._minuteWheel.delete(e)}}),this._secondWheel.on("expired",(e,t,r)=>{this.emit(R.Expired,e,t,r)})}start(){this._secondWheel.start(),this._minuteWheel.start(),this._hourWheel.start()}stop(){this._secondWheel.stop(),this._minuteWheel.stop(),this._hourWheel.stop()}destroy(){this._secondWheel.destroy(),this._minuteWheel.destroy(),this._hourWheel.destroy()}set(e,t,r){if(r<=0)throw new Error(`Bad ttl "${r}", must > 0`);let n;if(r<F)n=this._secondWheel;else if(r<D)n=this._minuteWheel;else{if(!(r<j))throw new Error('"ttl" Should <= Millisencod Of 24 Hours');n=this._hourWheel}return n.set(e,t,r),this._cache.set(e,n),!0}delete(e){const t=this._cache.get(e);return!!t&&t.delete(e)}has(e){const t=this._cache.get(e);return!!t&&(!!t.has(e)||t!==this._secondWheel&&(t===this._hourWheel?this._minuteWheel.has(e):t===this._minuteWheel&&this._secondWheel.has(e)))}clear(){this._secondWheel.clear(),this._minuteWheel.clear(),this._hourWheel.clear(),this._cache.clear()}get(e){const t=this._cache.get(e);if(!t)return;const r=t.get(e);return null!=r?r:t!==this._secondWheel?t===this._hourWheel?this._minuteWheel.get(e):t===this._minuteWheel?this._secondWheel.get(e):void 0:void 0}size(){return this._hourWheel.size()+this._minuteWheel.size()+this._secondWheel.size()}}var J={CappedSet:f,TimeWheelCache:B,Hour24TimeWheelCache:H};e.CappedSet=f,e.Hour24TimeWheelCache=H,e.TimeWheelCache=B,e.default=J,Object.defineProperty(e,"__esModule",{value:!0})});
//# sourceMappingURL=index.min.js.map