type Listener = (...args: any[]) => unknown type Unsubscribe = () => void type Subscribe = (listener: TListener) => Unsubscribe export class Subscribable { protected listeners = new Set() public subscribe: Subscribe = (listener) => { this.listeners.add(listener) const unsubscribe = (): void => { this.listeners.delete(listener) } return unsubscribe } protected notify = (): void => this.listeners.forEach((listener) => listener()) }