package com.github.davidmoten.rx.internal.operators; import rx.Observable; import rx.Observable.OnSubscribe; import rx.Subscriber; import rx.exceptions.Exceptions; import rx.functions.Action0; public final class OnSubscribeDoOnEmpty<T> implements OnSubscribe<T> { private final Action0 onEmpty; private Observable<T> observable; public OnSubscribeDoOnEmpty(Observable<T> observable, Action0 onEmpty) { this.observable = observable; this.onEmpty = onEmpty; } @Override public void call(final Subscriber<? super T> child) { Subscriber<T> parent = createSubscriber(child, onEmpty); observable.unsafeSubscribe(parent); } private static <T> Subscriber<T> createSubscriber(final Subscriber<? super T> child, final Action0 onEmpty) { return new Subscriber<T>(child) { private boolean isEmpty = true; @Override public void onCompleted() { if (isEmpty) { try { onEmpty.call(); } catch (Throwable e) { Exceptions.throwOrReport(e,this); return; } if (!isUnsubscribed()) { child.onCompleted(); } } else { child.onCompleted(); } } @Override public void onError(Throwable e) { child.onError(e); } @Override public void onNext(T t) { isEmpty = false; child.onNext(t); } }; } }