From 4c0f972c4616eb549a098c3ef40d527eb542d7a6 Mon Sep 17 00:00:00 2001 From: Ben Culkin Date: Sat, 21 Nov 2020 16:51:04 -0500 Subject: Add basic pattern matching Adds a basic pattern matching implementation. Not perfect, but pretty good, considering what we have to work with --- .../java/bjc/utils/patterns/PatternMatcher.java | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 base/src/main/java/bjc/utils/patterns/PatternMatcher.java (limited to 'base/src/main/java/bjc/utils/patterns/PatternMatcher.java') diff --git a/base/src/main/java/bjc/utils/patterns/PatternMatcher.java b/base/src/main/java/bjc/utils/patterns/PatternMatcher.java new file mode 100644 index 0000000..e2ae9f6 --- /dev/null +++ b/base/src/main/java/bjc/utils/patterns/PatternMatcher.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 The type returned by the pattern. + */ +public class PatternMatcher + implements IPatternMatcher { + private final ComplexPattern[] patterns; + + /** + * Create a new pattern matcher. + * + * @param patterns The set of patterns to match against. + */ + @SuppressWarnings("unchecked") + @SafeVarargs + public PatternMatcher(ComplexPattern...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[]) patterns; + } + + @Override + public ReturnType matchFor(InputType input) throws NonExhaustiveMatch { + for (ComplexPattern pattern : patterns) { + IPair matches = pattern.matches(input); + if (matches.getLeft()) { + pattern.apply(input, matches.getRight()); + } + } + + throw new NonExhaustiveMatch("Non-exhaustive match against " + input); + } +} -- cgit v1.2.3