package com.zhuinden.stack_rx_example; import com.zhuinden.simplestack.Backstack; import com.zhuinden.simplestack.StateChange; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; import io.reactivex.annotations.NonNull; import io.reactivex.disposables.Disposables; /** * Created by Owner on 2017. 02. 11.. */ public class RxStackObservable implements ObservableOnSubscribe<StateChange> { private Backstack backstack; private RxStackObservable(Backstack backstack) { this.backstack = backstack; } public static Observable<StateChange> create(Backstack backstack) { return Observable.create(new RxStackObservable(backstack)); } @Override public void subscribe(@NonNull ObservableEmitter<StateChange> emitter) throws Exception { final Backstack.CompletionListener completionListener = stateChange -> { if(!emitter.isDisposed()) { emitter.onNext(stateChange); } }; emitter.setDisposable(Disposables.fromAction(() -> backstack.removeCompletionListener(completionListener))); backstack.addCompletionListener(completionListener); // no initial value. it's handled by `setStateChanger()` } }