use of com.oath.cyclops.async.adapters.Queue.QueueReader in project cyclops by aol.
the class EagerFutureStreamFunctions method firstOf.
/**
* Return first Stream out of provided Streams that starts emitted results
*
* @param futureStreams Streams to race
* @return First Stream to skip emitting values
*/
@SafeVarargs
public static <U> SimpleReactStream<U> firstOf(final SimpleReactStream<U>... futureStreams) {
final List<Tuple2<SimpleReactStream<U>, QueueReader>> racers = Stream.of(futureStreams).map(s -> Tuple.tuple(s, new Queue.QueueReader(s.toQueue(), null))).collect(Collectors.toList());
while (true) {
for (final Tuple2<SimpleReactStream<U>, Queue.QueueReader> q : racers) {
if (q._2().notEmpty()) {
EagerFutureStreamFunctions.closeOthers(q._2().getQueue(), racers.stream().map(t -> t._2().getQueue()).collect(Collectors.toList()));
closeOthers(q._1(), racers.stream().map(t -> t._1()).collect(Collectors.toList()));
return q._1().fromStream(q._2().getQueue().stream(q._1().getSubscription()));
}
}
LockSupport.parkNanos(1l);
}
}
Aggregations