mutiny.zero.internal.BufferingTubeBase Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of mutiny-zero Show documentation
Show all versions of mutiny-zero Show documentation
Mutiny Zero is a minimal API for creating reactive-streams compliant publishers
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 super T> 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