package io.smallrye.reactive.streams.stages;

import java.util.Objects;
import java.util.function.Predicate;

import org.eclipse.microprofile.reactive.streams.operators.spi.Stage;

import io.reactivex.Flowable;
import io.smallrye.reactive.streams.Engine;
import io.smallrye.reactive.streams.operators.ProcessingStage;
import io.smallrye.reactive.streams.operators.ProcessingStageFactory;

/**
 * Implementation of {@link Stage.Filter} stage.
 *
 * @author <a href="http://escoffier.me">Clement Escoffier</a>
 */
public class FilterStageFactory implements ProcessingStageFactory<Stage.Filter> {

    @SuppressWarnings("unchecked")
    @Override
    public <I, O> ProcessingStage<I, O> create(Engine engine, Stage.Filter stage) {
        Objects.requireNonNull(stage);
        Predicate predicate = Objects.requireNonNull(stage.getPredicate());
        return source -> (Flowable<O>) source.filter(predicate::test);
    }
}