diff options
| author | Ben Culkin <scorpress@gmail.com> | 2020-12-03 19:28:15 -0500 |
|---|---|---|
| committer | Ben Culkin <scorpress@gmail.com> | 2020-12-03 19:28:15 -0500 |
| commit | f3814a84f8471684cd483347db4fb7b107c2e635 (patch) | |
| tree | 7ed1061ee69ef50cd1494cfacc866b271b8d1163 /base/src/main/java/bjc/utils/patterns/SimplePatternMatcher.java | |
| parent | a2c7425458f645802a352abc4783e0afc73dba13 (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.java | 41 |
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); + } +} |
