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

mutiny.zero.internal.BufferingTubeBase Maven / Gradle / Ivy

Go to download

Mutiny Zero is a minimal API for creating reactive-streams compliant publishers

There is a newer version: 1.1.1
Show newest version
package mutiny.zero.internal;

import java.util.Queue;
import java.util.concurrent.Flow;

public abstract class BufferingTubeBase extends TubeBase {

    protected boolean delayedComplete = false;

    public BufferingTubeBase(Flow.Subscriber subscriber) {
        super(subscriber);
    }

    abstract Queue overflowQueue();

    @Override
    public void request(long n) {
        if (cancelled) {
            return;
        }
        if (n <= 0L) {
            fail(Helper.negativeRequest(n));
        } else {

            if (overflowQueue().isEmpty()) {
                super.request(n);
                return;
            }

            long remaining = n;
            T bufferedItem;
            do {
                bufferedItem = overflowQueue().poll();
                if (bufferedItem != null) {
                    dispatchQueue.offer(bufferedItem);
                    remaining--;
                }
            } while (bufferedItem != null && remaining > 0L);

            Helper.add(requested, n);
            requestConsumer.accept(n);

            completed = delayedComplete && overflowQueue().isEmpty();
        }

        drainLoop();
    }

    @Override
    public void complete() {
        if (overflowQueue().isEmpty()) {
            super.complete();
        } else {
            delayedComplete = true;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy