summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/patterns/SimplePatternMatcher.java
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2020-12-14 19:29:37 -0400
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2020-12-14 19:29:37 -0400
commit9351ea3e97bbe2d348aa17067ccc6267dc7c080f (patch)
treedd2269c26161c735d94d8dc83d56e6076c2a155d /base/src/main/java/bjc/utils/patterns/SimplePatternMatcher.java
parent8933de7f646f0565edf700aa2f2fcab06d639855 (diff)
parent6dcadc360dafdd12142d53327f44579379a4c9dd (diff)
Merge branch 'master' of https://github.com/bculkin2442/bjc-utils2
Diffstat (limited to 'base/src/main/java/bjc/utils/patterns/SimplePatternMatcher.java')
-rw-r--r--base/src/main/java/bjc/utils/patterns/SimplePatternMatcher.java41
1 files changed, 41 insertions, 0 deletions
diff --git a/base/src/main/java/bjc/utils/patterns/SimplePatternMatcher.java b/base/src/main/java/bjc/utils/patterns/SimplePatternMatcher.java
new file mode 100644
index 0000000..fea947a
--- /dev/null
+++ b/base/src/main/java/bjc/utils/patterns/SimplePatternMatcher.java
@@ -0,0 +1,41 @@
+package bjc.utils.patterns;
+
+import bjc.data.*;
+
+/**
+ * Implements pattern-matching (of a sort) against a collection of patterns.
+ *
+ * @author Ben Culkin
+ *
+ * @param <ReturnType> The type returned by the pattern.
+ */
+public class SimplePatternMatcher<ReturnType, InputType>
+ implements PatternMatcher<ReturnType, InputType> {
+ private final ComplexPattern<ReturnType, Object, InputType>[] patterns;
+
+ /**
+ * Create a new pattern matcher.
+ *
+ * @param patterns The set of patterns to match against.
+ */
+ @SuppressWarnings("unchecked")
+ @SafeVarargs
+ public SimplePatternMatcher(ComplexPattern<ReturnType, ?, InputType>...patterns) {
+ // Note: this may seem a somewhat questionable cast, but because we never
+ // actually do anything with the value who has a type matching the second
+ // parameter, this should be safe
+ this.patterns = (ComplexPattern<ReturnType, Object, InputType>[]) patterns;
+ }
+
+ @Override
+ public ReturnType matchFor(InputType input) throws NonExhaustiveMatch {
+ for (ComplexPattern<ReturnType, Object, InputType> pattern : patterns) {
+ Pair<Boolean, Object> matches = pattern.matches(input);
+ if (matches.getLeft()) {
+ pattern.apply(input, matches.getRight());
+ }
+ }
+
+ throw new NonExhaustiveMatch("Non-exhaustive match against " + input);
+ }
+}