use of com.oath.cyclops.async.adapters.Signal in project cyclops by aol.
the class ReactiveStreamX method changes.
@Override
public ReactiveSeq<T> changes() {
return Spouts.defer(() -> {
if (async == Type.NO_BACKPRESSURE) {
Queue<T> discrete = QueueFactories.<T>unboundedNonBlockingQueue().build().withTimeout(1);
Signal<T> signal = new Signal<T>(null, discrete);
publishTo(signal).forEach(e -> {
}, e -> {
}, () -> signal.close());
return signal.getDiscrete().stream();
} else {
Queue<T> queue = QueueFactories.<T>unboundedNonBlockingQueue().build();
Signal<T> signal = new Signal<T>(null, queue);
Subscription sub = source.subscribe(signal::set, i -> {
signal.close();
}, () -> {
signal.close();
});
Continuation[] contRef = { null };
AtomicBoolean wip = new AtomicBoolean(false);
Continuation cont = new Continuation(() -> {
if (wip.compareAndSet(false, true)) {
sub.request(1l);
wip.set(false);
}
return contRef[0];
});
contRef[0] = cont;
queue.addContinuation(cont);
return signal.getDiscrete().stream();
}
});
}
use of com.oath.cyclops.async.adapters.Signal in project cyclops by aol.
the class SpliteratorBasedStream method changes.
public ReactiveSeq<T> changes() {
return ReactiveSeq.defer(() -> {
com.oath.cyclops.async.adapters.Queue<T> queue = QueueFactories.<T>unboundedNonBlockingQueue().build();
Spliterator<T> copy = copy();
Continuation[] contRef = { null };
Signal<T> signal = new Signal<T>(null, queue);
AtomicBoolean wip = new AtomicBoolean(false);
Continuation cont = new Continuation(() -> {
if (wip.compareAndSet(false, true)) {
if (!copy.tryAdvance(signal::set)) {
signal.close();
return Continuation.empty();
}
wip.set(false);
}
return contRef[0];
});
contRef[0] = cont;
queue.addContinuation(cont);
return signal.getDiscrete().stream();
});
}
Aggregations