/** * Copyright 2016 Netflix, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package rx.internal.operators; import rx.*; import rx.Observable.OnSubscribe; import rx.exceptions.Exceptions; import rx.functions.*; public final class OnSubscribeCollect implements OnSubscribe { final Observable source; final Func0 collectionFactory; final Action2 collector; public OnSubscribeCollect(Observable source, Func0 collectionFactory, Action2 collector) { this.source = source; this.collectionFactory = collectionFactory; this.collector = collector; } @Override public void call(Subscriber t) { R initialValue; try { initialValue = collectionFactory.call(); } catch (Throwable ex) { Exceptions.throwIfFatal(ex); t.onError(ex); return; } new CollectSubscriber(t, initialValue, collector).subscribeTo(source); } static final class CollectSubscriber extends DeferredScalarSubscriberSafe { final Action2 collector; public CollectSubscriber(Subscriber actual, R initialValue, Action2 collector) { super(actual); this.value = initialValue; this.hasValue = true; this.collector = collector; } @Override public void onNext(T t) { if (done) { return; } try { collector.call(value, t); } catch (Throwable ex) { Exceptions.throwIfFatal(ex); unsubscribe(); onError(ex); } } } }