blob: 3e1308ce5aa246ab3112b13bcf9ae887ac925bd7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
/*
This file is part of jshelper (https://codeberg.org/metamuffin/jshelper)
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
export class OVar<T> {
private _value: T
private observers: ((v: T) => unknown)[] = []
constructor(initial: T) {
this._value = initial;
}
get value() { return this._value }
set value(v: T) {
this._value = v;
this.observers.forEach(o => o(v))
}
onchange(handler: (v: T) => unknown): () => unknown {
this.observers.push(handler)
return () => this.observers = this.observers.filter(o => o != handler)
}
onchangeinit(handler: (v: T) => unknown): () => unknown {
const abort = this.onchange(handler)
handler(this.value)
return abort
}
map<U>(fn: (v: T) => U): OVar<U> {
const uv = new OVar(fn(this.value))
this.onchange(v => uv.value = fn(v))
return uv;
}
}
|