20
20
import java .util .concurrent .atomic .AtomicInteger ;
21
21
22
22
import rx .Observable ;
23
- import rx .Observable .OnSubscribeFunc ;
23
+ import rx .Observable .OnSubscribe ;
24
24
import rx .Observer ;
25
- import rx .Subscription ;
26
- import rx .subscriptions .CompositeSubscription ;
25
+ import rx .Subscriber ;
27
26
28
27
/**
29
28
* Propagates the observable sequence that reacts first.
30
29
*/
31
- public class OperationAmb {
30
+ public final class OperationAmb < T > implements OnSubscribe < T > {
32
31
33
- public static <T > OnSubscribeFunc <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 ) {
32
+ public static <T > OnSubscribe <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 ) {
34
33
List <Observable <? extends T >> sources = new ArrayList <Observable <? extends T >>();
35
34
sources .add (o1 );
36
35
sources .add (o2 );
37
36
return amb (sources );
38
37
}
39
38
40
- public static <T > OnSubscribeFunc <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 ) {
39
+ public static <T > OnSubscribe <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 ) {
41
40
List <Observable <? extends T >> sources = new ArrayList <Observable <? extends T >>();
42
41
sources .add (o1 );
43
42
sources .add (o2 );
44
43
sources .add (o3 );
45
44
return amb (sources );
46
45
}
47
46
48
- public static <T > OnSubscribeFunc <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 , Observable <? extends T > o4 ) {
47
+ public static <T > OnSubscribe <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 , Observable <? extends T > o4 ) {
49
48
List <Observable <? extends T >> sources = new ArrayList <Observable <? extends T >>();
50
49
sources .add (o1 );
51
50
sources .add (o2 );
@@ -54,7 +53,7 @@ public static <T> OnSubscribeFunc<T> amb(Observable<? extends T> o1, Observable<
54
53
return amb (sources );
55
54
}
56
55
57
- public static <T > OnSubscribeFunc <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 , Observable <? extends T > o4 , Observable <? extends T > o5 ) {
56
+ public static <T > OnSubscribe <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 , Observable <? extends T > o4 , Observable <? extends T > o5 ) {
58
57
List <Observable <? extends T >> sources = new ArrayList <Observable <? extends T >>();
59
58
sources .add (o1 );
60
59
sources .add (o2 );
@@ -64,7 +63,7 @@ public static <T> OnSubscribeFunc<T> amb(Observable<? extends T> o1, Observable<
64
63
return amb (sources );
65
64
}
66
65
67
- public static <T > OnSubscribeFunc <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 , Observable <? extends T > o4 , Observable <? extends T > o5 , Observable <? extends T > o6 ) {
66
+ public static <T > OnSubscribe <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 , Observable <? extends T > o4 , Observable <? extends T > o5 , Observable <? extends T > o6 ) {
68
67
List <Observable <? extends T >> sources = new ArrayList <Observable <? extends T >>();
69
68
sources .add (o1 );
70
69
sources .add (o2 );
@@ -75,7 +74,7 @@ public static <T> OnSubscribeFunc<T> amb(Observable<? extends T> o1, Observable<
75
74
return amb (sources );
76
75
}
77
76
78
- public static <T > OnSubscribeFunc <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 , Observable <? extends T > o4 , Observable <? extends T > o5 , Observable <? extends T > o6 , Observable <? extends T > o7 ) {
77
+ public static <T > OnSubscribe <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 , Observable <? extends T > o4 , Observable <? extends T > o5 , Observable <? extends T > o6 , Observable <? extends T > o7 ) {
79
78
List <Observable <? extends T >> sources = new ArrayList <Observable <? extends T >>();
80
79
sources .add (o1 );
81
80
sources .add (o2 );
@@ -87,7 +86,7 @@ public static <T> OnSubscribeFunc<T> amb(Observable<? extends T> o1, Observable<
87
86
return amb (sources );
88
87
}
89
88
90
- public static <T > OnSubscribeFunc <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 , Observable <? extends T > o4 , Observable <? extends T > o5 , Observable <? extends T > o6 , Observable <? extends T > o7 , Observable <? extends T > o8 ) {
89
+ public static <T > OnSubscribe <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 , Observable <? extends T > o4 , Observable <? extends T > o5 , Observable <? extends T > o6 , Observable <? extends T > o7 , Observable <? extends T > o8 ) {
91
90
List <Observable <? extends T >> sources = new ArrayList <Observable <? extends T >>();
92
91
sources .add (o1 );
93
92
sources .add (o2 );
@@ -100,7 +99,7 @@ public static <T> OnSubscribeFunc<T> amb(Observable<? extends T> o1, Observable<
100
99
return amb (sources );
101
100
}
102
101
103
- public static <T > OnSubscribeFunc <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 , Observable <? extends T > o4 , Observable <? extends T > o5 , Observable <? extends T > o6 , Observable <? extends T > o7 , Observable <? extends T > o8 , Observable <? extends T > o9 ) {
102
+ public static <T > OnSubscribe <T > amb (Observable <? extends T > o1 , Observable <? extends T > o2 , Observable <? extends T > o3 , Observable <? extends T > o4 , Observable <? extends T > o5 , Observable <? extends T > o6 , Observable <? extends T > o7 , Observable <? extends T > o8 , Observable <? extends T > o9 ) {
104
103
List <Observable <? extends T >> sources = new ArrayList <Observable <? extends T >>();
105
104
sources .add (o1 );
106
105
sources .add (o2 );
@@ -114,40 +113,19 @@ public static <T> OnSubscribeFunc<T> amb(Observable<? extends T> o1, Observable<
114
113
return amb (sources );
115
114
}
116
115
117
- public static <T > OnSubscribeFunc <T > amb (
118
- final Iterable <? extends Observable <? extends T >> sources ) {
119
- return new OnSubscribeFunc <T >() {
120
-
121
- @ Override
122
- public Subscription onSubscribe (final Observer <? super T > observer ) {
123
- AtomicInteger choice = new AtomicInteger (AmbObserver .NONE );
124
- int index = 0 ;
125
- CompositeSubscription parentSubscription = new CompositeSubscription ();
126
- for (Observable <? extends T > source : sources ) {
127
- SafeObservableSubscription subscription = new SafeObservableSubscription ();
128
- AmbObserver <T > ambObserver = new AmbObserver <T >(
129
- subscription , observer , index , choice );
130
- parentSubscription .add (subscription .wrap (source
131
- .subscribe (ambObserver )));
132
- index ++;
133
- }
134
- return parentSubscription ;
135
- }
136
- };
116
+ public static <T > OnSubscribe <T > amb (final Iterable <? extends Observable <? extends T >> sources ) {
117
+ return new OperationAmb <T >(sources );
137
118
}
138
119
139
- private static class AmbObserver <T > implements Observer <T > {
120
+ private static final class AmbSubscriber <T > extends Subscriber <T > {
140
121
141
122
private static final int NONE = -1 ;
142
123
143
- private Subscription subscription ;
144
124
private Observer <? super T > observer ;
145
125
private int index ;
146
126
private AtomicInteger choice ;
147
127
148
- private AmbObserver (Subscription subscription ,
149
- Observer <? super T > observer , int index , AtomicInteger choice ) {
150
- this .subscription = subscription ;
128
+ private AmbSubscriber (Subscriber <? super T > observer , int index , AtomicInteger choice ) {
151
129
this .observer = observer ;
152
130
this .choice = choice ;
153
131
this .index = index ;
@@ -156,7 +134,7 @@ private AmbObserver(Subscription subscription,
156
134
@ Override
157
135
public void onNext (T args ) {
158
136
if (!isSelected ()) {
159
- subscription . unsubscribe ();
137
+ unsubscribe ();
160
138
return ;
161
139
}
162
140
observer .onNext (args );
@@ -165,7 +143,7 @@ public void onNext(T args) {
165
143
@ Override
166
144
public void onCompleted () {
167
145
if (!isSelected ()) {
168
- subscription . unsubscribe ();
146
+ unsubscribe ();
169
147
return ;
170
148
}
171
149
observer .onCompleted ();
@@ -174,7 +152,7 @@ public void onCompleted() {
174
152
@ Override
175
153
public void onError (Throwable e ) {
176
154
if (!isSelected ()) {
177
- subscription . unsubscribe ();
155
+ unsubscribe ();
178
156
return ;
179
157
}
180
158
observer .onError (e );
@@ -188,4 +166,25 @@ private boolean isSelected() {
188
166
}
189
167
}
190
168
169
+ private final Iterable <? extends Observable <? extends T >> sources ;
170
+
171
+ private OperationAmb (Iterable <? extends Observable <? extends T >> sources ) {
172
+ this .sources = sources ;
173
+ }
174
+
175
+ @ Override
176
+ public void call (Subscriber <? super T > subscriber ) {
177
+ AtomicInteger choice = new AtomicInteger (AmbSubscriber .NONE );
178
+ int index = 0 ;
179
+ for (Observable <? extends T > source : sources ) {
180
+ if (subscriber .isUnsubscribed ()) {
181
+ break ;
182
+ }
183
+ AmbSubscriber <T > ambSubscriber = new AmbSubscriber <T >(subscriber , index , choice );
184
+ subscriber .add (ambSubscriber );
185
+ source .subscribe (ambSubscriber );
186
+ index ++;
187
+ }
188
+ }
189
+
191
190
}
0 commit comments