.
This commit is contained in:
32
src/module/State.ts
Normal file
32
src/module/State.ts
Normal 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
|
||||
Reference in New Issue
Block a user