summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/patterns/FunctionalPattern.java
diff options
context:
space:
mode:
authorBen Culkin <scorpress@gmail.com>2020-11-21 16:51:04 -0500
committerBen Culkin <scorpress@gmail.com>2020-11-21 16:51:04 -0500
commit4c0f972c4616eb549a098c3ef40d527eb542d7a6 (patch)
treef791838e7477bb15fe2181bf673231e2e4ccda0a /base/src/main/java/bjc/utils/patterns/FunctionalPattern.java
parentaaf35ffcea677d315aa24180f2742a45e2146ece (diff)
Add basic pattern matching
Adds a basic pattern matching implementation. Not perfect, but pretty good, considering what we have to work with
Diffstat (limited to 'base/src/main/java/bjc/utils/patterns/FunctionalPattern.java')
-rw-r--r--base/src/main/java/bjc/utils/patterns/FunctionalPattern.java47
1 files changed, 47 insertions, 0 deletions
diff --git a/base/src/main/java/bjc/utils/patterns/FunctionalPattern.java b/base/src/main/java/bjc/utils/patterns/FunctionalPattern.java
new file mode 100644
index 0000000..e4b4a3d
--- /dev/null
+++ b/base/src/main/java/bjc/utils/patterns/FunctionalPattern.java
@@ -0,0 +1,47 @@
+package bjc.utils.patterns;
+
+import java.util.*;
+import java.util.function.*;
+
+import bjc.data.*;
+
+class FunctionalPattern<ReturnType, PredType, InputType>
+ implements ComplexPattern<ReturnType, PredType, InputType> {
+ private final Function<InputType, IPair<Boolean, PredType>> matcher;
+ private final BiFunction<InputType, PredType, ReturnType> accepter;
+
+ FunctionalPattern(
+ Function<InputType, IPair<Boolean, PredType>> matcher,
+ BiFunction<InputType, PredType, ReturnType> accepter) {
+ super();
+ this.matcher = matcher;
+ this.accepter = accepter;
+ }
+
+ @Override
+ public IPair<Boolean, PredType> matches(InputType input) {
+ return matcher.apply(input);
+ }
+
+ @Override
+ public ReturnType apply(InputType input, PredType state) {
+ return accepter.apply(input, state);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(accepter, matcher);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+
+ FunctionalPattern<?, ?, ?> other = (FunctionalPattern<?, ?, ?>) obj;
+
+ return Objects.equals(accepter, other.accepter)
+ && Objects.equals(matcher, other.matcher);
+ }
+} \ No newline at end of file