@discoveryjs/discovery
Version:
Frontend framework for rapid data (JSON) analysis, shareable serverless reports and dashboards
50 lines (49 loc) • 1.17 kB
JavaScript
export class Emitter {
listeners;
constructor() {
this.listeners = /* @__PURE__ */ Object.create(null);
}
on(event, callback) {
this.listeners[event] = {
callback,
next: this.listeners[event] || null
};
return this;
}
once(event, callback) {
return this.on(event, function wrapper(...args) {
callback.apply(this, args);
this.off(event, wrapper);
});
}
off(event, callback) {
let cursor = this.listeners[event] || null;
let prev = null;
while (cursor !== null) {
if (cursor.callback === callback) {
cursor.callback = null;
if (prev) {
prev.next = cursor.next;
} else {
this.listeners[event] = cursor.next;
}
break;
}
prev = cursor;
cursor = cursor.next;
}
return this;
}
emit(event, ...args) {
let cursor = this.listeners[event] || null;
let hadListeners = false;
while (cursor !== null) {
if (typeof cursor.callback === "function") {
cursor.callback.apply(this, args);
}
hadListeners = true;
cursor = cursor.next;
}
return hadListeners;
}
}