import Disposable from"../Disposable.js";import Event from"./Event.js";import{VOID}from"../functions.js";import{clear}from"../obj.js";class Target extends Disposable{constructor(e){super(),this.eventTarget_=e,this.pendingRemovals_=null,this.dispatching_=null,this.listeners_=null}addEventListener(e,t){if(e&&t){const s=this.listeners_||(this.listeners_={}),i=s[e]||(s[e]=[]);i.includes(t)||i.push(t)}}dispatchEvent(e){var t="string"==typeof e,i=t?e:e.type;const n=this.listeners_&&this.listeners_[i];if(n){const r=t?new Event(e):e,l=(r.target||(r.target=this.eventTarget_||this),this.dispatching_||(this.dispatching_={})),h=this.pendingRemovals_||(this.pendingRemovals_={});i in l||(l[i]=0,h[i]=0),++l[i];let s;for(let e=0,t=n.length;e<t;++e)if(!1===(s="handleEvent"in n[e]?n[e].handleEvent(r):n[e].call(this,r))||r.propagationStopped){s=!1;break}if(0==--l[i]){let e=h[i];for(delete h[i];e--;)this.removeEventListener(i,VOID);delete l[i]}return s}}disposeInternal(){this.listeners_&&clear(this.listeners_)}getListeners(e){return this.listeners_&&this.listeners_[e]||void 0}hasListener(e){return!!this.listeners_&&(e?e in this.listeners_:0<Object.keys(this.listeners_).length)}removeEventListener(e,t){const s=this.listeners_&&this.listeners_[e];s&&-1!==(t=s.indexOf(t))&&(this.pendingRemovals_&&e in this.pendingRemovals_?(s[t]=VOID,++this.pendingRemovals_[e]):(s.splice(t,1),0===s.length&&delete this.listeners_[e]))}}export default Target;