|
|
@@ -1,8 +1,10 @@
|
|
|
package org.leumasjaffe.charsheet.model.observable;
|
|
|
|
|
|
import java.util.Arrays;
|
|
|
+import java.util.function.Consumer;
|
|
|
|
|
|
import org.leumasjaffe.observer.Observable;
|
|
|
+import org.leumasjaffe.observer.ObservableListener;
|
|
|
import org.leumasjaffe.observer.ObserverDispatch;
|
|
|
|
|
|
import lombok.AccessLevel;
|
|
|
@@ -14,18 +16,42 @@ public class BoolGate extends Observable.Instance {
|
|
|
boolean[] data;
|
|
|
int size;
|
|
|
|
|
|
- @AllArgsConstructor
|
|
|
+ @AllArgsConstructor(access=AccessLevel.PRIVATE)
|
|
|
@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
|
|
|
public class Handle {
|
|
|
int index;
|
|
|
public boolean get() { return BoolGate.this.get(index); }
|
|
|
- public void set(Object source, boolean bool) {
|
|
|
+ public void set(boolean bool) {
|
|
|
// FIXME
|
|
|
if (bool != get()) {
|
|
|
BoolGate.this.set(index, bool);
|
|
|
ObserverDispatch.notifySubscribers(BoolGate.this);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ public Meta createSubGate(int dim) {
|
|
|
+ return new Meta(this, dim);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
|
|
|
+ public static class Meta extends BoolGate {
|
|
|
+ BoolGate.Handle callBack;
|
|
|
+
|
|
|
+ private Meta(BoolGate.Handle callBack, int dim) {
|
|
|
+ super(dim);
|
|
|
+ this.callBack = callBack;
|
|
|
+ }
|
|
|
+
|
|
|
+ public ObservableListener<Void, Meta> makeListener() {
|
|
|
+ ObservableListener<Void, Meta> obs = new ObservableListener<>(null, Meta::invokeCallback);
|
|
|
+ obs.setObserved(this);
|
|
|
+ return obs;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void invokeCallback(Object ignore, Meta self) {
|
|
|
+ self.callBack.set(self.all());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public BoolGate(int dim) {
|
|
|
@@ -56,4 +82,10 @@ public class BoolGate extends Observable.Instance {
|
|
|
public boolean some(int...idxs) {
|
|
|
return Arrays.stream(idxs).mapToObj(this::get).allMatch(Boolean::booleanValue);
|
|
|
}
|
|
|
+
|
|
|
+ public ObservableListener<Consumer<Boolean>, BoolGate> makeListener(Consumer<Boolean> accepter) {
|
|
|
+ ObservableListener<Consumer<Boolean>, BoolGate> obs = new ObservableListener<>(accepter, (c, v) -> c.accept(v.all()));
|
|
|
+ obs.setObserved(this);
|
|
|
+ return obs;
|
|
|
+ }
|
|
|
}
|