@Override public <C> Stream<Match> accept(Object object, Captures captures, C context) { if (expectedClass.isInstance(object)) { return Stream.of(Match.of(captures)); } return Stream.of(); }
@Override public <C> Stream<Match> accept(Object object, Captures captures, C context) { //TODO remove cast BiPredicate<? super T, C> predicate = (BiPredicate<? super T, C>) this.predicate; return Stream.of(Match.of(captures)) .filter(match -> predicate.test((T) object, context)); }
@Override public <C> Stream<Match> accept(Object object, Captures captures, C context) { return Stream.of(Match.of(captures)) .filter(match -> expectedValue.equals(object)); }
@Override public <U> Match<U> map(Function<? super T, ? extends U> mapper) { return Match.of(mapper.apply(value), captures()); }
@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 <C> Stream<Match> accept(Object object, Captures captures, C context) { Captures newCaptures = captures.addAll(Captures.ofNullable(capture, (T) object)); return Stream.of(Match.of(newCaptures)); }
@Override public <T> Match<T> matchFilter(FilterPattern<T> filterPattern, Object object, Captures captures) { return Match.of((T) object, captures).filter(filterPattern.predicate()); } }
@Override public <T> Match<T> matchEquals(EqualsPattern<T> equalsPattern, Object object, Captures captures) { return Match.of((T) object, captures).filter(equalsPattern.expectedValue()::equals); }
@Override public <T> Match<T> matchCapture(CapturePattern<T> capturePattern, Object object, Captures captures) { return Match.of((T) object, captures.addAll(Captures.ofNullable(capturePattern.capture(), (T) object))); }