class EventListener {
listeners = [];
on(name, fn) {
let listener = {
name,
fn,
isOnce: false,
};
this.listeners.push(listener);
return listener;
}
once(name, fn) {
let listener = {
name,
fn,
isOnce: true,
};
this.listeners.push(listener);
return listener;
}
off(listener) {
let index = this.listeners.indexOf(listener);
if (index !== -1) {
this.listeners.splice(index, 1);
}
}
emit(name, args) {
this.listeners.forEach((listener) => {
try {
if (listener.name === name) {
if (listener.isOnce) {
this.off(listener);
}
listener.fn(args);
}
} catch (e) {
console.error(e);
}
});
}
}