Skip to content

Commit 11e1bd0

Browse files
Merge pull request #952 from zsxwing/amb
rxjava-scala improvements and reimplemented the `amb` operator
2 parents 90d5978 + 29b5150 commit 11e1bd0

File tree

5 files changed

+179
-74
lines changed

5 files changed

+179
-74
lines changed

language-adaptors/rxjava-scala/src/examples/scala/rx/lang/scala/examples/RxScalaDemo.scala

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,4 +533,35 @@ class RxScalaDemo extends JUnitSuite {
533533
println(result)
534534
}
535535

536+
@Test def ambExample(): Unit = {
537+
val o1 = List(100L, 200L, 300L).toObservable.delay(4 seconds)
538+
val o2 = List(1000L, 2000L, 3000L).toObservable.delay(2 seconds)
539+
val result = o1.amb(o2).toBlockingObservable.toList
540+
println(result)
541+
}
542+
543+
@Test def delayExample(): Unit = {
544+
val o = List(100L, 200L, 300L).toObservable.delay(2 seconds)
545+
val result = o.toBlockingObservable.toList
546+
println(result)
547+
}
548+
549+
@Test def delayExample2(): Unit = {
550+
val o = List(100L, 200L, 300L).toObservable.delay(2 seconds, IOScheduler())
551+
val result = o.toBlockingObservable.toList
552+
println(result)
553+
}
554+
555+
@Test def delaySubscriptionExample(): Unit = {
556+
val o = List(100L, 200L, 300L).toObservable.delaySubscription(2 seconds)
557+
val result = o.toBlockingObservable.toList
558+
println(result)
559+
}
560+
561+
@Test def delaySubscriptionExample2(): Unit = {
562+
val o = List(100L, 200L, 300L).toObservable.delaySubscription(2 seconds, IOScheduler())
563+
val result = o.toBlockingObservable.toList
564+
println(result)
565+
}
566+
536567
}

language-adaptors/rxjava-scala/src/main/scala/rx/lang/scala/Observable.scala

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2236,6 +2236,75 @@ trait Observable[+T]
22362236
def doOnEach(onNext: T => Unit, onError: Throwable => Unit, onCompleted: () => Unit): Observable[T] = {
22372237
toScalaObservable[T](asJavaObservable.doOnEach(Observer(onNext, onError,onCompleted)))
22382238
}
2239+
2240+
/**
2241+
* Given two Observables, mirror the one that first emits an item.
2242+
*
2243+
* <img width="640" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/amb.png">
2244+
*
2245+
* @param that
2246+
* an Observable competing to react first
2247+
* @return an Observable that emits the same sequence of items as whichever of `this` or `that` first emitted an item.
2248+
*/
2249+
def amb[U >: T](that: Observable[U]): Observable[U] = {
2250+
val thisJava: rx.Observable[_ <: U] = this.asJavaObservable
2251+
val thatJava: rx.Observable[_ <: U] = that.asJavaObservable
2252+
toScalaObservable[U](rx.Observable.amb(thisJava, thatJava))
2253+
}
2254+
2255+
/**
2256+
* Returns an Observable that emits the items emitted by the source Observable shifted forward in time by a
2257+
* specified delay. Error notifications from the source Observable are not delayed.
2258+
*
2259+
* <img width="640" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/delay.png">
2260+
*
2261+
* @param delay the delay to shift the source by
2262+
* @return the source Observable shifted in time by the specified delay
2263+
*/
2264+
def delay(delay: Duration): Observable[T] = {
2265+
toScalaObservable[T](asJavaObservable.delay(delay.length, delay.unit))
2266+
}
2267+
2268+
/**
2269+
* Returns an Observable that emits the items emitted by the source Observable shifted forward in time by a
2270+
* specified delay. Error notifications from the source Observable are not delayed.
2271+
*
2272+
* <img width="640" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/delay.s.png">
2273+
*
2274+
* @param delay the delay to shift the source by
2275+
* @param scheduler the Scheduler to use for delaying
2276+
* @return the source Observable shifted in time by the specified delay
2277+
*/
2278+
def delay(delay: Duration, scheduler: Scheduler): Observable[T] = {
2279+
toScalaObservable[T](asJavaObservable.delay(delay.length, delay.unit, scheduler))
2280+
}
2281+
2282+
/**
2283+
* Return an Observable that delays the subscription to the source Observable by a given amount of time.
2284+
*
2285+
* <img width="640" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/delaySubscription.png">
2286+
*
2287+
* @param delay the time to delay the subscription
2288+
* @return an Observable that delays the subscription to the source Observable by the given amount
2289+
*/
2290+
def delaySubscription(delay: Duration): Observable[T] = {
2291+
toScalaObservable[T](asJavaObservable.delaySubscription(delay.length, delay.unit))
2292+
}
2293+
2294+
/**
2295+
* Return an Observable that delays the subscription to the source Observable by a given amount of time,
2296+
* both waiting and subscribing on a given Scheduler.
2297+
*
2298+
* <img width="640" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/delaySubscription.s.png">
2299+
*
2300+
* @param delay the time to delay the subscription
2301+
* @param scheduler the Scheduler on which the waiting and subscription will happen
2302+
* @return an Observable that delays the subscription to the source Observable by a given
2303+
* amount, waiting and subscribing on the given Scheduler
2304+
*/
2305+
def delaySubscription(delay: Duration, scheduler: Scheduler): Observable[T] = {
2306+
toScalaObservable[T](asJavaObservable.delaySubscription(delay.length, delay.unit, scheduler))
2307+
}
22392308
}
22402309

