Search in sources :

Example 1 with Signal

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();
        }
    });
}
Also used : AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Signal(com.oath.cyclops.async.adapters.Signal) Continuation(com.oath.cyclops.types.futurestream.Continuation) Subscription(org.reactivestreams.Subscription)

Example 2 with Signal

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();
    });
}
Also used : AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Continuation(com.oath.cyclops.types.futurestream.Continuation) Signal(com.oath.cyclops.async.adapters.Signal)

Aggregations

Signal (com.oath.cyclops.async.adapters.Signal)2 Continuation (com.oath.cyclops.types.futurestream.Continuation)2 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)2 Subscription (org.reactivestreams.Subscription)1