UNPKG

@prismadev/webmarine2d

Version:

Core utils for 2D verson of game engine Webmarine

52 lines 1.81 kB
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