Files
framework/src/module/State.ts
2026-03-15 10:14:58 +09:00

33 lines
912 B
TypeScript

export class State<T> {
subscribers = new Map<Symbol, SubscribeCallback<T>>();
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<T>) {
const subscriberSymbol = Symbol(subscriber.name)
this.subscribers.set(subscriberSymbol, subscriber);
subscriber(this.value);
return subscriberSymbol;
}
unsubscribe(subscriberSymbol: Symbol) {
this.subscribers.delete(subscriberSymbol);
}
}
type SubscribeCallback<T> = (value: T) => any
export type ValuesOfStateArray<T extends State<any>[]> = { [K in keyof T]: T[K] extends State<infer V> ? V : never };