1 package org.simantics.scl.runtime.equations;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Collections;
\r
5 import java.util.Comparator;
\r
6 import java.util.List;
\r
8 import org.simantics.scl.runtime.SCLContext;
\r
9 import org.simantics.scl.runtime.function.Function;
\r
10 import org.simantics.scl.runtime.tuple.Tuple0;
\r
11 import org.simantics.scl.runtime.tuple.Tuple2;
\r
13 import gnu.trove.map.hash.THashMap;
\r
14 import gnu.trove.procedure.TObjectObjectProcedure;
\r
16 public class TestEquationContext implements EquationContext {
\r
18 public static final boolean TRACE = true;
\r
20 THashMap<String, Object> values = new THashMap<String, Object>();
\r
21 THashMap<String, ArrayList<Function>> listenerMap = new THashMap<String, ArrayList<Function>>();
\r
24 public void listenEquationVariable(String variableName, Function listener) {
\r
26 System.out.println("listenEquationVariable(" + variableName + ", " + listener + ")");
\r
27 if(values.containsKey(variableName)) {
\r
28 Object value = values.get(variableName);
\r
30 System.out.println(" apply " + value);
\r
31 listener.apply(value);
\r
35 System.out.println(" add listener");
\r
36 ArrayList<Function> listeners = listenerMap.get(variableName);
\r
37 if(listeners == null) {
\r
38 listeners = new ArrayList<Function>();
\r
39 listenerMap.put(variableName, listeners);
\r
41 listeners.add(listener);
\r
46 public void setEquationVariable(String variableName, Object value) {
\r
48 System.out.println("setEquationVariable(" + variableName + ", " + value + ")");
\r
49 if(values.containsKey(variableName))
\r
50 throw new IllegalStateException("Value for " + variableName + " already defined (oldValue=" + values.get(variableName) +
\r
51 ", newValue=" + value + ").");
\r
52 values.put(variableName, value);
\r
53 ArrayList<Function> listeners = listenerMap.remove(variableName);
\r
54 SCLContext context = SCLContext.getCurrent();
\r
55 if(listeners != null) {
\r
56 Object oldEquationContex = context.put("equation", this);
\r
58 for(Function listener : listeners) {
\r
60 System.out.println(" apply " + listener + " " + value);
\r
61 listener.apply(value);
\r
64 context.put("equation", oldEquationContex);
\r
69 public static List<Tuple2> solveEquations(Function f) {
\r
70 TestEquationContext equationContext = new TestEquationContext();
\r
71 SCLContext context = SCLContext.getCurrent();
\r
72 Object oldEquationContext = context.put("equation", equationContext);
\r
74 f.apply(Tuple0.INSTANCE);
\r
76 context.put("equation", oldEquationContext);
\r
78 ArrayList<Tuple2> result = new ArrayList<Tuple2>(equationContext.values.size());
\r
79 equationContext.values.forEachEntry(new TObjectObjectProcedure<String, Object>() {
\r
81 public boolean execute(String a, Object b) {
\r
82 result.add(new Tuple2(a, String.valueOf(b)));
\r
86 Collections.sort(result, (t1, t2) -> {
\r
87 return ((String)t1.c0).compareTo((String)t2.c0);
\r
92 public THashMap<String, Object> getValues() {
\r