another big refactor

This commit is contained in:
2022-12-19 21:06:23 +01:00
parent 3cb1811dcb
commit a6ed7818da
45 changed files with 85 additions and 95 deletions

View File

@@ -0,0 +1,27 @@
package lib.observable;
using tink.CoreApi;
class DummyObservable<T> implements Observable<T> {
private var value:T;
private function new(value:T) {
this.value = value;
}
public function set(value:T) {
throw new haxe.exceptions.NotImplementedException();
}
public function get():T {
return this.value;
}
public function subscribe(callback:Callback<T>):CallbackLink {
return null;
}
public static function dummy<T>(value: T): Observable<T> {
return new DummyObservable<T>(value);
}
}

View File

@@ -0,0 +1,9 @@
package lib.observable;
using tink.CoreApi;
interface Observable<T> {
public function set(value:T): Void;
public function get():T;
public function subscribe(callback:Callback<T>):CallbackLink;
}

View File

@@ -0,0 +1,56 @@
package lib.observable;
class ObservableArray<T> extends ObservableValue<Array<T>> {
public function new(value: Array<T>) {
super(value);
}
public function insert(pos: Int, x: T):Void {
this.value.insert(pos,x);
this.callbacks.invoke(this.value);
}
public function pop(): Null<T> {
var poped = this.pop();
this.callbacks.invoke(this.value);
return poped;
}
public function push(x: T):Int {
var i = this.value.push(x);
this.callbacks.invoke(this.value);
return i;
}
public function remove(x: T): Bool {
var b = this.value.remove(x);
this.callbacks.invoke(this.value);
return b;
}
public function resize(len: Int) {
this.value.resize(len);
this.callbacks.invoke(this.value);
}
public function reverse() {
this.value.reverse();
this.callbacks.invoke(this.value);
}
public function shift(): Null<T> {
var e = this.value.shift();
this.callbacks.invoke(this.value);
return e;
}
public function sort(f:(T, T) -> Int):Void {
this.value.sort(f);
this.callbacks.invoke(this.value);
}
public function unshift(x: T):Void {
this.value.unshift(x);
this.callbacks.invoke(this.value);
}
}

View File

@@ -0,0 +1,28 @@
package lib.observable;
using tink.CoreApi;
class ObservableValue<T> implements Observable<T> {
private var value:T;
private var callbacks:CallbackList<T> = new CallbackList();
public function new(value:T) {
this.value = value;
}
public function set(value:T) {
if (value != this.value) {
this.value = value;
callbacks.invoke(value);
}
}
public function get():T {
return value;
}
public function subscribe(callback:Callback<T>):CallbackLink {
callback.invoke(value);
return callbacks.add(callback);
}
}