summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/patterns/FunctionalPattern.java
diff options
context:
space:
mode:
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..1e9dbab
--- /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, Pair<Boolean, PredType>> matcher;
+ private final BiFunction<InputType, PredType, ReturnType> accepter;
+
+ FunctionalPattern(
+ Function<InputType, Pair<Boolean, PredType>> matcher,
+ BiFunction<InputType, PredType, ReturnType> accepter) {
+ super();
+ this.matcher = matcher;
+ this.accepter = accepter;
+ }
+
+ @Override
+ public Pair<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