export class Observable { private _eventListeners: any[] = []; private _object: any = null; constructor(object) { this._object = object; } on(eventName, callback) { if (this.indexOf(eventName, callback) !== -1) { console.warn(`The following callback is already added to the event: ${eventName}`, callback); return; } this._eventListeners.push({ eventName, callback, }); } off(eventName, callback) { const idx = this.indexOf(eventName, callback); if (idx !== -1) { this._eventListeners.splice(idx, 1); } } indexOf(eventName, callback) { for (let o = 0; o < this._eventListeners.length; o++) { const el = this._eventListeners[o]; if (el.eventName === eventName && el.callback === callback) { return o; } } return -1; } triggerEvent(eventName, eventData) { setTimeout(() => { for (const el of this._eventListeners) { if (el.eventName === eventName) { el.callback(this._object, eventData); } } }); } }