export class AnEvent implements Observable { private readonly observers: Observer[]; constructor() { this.observers = []; } subscribe(observer: Observer) { const index = this.observers.indexOf(observer); if (!~index) { this.observers.push(observer); } } unsubscribe(observer: Observer) { const index = this.observers.indexOf(observer); if (~this.observers.indexOf(observer)) { this.observers.splice(index, 1); } } notify() { for (const observer of this.observers) { observer(); } } } interface Observable { subscribe(observer: () => void): void; unsubscribe(observer: () => void): void; notify(): void; } type Observer = () => void;