All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.smallrye.mutiny.operators.multi.MultiSelectWhereOp Maven / Gradle / Ivy

There is a newer version: 2.8.0
Show newest version
package io.smallrye.mutiny.operators.multi;

import static io.smallrye.mutiny.helpers.Subscriptions.CANCELLED;

import java.util.concurrent.Flow.Subscription;
import java.util.function.Predicate;

import io.smallrye.mutiny.Multi;
import io.smallrye.mutiny.helpers.ParameterValidation;
import io.smallrye.mutiny.subscription.MultiSubscriber;

/**
 * Filters out items from the upstream that do NOT pass the given filter.
 *
 * @param  the type of item
 */
public class MultiSelectWhereOp extends AbstractMultiOperator {

    private final Predicate predicate;

    public MultiSelectWhereOp(Multi upstream, Predicate predicate) {
        super(upstream);
        this.predicate = ParameterValidation.nonNull(predicate, "predicate");
    }

    @Override
    public void subscribe(MultiSubscriber subscriber) {
        ParameterValidation.nonNullNpe(subscriber, "subscriber");
        upstream.subscribe().withSubscriber(new MultiSelectWhereProcessor<>(subscriber, predicate));
    }

    static final class MultiSelectWhereProcessor extends MultiOperatorProcessor {

        private final Predicate predicate;
        private boolean requestedMax = false;

        MultiSelectWhereProcessor(MultiSubscriber downstream, Predicate predicate) {
            super(downstream);
            this.predicate = predicate;
        }

        @Override
        public void onItem(T t) {
            if (isDone()) {
                return;
            }

            boolean passed;
            try {
                passed = predicate.test(t);
            } catch (Throwable exception) {
                failAndCancel(exception);
                return;
            }

            if (passed) {
                downstream.onItem(t);
            } else if (!requestedMax) {
                request(1);
            }
        }

        @Override
        public void request(long numberOfItems) {
            Subscription subscription = getUpstreamSubscription();
            if (subscription != CANCELLED) {
                if (numberOfItems <= 0) {
                    onFailure(new IllegalArgumentException("Invalid number of request, must be greater than 0"));
                    return;
                }
                if (numberOfItems == Long.MAX_VALUE) {
                    requestedMax = true;
                }
                subscription.request(numberOfItems);
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy