Search in sources :

Example 1 with QueueReader

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);
    }
}
Also used : LockSupport(java.util.concurrent.locks.LockSupport) ReactiveSeq(cyclops.reactive.ReactiveSeq) QueueReader(com.oath.cyclops.async.adapters.Queue.QueueReader) Tuple2(cyclops.data.tuple.Tuple2) List(java.util.List) Queue(com.oath.cyclops.async.adapters.Queue) Tuple(cyclops.data.tuple.Tuple) Stream(java.util.stream.Stream) Iterator(java.util.Iterator) BiFunction(java.util.function.BiFunction) Optional(java.util.Optional) Collectors(java.util.stream.Collectors) QueueReader(com.oath.cyclops.async.adapters.Queue.QueueReader) Tuple2(cyclops.data.tuple.Tuple2) QueueReader(com.oath.cyclops.async.adapters.Queue.QueueReader) Queue(com.oath.cyclops.async.adapters.Queue)

Aggregations

Queue (com.oath.cyclops.async.adapters.Queue)1 QueueReader (com.oath.cyclops.async.adapters.Queue.QueueReader)1 Tuple (cyclops.data.tuple.Tuple)1 Tuple2 (cyclops.data.tuple.Tuple2)1 ReactiveSeq (cyclops.reactive.ReactiveSeq)1 Iterator (java.util.Iterator)1 List (java.util.List)1 Optional (java.util.Optional)1 LockSupport (java.util.concurrent.locks.LockSupport)1 BiFunction (java.util.function.BiFunction)1 Collectors (java.util.stream.Collectors)1 Stream (java.util.stream.Stream)1