@Override public <T> Match<T> matchTypeOf(TypeOfPattern<T> typeOfPattern, Object object, Captures captures) { Class<T> expectedClass = typeOfPattern.expectedClass(); if (expectedClass.isInstance(object)) { return Match.of(expectedClass.cast(object), captures); } else { return Match.empty(); } }
@Override public <T> Match<T> matchWith(WithPattern<T> withPattern, Object object, Captures captures) { Function<? super T, Optional<?>> property = withPattern.getProperty().getFunction(); Optional<?> propertyValue = property.apply((T) object); Match<?> propertyMatch = propertyValue .map(value -> match(withPattern.getPattern(), value, captures)) .orElse(Match.empty()); return propertyMatch.map(ignored -> (T) object); }
@Override public <T> Match<T> matchWith(WithPattern<T> withPattern, Object object, Captures captures) { Function<? super T, Optional<?>> property = withPattern.getProperty().getFunction(); Optional<?> propertyValue = property.apply((T) object); Optional<?> resolvedValue = propertyValue .map(value -> value instanceof GroupReference ? lookup.resolve(((GroupReference) value)) : value); Match<?> propertyMatch = resolvedValue .map(value -> match(withPattern.getPattern(), value, captures)) .orElse(Match.empty()); return propertyMatch.map(ignored -> (T) object); } }
private <T> void assertNoMatch(Pattern<T> pattern, Object expectedNoMatch) { Match<T> match = DefaultMatcher.DEFAULT_MATCHER.match(pattern, expectedNoMatch); assertEquals(Match.empty(), match); } }
@Override public <T> Match<T> matchTypeOf(TypeOfPattern<T> typeOfPattern, Object object, Captures captures) { Class<T> expectedClass = typeOfPattern.expectedClass(); if (expectedClass.isInstance(object)) { return Match.of(expectedClass.cast(object), captures); } else { return Match.empty(); } }
@Override public <T> Match<T> matchWith(WithPattern<T> withPattern, Object object, Captures captures) { Function<? super T, Optional<?>> property = withPattern.getProperty().getFunction(); Optional<?> propertyValue = property.apply((T) object); Match<?> propertyMatch = propertyValue .map(value -> match(withPattern.getPattern(), value, captures)) .orElse(Match.empty()); return propertyMatch.map(ignored -> (T) object); }
private <T> void assertNoMatch(Pattern<T> pattern, Object expectedNoMatch) { Match<T> match = DefaultMatcher.DEFAULT_MATCHER.match(pattern, expectedNoMatch); assertEquals(Match.empty(), match); } }