package com.codepoetics.octarine.functional.matching;
import com.codepoetics.octarine.functional.extractors.Extractor;
import org.pcollections.PVector;
import org.pcollections.TreePVector;
import java.util.Optional;
import java.util.function.UnaryOperator;
public final class MatchingExtractor<S, T> implements Extractor.FromPartial<S, T>, MatcherBuilder<S, T> {
static <S, T> MatchingExtractor<S, T> build(UnaryOperator<MatchingExtractor<S, T>> builder) {
return builder.apply(new MatchingExtractor<S, T>(TreePVector.empty()));
}
private final PVector<Extractor<? super S, ? extends T>> criteria;
private MatchingExtractor(PVector<Extractor<? super S, ? extends T>> criteria) {
this.criteria = criteria;
}
@Override
public MatchingExtractor<S, T> matching(Extractor<? super S, ? extends T> extractor) {
return new MatchingExtractor<>(criteria.plus(extractor));
}
@Override
public Optional<T> apply(S input) {
for (Extractor<? super S, ? extends T> extractor : criteria) {
if (extractor.test(input)) {
return Optional.of(extractor.extract(input));
}
}
return Optional.empty();
}
}