aboutsummaryrefslogtreecommitdiff
path: root/src/observable.ts
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-10-01 11:27:59 +0200
committermetamuffin <metamuffin@disroot.org>2023-10-01 11:27:59 +0200
commit4c6a395de093dce24c688276a8b04a93093fd118 (patch)
treef5b345a4e0b8650577ce0734ee1b26d8c0433b1c /src/observable.ts
downloadjshelper-4c6a395de093dce24c688276a8b04a93093fd118.tar
jshelper-4c6a395de093dce24c688276a8b04a93093fd118.tar.bz2
jshelper-4c6a395de093dce24c688276a8b04a93093fd118.tar.zst
init
Diffstat (limited to 'src/observable.ts')
-rw-r--r--src/observable.ts34
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;
+ }
+}