UNPKG

birch-event-emitter

Version:
75 lines (74 loc) 2.06 kB
export class Disposable { constructor(disposer) { this.disposer = disposer; } dispose(...args) { this.disposer.apply(this.disposer, args); } } export class DisposablesComposite { constructor() { this.disposables = new Set(); } add(disposable) { this.disposables.add(disposable); return disposable; } dispose(...args) { this.disposables.forEach(disposable => { disposable.dispose.apply(disposable, args); }); this.disposables = new Set(); } } export class EventEmitter { constructor() { this.listeners = new Map(); this.onceListeners = new Map(); } emit(event, ...args) { const callbacks = this.listeners.get(event); if (callbacks) { callbacks.forEach(cb => cb(...args)); } const onceCallbacks = this.onceListeners.get(event); if (onceCallbacks) { onceCallbacks.forEach(cb => cb(...args)); this.onceListeners.delete(event); } } on(event, cb) { if (!this.listeners.has(event)) { this.listeners.set(event, new Set()); } const existing = this.listeners.get(event); existing.add(cb); return new Disposable(() => { existing.delete(cb); }); } once(event, cb) { if (!this.onceListeners.has(event)) { this.onceListeners.set(event, new Set()); } const existing = this.onceListeners.get(event); existing.add(cb); return new Disposable(() => { existing.delete(cb); }); } emitWithReturn(event, ...args) { const callbacks = Array.from(this.listeners.get(event) || []); return callbacks.map(cb => cb(...args)); } clear(event) { if (event) { this.listeners.delete(event); this.onceListeners.delete(event); } else { this.listeners.clear(); this.onceListeners.clear(); } } }