@prismadev/webmarine2d
Version:
Core utils for 2D verson of game engine Webmarine
52 lines • 1.81 kB
JavaScript
import { ExistsError } from "../errors/ExistsError";
import { NotFoundError } from "../errors/NotFoundError";
/** Observable class */
export class Observable {
/** Make observable */
constructor() {
this.listeners = {};
}
/** Register observer */
on(event, callback) {
if (!this.listeners[event])
this.listeners[event] = [];
if (this.listeners[event].find((i) => i.callback === callback))
throw new ExistsError();
this.listeners[event].push({ callback, once: false });
return this.listeners[event].length - 1;
}
/** Register observer for one-time call */
once(event, callback) {
if (!this.listeners[event])
this.listeners[event] = [];
if (this.listeners[event].find((i) => i.callback === callback))
throw new ExistsError();
this.listeners[event].push({ callback, once: true });
return this.listeners[event].length - 1;
}
/** Unregister observer */
off(event, id) {
if (!this.listeners[event][id])
throw new NotFoundError();
this.listeners[event] = this.listeners[event].filter((_, i) => i !== id);
}
/** Emit event */
emit(event) {
if (!this.listeners[event] || this.listeners[event].length < 1)
return;
for (let i = 0; i < this.listeners[event].length; i++) {
this.listeners[event][i].callback();
if (this.listeners[event][i].once) {
this.off(event, i);
}
}
}
/** Clear observers of event */
clear(event) {
if (event)
this.listeners[event] = [];
else
this.listeners = {};
}
}
//# sourceMappingURL=Observable.js.map