export type Listener = {element: ListenerElement, event: ListenerEvent, callback: ListenerCallback, options?: ListenerOptions}; export type ListenerElement = any; export type ListenerEvent = string; export type ListenerOptions = any; export type ListenerCallback = (...args: any[]) => any; export default class ListenerSetter { private listeners: Set = new Set(); public add = (element: ListenerElement, event: ListenerEvent, callback: ListenerCallback, options?: ListenerOptions) => { const listener = {element, event, callback, options}; this.addManual(listener); return listener; }; public addManual = (listener: Listener) => { listener.element.addEventListener(listener.event, listener.callback, listener.options); this.listeners.add(listener); }; public remove = (listener: Listener) => { listener.element.removeEventListener(listener.event, listener.callback, listener.options); this.listeners.delete(listener); }; public removeManual = (element: ListenerElement, event: ListenerEvent, callback: ListenerCallback, options?: ListenerOptions) => { let listener: Listener; for(const _listener of this.listeners) { if(_listener.element === element && _listener.event === event && _listener.callback === callback && _listener.options === options) { listener = _listener; break; } } if(listener) { this.remove(listener); } }; public removeAll = () => { this.listeners.forEach(listener => { this.remove(listener); }); }; }