18
18
import io .reactivex .Flowable ;
19
19
import io .reactivex .exceptions .CompositeException ;
20
20
import io .reactivex .functions .Consumer ;
21
- import io .reactivex .internal .subscriptions .SubscriptionHelper ;
21
+ import io .reactivex .internal .fuseable .ConditionalSubscriber ;
22
+ import io .reactivex .internal .subscribers .flowable .*;
23
+ import io .reactivex .internal .util .Exceptions ;
22
24
import io .reactivex .plugins .RxJavaPlugins ;
23
25
24
26
public final class FlowableDoOnEach <T > extends Flowable <T > {
@@ -41,51 +43,49 @@ public FlowableDoOnEach(Publisher<T> source, Consumer<? super T> onNext,
41
43
42
44
@ Override
43
45
protected void subscribeActual (Subscriber <? super T > s ) {
44
- source .subscribe (new DoOnEachSubscriber <T >(s , onNext , onError , onComplete , onAfterTerminate ));
46
+ if (s instanceof ConditionalSubscriber ) {
47
+ source .subscribe (new DoOnEachConditionalSubscriber <T >(
48
+ (ConditionalSubscriber <? super T >)s , onNext , onError , onComplete , onAfterTerminate ));
49
+ } else {
50
+ source .subscribe (new DoOnEachSubscriber <T >(
51
+ s , onNext , onError , onComplete , onAfterTerminate ));
52
+ }
45
53
}
46
54
47
- static final class DoOnEachSubscriber <T > implements Subscriber <T >, Subscription {
48
- final Subscriber <? super T > actual ;
55
+ static final class DoOnEachSubscriber <T > extends BasicFuseableSubscriber <T , T > {
49
56
final Consumer <? super T > onNext ;
50
57
final Consumer <? super Throwable > onError ;
51
58
final Runnable onComplete ;
52
59
final Runnable onAfterTerminate ;
53
60
54
- Subscription s ;
55
-
56
- boolean done ;
57
-
58
61
public DoOnEachSubscriber (
59
62
Subscriber <? super T > actual ,
60
63
Consumer <? super T > onNext ,
61
64
Consumer <? super Throwable > onError ,
62
65
Runnable onComplete ,
63
66
Runnable onAfterTerminate ) {
64
- this . actual = actual ;
67
+ super ( actual ) ;
65
68
this .onNext = onNext ;
66
69
this .onError = onError ;
67
70
this .onComplete = onComplete ;
68
71
this .onAfterTerminate = onAfterTerminate ;
69
72
}
70
73
71
- @ Override
72
- public void onSubscribe (Subscription s ) {
73
- if (SubscriptionHelper .validate (this .s , s )) {
74
- this .s = s ;
75
- actual .onSubscribe (this );
76
- }
77
- }
78
-
79
74
@ Override
80
75
public void onNext (T t ) {
81
76
if (done ) {
82
77
return ;
83
78
}
79
+
80
+ if (sourceMode != NONE ) {
81
+ actual .onNext (null );
82
+ return ;
83
+ }
84
+
84
85
try {
85
86
onNext .accept (t );
86
87
} catch (Throwable e ) {
87
- s .cancel ();
88
- onError (e );
88
+ fail (e );
89
89
return ;
90
90
}
91
91
@@ -103,6 +103,7 @@ public void onError(Throwable t) {
103
103
try {
104
104
onError .accept (t );
105
105
} catch (Throwable e ) {
106
+ Exceptions .throwIfFatal (e );
106
107
actual .onError (new CompositeException (e , t ));
107
108
relay = false ;
108
109
}
@@ -126,7 +127,7 @@ public void onComplete() {
126
127
try {
127
128
onComplete .run ();
128
129
} catch (Throwable e ) {
129
- onError (e );
130
+ fail (e );
130
131
return ;
131
132
}
132
133
@@ -138,17 +139,164 @@ public void onComplete() {
138
139
RxJavaPlugins .onError (e );
139
140
}
140
141
}
142
+
143
+ @ Override
144
+ public int requestFusion (int mode ) {
145
+ return transitiveBoundaryFusion (mode );
146
+ }
147
+
148
+ @ Override
149
+ public T poll () {
150
+ T v = qs .poll ();
151
+
152
+ if (v != null ) {
153
+ try {
154
+ onNext .accept (v );
155
+ } finally {
156
+ onAfterTerminate .run ();
157
+ }
158
+ } else {
159
+ if (sourceMode == SYNC ) {
160
+ onComplete .run ();
161
+
162
+ onAfterTerminate .run ();
163
+ }
164
+ }
165
+ return v ;
166
+ }
167
+ }
168
+
169
+ static final class DoOnEachConditionalSubscriber <T > extends BasicFuseableConditionalSubscriber <T , T > {
170
+ final Consumer <? super T > onNext ;
171
+ final Consumer <? super Throwable > onError ;
172
+ final Runnable onComplete ;
173
+ final Runnable onAfterTerminate ;
174
+
175
+ public DoOnEachConditionalSubscriber (
176
+ ConditionalSubscriber <? super T > actual ,
177
+ Consumer <? super T > onNext ,
178
+ Consumer <? super Throwable > onError ,
179
+ Runnable onComplete ,
180
+ Runnable onAfterTerminate ) {
181
+ super (actual );
182
+ this .onNext = onNext ;
183
+ this .onError = onError ;
184
+ this .onComplete = onComplete ;
185
+ this .onAfterTerminate = onAfterTerminate ;
186
+ }
187
+
188
+ @ Override
189
+ public void onNext (T t ) {
190
+ if (done ) {
191
+ return ;
192
+ }
193
+
194
+ if (sourceMode != NONE ) {
195
+ actual .onNext (null );
196
+ return ;
197
+ }
198
+
199
+ try {
200
+ onNext .accept (t );
201
+ } catch (Throwable e ) {
202
+ fail (e );
203
+ return ;
204
+ }
205
+
206
+ actual .onNext (t );
207
+ }
141
208
209
+ @ Override
210
+ public boolean tryOnNext (T t ) {
211
+ if (done ) {
212
+ return false ;
213
+ }
214
+
215
+ if (sourceMode != NONE ) {
216
+ return actual .tryOnNext (null );
217
+ }
218
+
219
+ try {
220
+ onNext .accept (t );
221
+ } catch (Throwable e ) {
222
+ fail (e );
223
+ return false ;
224
+ }
225
+
226
+ return actual .tryOnNext (t );
227
+ }
142
228
143
229
@ Override
144
- public void request (long n ) {
145
- s .request (n );
230
+ public void onError (Throwable t ) {
231
+ if (done ) {
232
+ RxJavaPlugins .onError (t );
233
+ return ;
234
+ }
235
+ done = true ;
236
+ boolean relay = true ;
237
+ try {
238
+ onError .accept (t );
239
+ } catch (Throwable e ) {
240
+ Exceptions .throwIfFatal (e );
241
+ actual .onError (new CompositeException (e , t ));
242
+ relay = false ;
243
+ }
244
+ if (relay ) {
245
+ actual .onError (t );
246
+ }
247
+
248
+ try {
249
+ onAfterTerminate .run ();
250
+ } catch (Throwable e ) {
251
+ RxJavaPlugins .onError (e );
252
+ }
146
253
}
147
254
148
255
@ Override
149
- public void cancel () {
150
- s .cancel ();
256
+ public void onComplete () {
257
+ if (done ) {
258
+ return ;
259
+ }
260
+ done = true ;
261
+ try {
262
+ onComplete .run ();
263
+ } catch (Throwable e ) {
264
+ fail (e );
265
+ return ;
266
+ }
267
+
268
+ actual .onComplete ();
269
+
270
+ try {
271
+ onAfterTerminate .run ();
272
+ } catch (Throwable e ) {
273
+ RxJavaPlugins .onError (e );
274
+ }
275
+ }
276
+
277
+ @ Override
278
+ public int requestFusion (int mode ) {
279
+ return transitiveBoundaryFusion (mode );
151
280
}
152
281
282
+ @ Override
283
+ public T poll () {
284
+ T v = qs .poll ();
285
+
286
+ if (v != null ) {
287
+ try {
288
+ onNext .accept (v );
289
+ } finally {
290
+ onAfterTerminate .run ();
291
+ }
292
+ } else {
293
+ if (sourceMode == SYNC ) {
294
+ onComplete .run ();
295
+
296
+ onAfterTerminate .run ();
297
+ }
298
+ }
299
+ return v ;
300
+ }
153
301
}
154
302
}
0 commit comments