birch-event-emitter
Version:
Simple Event Emitter
75 lines (74 loc) • 2.06 kB
JavaScript
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();
}
}
}