package com.github.davidmoten.rx.internal.operators; import java.util.concurrent.atomic.AtomicLong; import rx.Observable.OnSubscribe; import rx.Producer; import rx.Subscriber; import rx.internal.operators.BackpressureUtils; public final class OnSubscribeRepeating<T> implements OnSubscribe<T> { private final T value; public OnSubscribeRepeating(T value) { this.value = value; } @Override public void call(Subscriber<? super T> subscriber) { RepeatingProducer<T> producer = new RepeatingProducer<T>(subscriber, value); subscriber.setProducer(producer); } @SuppressWarnings("serial") private static final class RepeatingProducer<T> extends AtomicLong implements Producer { private final Subscriber<? super T> subscriber; private final T v; public RepeatingProducer(Subscriber<? super T> subscriber, T v) { this.subscriber = subscriber; this.v = v; } @Override public void request(long n) { if (n < 0) { throw new IllegalArgumentException("reuest must be >=0"); } else if (n == 0) { return; } else if (BackpressureUtils.getAndAddRequest(this, n) == 0) { long requested = n; long emitted = 0; do { emitted = requested; while (requested-- > 0 && !subscriber.isUnsubscribed()) { subscriber.onNext(v); } } while ((requested = this.addAndGet(-emitted)) > 0); } } } }