22412310
/**

rxjava-core/src/main/java/rx/Observable.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
import rx.operators.OnSubscribeFromIterable;
5353
import rx.operators.OnSubscribeRange;
5454
import rx.operators.OperationAll;
55-
import rx.operators.OperationAmb;
55+
import rx.operators.OperatorAmb;
5656
import rx.operators.OperationAny;
5757
import rx.operators.OperationAsObservable;
5858
import rx.operators.OperationAverage;
@@ -300,7 +300,7 @@ public void call(Subscriber<? super R> o) {
300300
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229115.aspx">MSDN: Observable.Amb</a>
301301
*/
302302
public final static <T> Observable<T> amb(Iterable<? extends Observable<? extends T>> sources) {
303-
return create(OperationAmb.amb(sources));
303+
return create(OperatorAmb.amb(sources));
304304
}
305305

306306
/**
@@ -318,7 +318,7 @@ public final static <T> Observable<T> amb(Iterable<? extends Observable<? extend
318318
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229733.aspx">MSDN: Observable.Amb</a>
319319
*/
320320
public final static <T> Observable<T> amb(Observable<? extends T> o1, Observable<? extends T> o2) {
321-
return create(OperationAmb.amb(o1, o2));
321+
return create(OperatorAmb.amb(o1, o2));
322322
}
323323

324324
/**
@@ -338,7 +338,7 @@ public final static <T> Observable<T> amb(Observable<? extends T> o1, Observable
338338
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229733.aspx">MSDN: Observable.Amb</a>
339339
*/
340340
public final static <T> Observable<T> amb(Observable<? extends T> o1, Observable<? extends T> o2, Observable<? extends T> o3) {
341-
return create(OperationAmb.amb(o1, o2, o3));
341+
return create(OperatorAmb.amb(o1, o2, o3));
342342
}
343343

344344
/**
@@ -360,7 +360,7 @@ public final static <T> Observable<T> amb(Observable<? extends T> o1, Observable
360360
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229733.aspx">MSDN: Observable.Amb</a>
361361
*/
362362
public final static <T> Observable<T> amb(Observable<? extends T> o1, Observable<? extends T> o2, Observable<? extends T> o3, Observable<? extends T> o4) {
363-
return create(OperationAmb.amb(o1, o2, o3, o4));
363+
return create(OperatorAmb.amb(o1, o2, o3, o4));
364364
}
365365

366366
/**
@@ -384,7 +384,7 @@ public final static <T> Observable<T> amb(Observable<? extends T> o1, Observable
384384
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229733.aspx">MSDN: Observable.Amb</a>
385385
*/
386386
public final static <T> Observable<T> amb(Observable<? extends T> o1, Observable<? extends T> o2, Observable<? extends T> o3, Observable<? extends T> o4, Observable<? extends T> o5) {
387-
return create(OperationAmb.amb(o1, o2, o3, o4, o5));
387+
return create(OperatorAmb.amb(o1, o2, o3, o4, o5));
388388
}
389389

390390
/**
@@ -410,7 +410,7 @@ public final static <T> Observable<T> amb(Observable<? extends T> o1, Observable
410410
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229733.aspx">MSDN: Observable.Amb</a>
411411
*/
412412
public final static <T> Observable<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) {
413-
return create(OperationAmb.amb(o1, o2, o3, o4, o5, o6));
413+
return create(OperatorAmb.amb(o1, o2, o3, o4, o5, o6));
414414
}
415415

416416
/**
@@ -438,7 +438,7 @@ public final static <T> Observable<T> amb(Observable<? extends T> o1, Observable
438438
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229733.aspx">MSDN: Observable.Amb</a>
439439
*/
440440
public final static <T> Observable<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) {
441-
return create(OperationAmb.amb(o1, o2, o3, o4, o5, o6, o7));
441+
return create(OperatorAmb.amb(o1, o2, o3, o4, o5, o6, o7));
442442
}
443443

444444
/**
@@ -468,7 +468,7 @@ public final static <T> Observable<T> amb(Observable<? extends T> o1, Observable
468468
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229733.aspx">MSDN: Observable.Amb</a>
469469
*/
470470
public final static <T> Observable<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) {
471-
return create(OperationAmb.amb(o1, o2, o3, o4, o5, o6, o7, o8));
471+
return create(OperatorAmb.amb(o1, o2, o3, o4, o5, o6, o7, o8));
472472
}
473473

474474
/**
@@ -500,7 +500,7 @@ public final static <T> Observable<T> amb(Observable<? extends T> o1, Observable
500500
* @see <a href="http://msdn.microsoft.com/en-us/library/hh229733.aspx">MSDN: Observable.Amb</a>
501501
*/
502502
public final static <T> Observable<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) {
503-
return create(OperationAmb.amb(o1, o2, o3, o4, o5, o6, o7, o8, o9));
503+
return create(OperatorAmb.amb(o1, o2, o3, o4, o5, o6, o7, o8, o9));
504504
}
505505

506506
/**

0 commit comments

Comments
 (0)