diff options
author | metamuffin <metamuffin@disroot.org> | 2023-10-01 11:27:59 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-10-01 11:27:59 +0200 |
commit | 4c6a395de093dce24c688276a8b04a93093fd118 (patch) | |
tree | f5b345a4e0b8650577ce0734ee1b26d8c0433b1c /src/observable.ts | |
download | jshelper-4c6a395de093dce24c688276a8b04a93093fd118.tar jshelper-4c6a395de093dce24c688276a8b04a93093fd118.tar.bz2 jshelper-4c6a395de093dce24c688276a8b04a93093fd118.tar.zst |
init
Diffstat (limited to 'src/observable.ts')
-rw-r--r-- | src/observable.ts | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/observable.ts b/src/observable.ts new file mode 100644 index 0000000..3e1308c --- /dev/null +++ b/src/observable.ts @@ -0,0 +1,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; + } +} |