export class State { subscribers = new Map>(); value: T constructor(value: T) { this.value = value; } set(value: T) { this.value = value; for (const [_, subscriber] of this.subscribers) { subscriber(value) } } update(callback: (currentValue: T) => T) { this.set(callback(this.value)) } subscribe(subscriber: SubscribeCallback) { const subscriberSymbol = Symbol(subscriber.name) this.subscribers.set(subscriberSymbol, subscriber); subscriber(this.value); return subscriberSymbol; } unsubscribe(subscriberSymbol: Symbol) { this.subscribers.delete(subscriberSymbol); } } type SubscribeCallback = (value: T) => any export type ValuesOfStateArray[]> = { [K in keyof T]: T[K] extends State ? V : never };