Here\'s a snippet I\'m trying to figure out:
class RaceCondition {
Subject subject = Pu
If I understand correctly, you want to buffer until some predicate allows it based on the items. You can do this with a complicated set of operators but perhaps its easier to just write a custom operator:
public final class BufferUntil
implements Operator, T>{
final Func1 boundaryPredicate;
public BufferUntil(Func1 boundaryPredicate) {
this.boundaryPredicate = boundaryPredicate;
}
@Override
public Subscriber super T> call(
Subscriber super List> child) {
BufferWhileSubscriber parent =
new BufferWhileSubscriber(child);
child.add(parent);
return parent;
}
final class BufferWhileSubscriber extends Subscriber {
final Subscriber super List> actual;
List buffer = new ArrayList<>();
/**
* @param actual
*/
public BufferWhileSubscriber(
Subscriber super List> actual) {
this.actual = actual;
}
@Override
public void onNext(T t) {
buffer.add(t);
if (boundaryPredicate.call(t)) {
actual.onNext(buffer);
buffer = new ArrayList<>();
}
}
@Override
public void onError(Throwable e) {
buffer = null;
actual.onError(e);
}
@Override
public void onCompleted() {
List b = buffer;
buffer = null;
if (!b.isEmpty()) {
actual.onNext(b);
}
actual.onCompleted();
}
}
}