package combo;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Predicate;
public interface Subscription<T> {
Optional<T> nextFact();
void forEach(Consumer<T> factConsumer);
default Subscription<T> filter(final Predicate<T> predicate) {
final Subscription<T> thisSubscription = this;
return new Subscription<T>() {
@Override public Optional<T> nextFact() {
return thisSubscription.nextFact();
}
@Override public void forEach(final Consumer<T> factConsumer) {
thisSubscription.forEach(t -> {
if (predicate.test(t)) {
factConsumer.accept(t);
}
});
}
};
}
}