summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/patterns/SimplePatternMatcher.java
diff options
context:
space:
mode:
authorBen Culkin <scorpress@gmail.com>2020-12-03 19:28:15 -0500
committerBen Culkin <scorpress@gmail.com>2020-12-03 19:28:15 -0500
commitf3814a84f8471684cd483347db4fb7b107c2e635 (patch)
tree7ed1061ee69ef50cd1494cfacc866b271b8d1163 /base/src/main/java/bjc/utils/patterns/SimplePatternMatcher.java
parenta2c7425458f645802a352abc4783e0afc73dba13 (diff)
Rename interfaces to match Java style
Rename several interfaces that were in the style IWhatever, which Java doesn't use
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);
+ }
+}