diff --git a/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java new file mode 100644 index 00000000..f698799d --- /dev/null +++ b/core/src/main/java/it/cavallium/warppi/math/rules/dsl/VisitorPattern.java @@ -0,0 +1,184 @@ +package it.cavallium.warppi.math.rules.dsl; + +import it.cavallium.warppi.math.Function; +import it.cavallium.warppi.math.FunctionVisitor; +import it.cavallium.warppi.math.functions.*; +import it.cavallium.warppi.math.functions.Number; +import it.cavallium.warppi.math.functions.equations.Equation; +import it.cavallium.warppi.math.functions.equations.EquationsSystem; +import it.cavallium.warppi.math.functions.equations.EquationsSystemPart; +import it.cavallium.warppi.math.functions.trigonometry.*; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * A Pattern which implements match as a visitor. + */ +public abstract class VisitorPattern implements Pattern, FunctionVisitor>> { + @Override + public Optional> match(Function function) { + return function.accept(this); + } + + /** + * Gathers captured sub-functions from two matches, checking for equality + * of ones with the same name. + * + * @param match1 Sub-functions from one match. + * @param match2 Sub-functions from the other match. + * @return A Map containing all sub-functions, or an empty + * Optional if the same name is used to refer to + * non-equal sub-functions in the two matches. + */ + protected Optional> mergeMatches( + Map match1, + Map match2 + ) { + if (!checkSubFunctionEquality(match1, match2)) { + return Optional.empty(); + } + + Map merged = new HashMap<>(); + merged.putAll(match1); + merged.putAll(match2); + return Optional.of(merged); + } + + private boolean checkSubFunctionEquality(Map match1, Map match2) { + for (Map.Entry leftSubFunction : match1.entrySet()) { + final String key = leftSubFunction.getKey(); + if (match2.containsKey(key) + && !match2.get(key).equals(leftSubFunction.getValue())) { + return false; + } + } + return true; + } + + @Override + public Optional> visit(ArcCosine arcCosine) { + return Optional.empty(); + } + + @Override + public Optional> visit(ArcSine arcSine) { + return Optional.empty(); + } + + @Override + public Optional> visit(ArcTangent arcTangent) { + return Optional.empty(); + } + + @Override + public Optional> visit(Cosine cosine) { + return Optional.empty(); + } + + @Override + public Optional> visit(Division division) { + return Optional.empty(); + } + + @Override + public Optional> visit(EmptyNumber emptyNumber) { + return Optional.empty(); + } + + @Override + public Optional> visit(Equation equation) { + return Optional.empty(); + } + + @Override + public Optional> visit(EquationsSystem equationsSystem) { + return Optional.empty(); + } + + @Override + public Optional> visit(EquationsSystemPart equationsSystemPart) { + return Optional.empty(); + } + + @Override + public Optional> visit(Expression expression) { + return Optional.empty(); + } + + @Override + public Optional> visit(Joke joke) { + return Optional.empty(); + } + + @Override + public Optional> visit(Logarithm logarithm) { + return Optional.empty(); + } + + @Override + public Optional> visit(Multiplication multiplication) { + return Optional.empty(); + } + + @Override + public Optional> visit(Negative negative) { + return Optional.empty(); + } + + @Override + public Optional> visit(Number number) { + return Optional.empty(); + } + + @Override + public Optional> visit(Power power) { + return Optional.empty(); + } + + @Override + public Optional> visit(Root root) { + return Optional.empty(); + } + + @Override + public Optional> visit(RootSquare rootSquare) { + return Optional.empty(); + } + + @Override + public Optional> visit(Sine sine) { + return Optional.empty(); + } + + @Override + public Optional> visit(Subtraction subtraction) { + return Optional.empty(); + } + + @Override + public Optional> visit(SumSubtraction sumSubtraction) { + return Optional.empty(); + } + + @Override + public Optional> visit(Sum sum) { + return Optional.empty(); + } + + @Override + public Optional> visit(Tangent tangent) { + return Optional.empty(); + } + + @Override + public Optional> visit(Undefined undefined) { + return Optional.empty(); + } + + @Override + public Optional> visit(Variable variable) { + return Optional.empty(); + } +}