17
17
import io .reactivex .disposables .Disposable ;
18
18
import io .reactivex .exceptions .Exceptions ;
19
19
import io .reactivex .functions .Function ;
20
- import io .reactivex .internal .disposables .SequentialDisposable ;
20
+ import io .reactivex .internal .disposables .DisposableHelper ;
21
+ import io .reactivex .internal .functions .ObjectHelper ;
22
+ import java .util .concurrent .atomic .AtomicReference ;
21
23
22
24
public final class SingleFlatMap <T , R > extends Single <R > {
23
25
final SingleSource <? extends T > source ;
@@ -30,72 +32,84 @@ public SingleFlatMap(SingleSource<? extends T> source, Function<? super T, ? ext
30
32
}
31
33
32
34
@ Override
33
- protected void subscribeActual (SingleObserver <? super R > subscriber ) {
34
- SingleFlatMapCallback <T , R > parent = new SingleFlatMapCallback <T , R >(subscriber , mapper );
35
- subscriber .onSubscribe (parent .sd );
36
- source .subscribe (parent );
35
+ protected void subscribeActual (SingleObserver <? super R > actual ) {
36
+ source .subscribe (new SingleFlatMapCallback <T , R >(actual , mapper ));
37
37
}
38
38
39
- static final class SingleFlatMapCallback <T , R > implements SingleObserver <T > {
39
+ static final class SingleFlatMapCallback <T , R >
40
+ extends AtomicReference <Disposable >
41
+ implements SingleObserver <T >, Disposable {
40
42
final SingleObserver <? super R > actual ;
41
43
final Function <? super T , ? extends SingleSource <? extends R >> mapper ;
42
44
43
- final SequentialDisposable sd ;
44
-
45
45
SingleFlatMapCallback (SingleObserver <? super R > actual ,
46
46
Function <? super T , ? extends SingleSource <? extends R >> mapper ) {
47
47
this .actual = actual ;
48
48
this .mapper = mapper ;
49
- this .sd = new SequentialDisposable ();
49
+ }
50
+
51
+ @ Override
52
+ public void dispose () {
53
+ DisposableHelper .dispose (this );
54
+ }
55
+
56
+ @ Override
57
+ public boolean isDisposed () {
58
+ return DisposableHelper .isDisposed (get ());
50
59
}
51
60
52
61
@ Override
53
62
public void onSubscribe (Disposable d ) {
54
- sd .replace (d );
63
+ if (DisposableHelper .setOnce (this , d )) {
64
+ actual .onSubscribe (this );
65
+ }
55
66
}
56
67
57
68
@ Override
58
69
public void onSuccess (T value ) {
59
70
SingleSource <? extends R > o ;
60
71
61
72
try {
62
- o = mapper .apply (value );
73
+ o = ObjectHelper . requireNonNull ( mapper .apply (value ), "The single returned by the mapper is null" );
63
74
} catch (Throwable e ) {
64
75
Exceptions .throwIfFatal (e );
65
76
actual .onError (e );
66
77
return ;
67
78
}
68
79
69
- if (o == null ) {
70
- actual .onError (new NullPointerException ("The single returned by the mapper is null" ));
71
- return ;
72
- }
73
-
74
- if (sd .isDisposed ()) {
75
- return ;
76
- }
77
-
78
- o .subscribe (new SingleObserver <R >() {
79
- @ Override
80
- public void onSubscribe (Disposable d ) {
81
- sd .replace (d );
82
- }
83
-
84
- @ Override
85
- public void onSuccess (R value ) {
86
- actual .onSuccess (value );
87
- }
88
-
89
- @ Override
90
- public void onError (Throwable e ) {
91
- actual .onError (e );
92
- }
93
- });
80
+ o .subscribe (new FlatMapSingleObserver <R >(this , actual ));
94
81
}
95
82
96
83
@ Override
97
84
public void onError (Throwable e ) {
98
85
actual .onError (e );
99
86
}
87
+
88
+ static final class FlatMapSingleObserver <R > implements SingleObserver <R > {
89
+
90
+ final AtomicReference <Disposable > parent ;
91
+
92
+ final SingleObserver <? super R > actual ;
93
+
94
+ FlatMapSingleObserver (AtomicReference <Disposable > parent , SingleObserver <? super R > actual ) {
95
+ this .parent = parent ;
96
+ this .actual = actual ;
97
+ }
98
+
99
+ @ Override
100
+ public void onSubscribe (final Disposable d ) {
101
+ DisposableHelper .replace (parent , d );
102
+ }
103
+
104
+ @ Override
105
+ public void onSuccess (final R value ) {
106
+ actual .onSuccess (value );
107
+ }
108
+
109
+ @ Override
110
+ public void onError (final Throwable e ) {
111
+ actual .onError (e );
112
+ }
113
+ }
100
114
}
101
115
}
0 commit comments