@actualwave/event-dispatcher
Version:
EventDispatcher is a JavaScript class that adds events support to custom objects.
3 lines (2 loc) • 2.95 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).EventDispatcher={})}(this,function(e){"use strict";const t=e=>"object"==typeof e&&null!==e;class s{constructor(e,t=null){this.defaultPrevented=!1,this.type=e,this.data=t}toJSON(){return{type:this.type,data:this.data}}isDefaultPrevented(){return this.defaultPrevented}preventDefault(){this.defaultPrevented=!0}}const i=(e,i)=>t(e)?e:new s(String(e),i);class n{constructor(e,t,s){this.index=-1,this.immediatelyStopped=!1,this.stopImmediatePropagation=()=>{this.immediatelyStopped=!0},this.listeners=e,this.onStopped=t,this.onComplete=s}run(e){const t=e;for(t.stopPropagation=this.onStopped,t.stopImmediatePropagation=this.stopImmediatePropagation,this.index=0;this.index<this.listeners.length&&!this.immediatelyStopped;this.index++)this.listeners[this.index](t);delete e.stopPropagation,delete e.stopImmediatePropagation,this.onComplete(this)}listenerRemoved(e,t){e===this.listeners&&t<=this.index&&this.index--}}class r{constructor(){this._listeners={},this._runners=[],this.removeRunner=e=>{this._runners.splice(this._runners.indexOf(e),1)}}createList(e,t){const s=this.getPrioritiesByKey(e),i=String(t);if(Object.hasOwn(s,i))return s[i];const n=[];return s[i]=n,n}getPrioritiesByKey(e){if(Object.hasOwn(this._listeners,e))return this._listeners[e];const t={};return this._listeners[e]=t,t}add(e,t,s){const i=this.createList(e,s);i.indexOf(t)<0&&i.push(t)}has(e){return!!Object.hasOwn(this._listeners,e)&&Object.keys(this._listeners[e]).length>0}remove(e,t){if(!Object.hasOwn(this._listeners,e))return;const s=this._listeners[e],i=Object.getOwnPropertyNames(s);for(const e of i){const i=s[e],n=i.indexOf(t);n>=0&&(i.splice(n,1),i.length||delete s[e],this._runners.forEach(e=>{e.listenerRemoved(i,n)}))}}removeAll(e){delete this._listeners[e]}createRunner(e,t){const s=new n(e,t,this.removeRunner);return this._runners.push(s),s}call(e){if(!Object.hasOwn(this._listeners,e.type))return;const t=this._listeners[e.type];let s=!1;const i=()=>{s=!0},n=Object.getOwnPropertyNames(t).sort((e,t)=>Number(e)-Number(t));for(const r of n){if(s)break;const n=t[r];if(n){const t=this.createRunner(n,i);if(t.run(e),t.immediatelyStopped)break}}}}class o{constructor(e=null){this._eventPreprocessor=e,this._listeners=new r}addEventListener(e,t,s=0){this._listeners.add(e,t,-s||0)}hasEventListener(e){return this._listeners.has(e)}removeEventListener(e,t){this._listeners.remove(e,t)}removeAllEventListeners(e){this._listeners.removeAll(e)}dispatchEvent(e,t){let s=i(e,t);this._eventPreprocessor&&(s=this._eventPreprocessor.call(this,s)),this._listeners.call(s)}}e.Event=s,e.EventDispatcher=o,e.createEventDispatcher=e=>new o(e??null),e.default=o,e.getEvent=i,e.isObject=t,Object.defineProperty(e,"__esModule",{value:!0})});
//# sourceMappingURL=event-dispatcher.min.js.map