static <T, R> FlatMapCompletable<T, R> createForAction(final Action1<T> action) { return createForAction(action, null); }
static <T, R> FlatMapCompletable<T, R> create(Func1<T, Completable> func) { return create(func, null); }
static <T, R> FlatMapCompletable<T, R> create( Func1<T, Completable> func, @Nullable Scheduler scheduler) { return new FlatMapCompletable<>(checkNotNull(func), scheduler); }
@Override public Observable<E> call(Observable<F> effectStream) { return effectStream.compose(FlatMapCompletable.<F, E>createForAction(doEffect, scheduler)); } };
static <T, R> FlatMapCompletable<T, R> createForAction( final Action1<T> action, @Nullable Scheduler scheduler) { return create( new Func1<T, Completable>() { @Override public Completable call(final T t) { return Completable.fromAction( new Action0() { @Override public void call() { action.call(t); } }); } }, scheduler); }
@Test public void errorsPropagateDownTheChain() { PublishSubject<Integer> upstream = PublishSubject.create(); FlatMapCompletable<Integer, SomeOtherType> flatMapCompletable = FlatMapCompletable.createForAction( new Action1<Integer>() { @Override public void call(Integer integer) { throw new IllegalArgumentException(); } }); Observable<SomeOtherType> observable = upstream.compose(flatMapCompletable); TestSubscriber<SomeOtherType> subscriber = new TestSubscriber<>(); observable.subscribe(subscriber); upstream.onNext(1); subscriber.assertNoValues(); subscriber.assertError(IllegalArgumentException.class); }
@Test public void invokesTheActionThenCompletesAndEmitsNothing() throws Exception { PublishSubject<Integer> values = PublishSubject.create(); SideEffectPerformer sideEffectPerformer = new SideEffectPerformer(); FlatMapCompletable<Integer, SomeOtherType> flatMapCompletable = FlatMapCompletable.createForAction(sideEffectPerformer); Observable<SomeOtherType> observable = values.compose(flatMapCompletable); TestSubscriber<SomeOtherType> subscriber = new TestSubscriber<>(); observable.subscribe(subscriber); values.onNext(1); values.onNext(5); values.onNext(6); List<Integer> unaffectedValues = sideEffectPerformer.verifySideEffects(1, 5, 6); assertTrue(unaffectedValues.isEmpty()); subscriber.assertNoValues(); values.onCompleted(); subscriber.assertCompleted(); }