33 lines
912 B
TypeScript
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 }; |