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

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

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

import java.util.concurrent.Flow.Subscription;
import java.util.concurrent.atomic.AtomicLong;

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

/**
 * Skips the first N items from upstream.
 * Failures and completions are propagated.
 */
public final class MultiSkipFirstOp extends AbstractMultiOperator {

    private final long numberOfItems;

    public MultiSkipFirstOp(Multi upstream, long numberOfItems) {
        super(upstream);
        this.numberOfItems = ParameterValidation.positiveOrZero(numberOfItems, "numberOfItems");
    }

    @Override
    public void subscribe(MultiSubscriber actual) {
        if (numberOfItems == 0) {
            // Pass-through
            upstream.subscribe(actual);
        } else {
            upstream.subscribe(new SkipFirstProcessor<>(actual, numberOfItems));
        }
    }

    static final class SkipFirstProcessor extends MultiOperatorProcessor {

        private final AtomicLong remaining;

        SkipFirstProcessor(MultiSubscriber downstream, long items) {
            super(downstream);
            this.remaining = new AtomicLong(items);
        }

        @Override
        public void onSubscribe(Subscription subscription) {
            if (compareAndSetUpstreamSubscription(null, subscription)) {
                downstream.onSubscribe(this);
                long l = remaining.get();
                // Do not request 0
                if (l > 0) {
                    subscription.request(l);
                }
            } else {
                subscription.cancel();
            }
        }

        @Override
        public void onItem(T t) {
            long r = remaining.getAndDecrement();
            if (r <= 0L) {
                downstream.onItem(t);
            }
            // Other elements are skipped.
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy