feat: auto-save and multiple tracks
This commit is contained in:
43
src/Ref.ts
43
src/Ref.ts
@@ -22,6 +22,7 @@ type AllowedRef = { toString(): string } | string | null;
|
||||
|
||||
export default class Ref<T extends AllowedRef = Stringable> {
|
||||
private watchers: Array<(newVal: T) => void> | null = null;
|
||||
private afterWatchers: Array<(newVal: T) => void> | null = null;
|
||||
private value: T;
|
||||
private asString?: string;
|
||||
private isString: boolean;
|
||||
@@ -39,21 +40,38 @@ export default class Ref<T extends AllowedRef = Stringable> {
|
||||
}
|
||||
}
|
||||
|
||||
watch(watcher: (newVal: T) => void): ISubscription {
|
||||
if (this.watchers === null) {
|
||||
this.watchers = [];
|
||||
watch(watcher: (newVal: T) => void, after?: boolean): ISubscription {
|
||||
if (after) {
|
||||
if (this.afterWatchers === null) {
|
||||
this.afterWatchers = [];
|
||||
}
|
||||
this.afterWatchers.push(watcher);
|
||||
} else {
|
||||
if (this.watchers === null) {
|
||||
this.watchers = [];
|
||||
}
|
||||
this.watchers.push(watcher);
|
||||
}
|
||||
this.watchers.push(watcher);
|
||||
return new RefSubscription(() => this.unbind(watcher));
|
||||
return new RefSubscription(() => this.unbind(watcher, !!after));
|
||||
}
|
||||
|
||||
private unbind(watcher: (newVal: T) => void): void {
|
||||
if (!this.watchers) {
|
||||
return;
|
||||
}
|
||||
const index = this.watchers.indexOf(watcher);
|
||||
if (index !== -1) {
|
||||
this.watchers.splice(index, 1);
|
||||
private unbind(watcher: (newVal: T) => void, after: boolean): void {
|
||||
if (after) {
|
||||
if (!this.afterWatchers) {
|
||||
return;
|
||||
}
|
||||
const index = this.afterWatchers.indexOf(watcher);
|
||||
if (index !== -1) {
|
||||
this.afterWatchers.splice(index, 1);
|
||||
}
|
||||
} else {
|
||||
if (!this.watchers) {
|
||||
return;
|
||||
}
|
||||
const index = this.watchers.indexOf(watcher);
|
||||
if (index !== -1) {
|
||||
this.watchers.splice(index, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,6 +82,7 @@ export default class Ref<T extends AllowedRef = Stringable> {
|
||||
set val(val: T) {
|
||||
this.watchers?.forEach(watcher => watcher(val));
|
||||
this.value = val;
|
||||
this.afterWatchers?.forEach(watcher => watcher(val));
|
||||
}
|
||||
|
||||
toString(): string {
|
||||
|
||||
Reference in New Issue
Block a user