This commit is contained in:
2026-03-13 20:03:02 +09:00
commit 98c9ffbc89
13 changed files with 513 additions and 0 deletions

32
src/module/State.ts Normal file
View File

@@ -0,0 +1,32 @@
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