From 3c90565b18444ccaafbe0c3ea866e27eb9a89aab Mon Sep 17 00:00:00 2001 From: zsxwing Date: Tue, 20 May 2014 23:47:17 +0800 Subject: [PATCH 1/2] Fix the bug that using mutable function in 'zipWithIndex' --- .../src/main/scala/rx/lang/scala/Observable.scala | 3 +-- .../src/test/scala/rx/lang/scala/ObservableTest.scala | 8 ++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/language-adaptors/rxjava-scala/src/main/scala/rx/lang/scala/Observable.scala b/language-adaptors/rxjava-scala/src/main/scala/rx/lang/scala/Observable.scala index bec1498d1d..119ec7bda9 100644 --- a/language-adaptors/rxjava-scala/src/main/scala/rx/lang/scala/Observable.scala +++ b/language-adaptors/rxjava-scala/src/main/scala/rx/lang/scala/Observable.scala @@ -407,8 +407,7 @@ trait Observable[+T] * their index. Indices start at 0. */ def zipWithIndex: Observable[(T, Int)] = { - var n = 0; - this.map(x => { val result = (x,n); n += 1; result }) + zip((0 until Int.MaxValue).toObservable) } /** diff --git a/language-adaptors/rxjava-scala/src/test/scala/rx/lang/scala/ObservableTest.scala b/language-adaptors/rxjava-scala/src/test/scala/rx/lang/scala/ObservableTest.scala index 029622d638..d8ef40590e 100644 --- a/language-adaptors/rxjava-scala/src/test/scala/rx/lang/scala/ObservableTest.scala +++ b/language-adaptors/rxjava-scala/src/test/scala/rx/lang/scala/ObservableTest.scala @@ -168,4 +168,12 @@ class ObservableTests extends JUnitSuite { val o: Observable[String] = List[String]().toObservable.tail o.toBlockingObservable.toList } + + @Test + def testZipWithIndex() { + val o = List("alice", "bob", "carol").toObservable.zipWithIndex.map(_._2) + assertEquals(List(0, 1, 2), o.toBlockingObservable.toList) + assertEquals(List(0, 1, 2), o.toBlockingObservable.toList) + } + } From 1b30485a7daa99f5583cfb406beedd600fbe8404 Mon Sep 17 00:00:00 2001 From: zsxwing Date: Tue, 20 May 2014 23:56:32 +0800 Subject: [PATCH 2/2] make 'zip(that, selector)' public and rename to 'zipWith' --- .../src/main/scala/rx/lang/scala/Observable.scala | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/language-adaptors/rxjava-scala/src/main/scala/rx/lang/scala/Observable.scala b/language-adaptors/rxjava-scala/src/main/scala/rx/lang/scala/Observable.scala index 119ec7bda9..beeca0d0f3 100644 --- a/language-adaptors/rxjava-scala/src/main/scala/rx/lang/scala/Observable.scala +++ b/language-adaptors/rxjava-scala/src/main/scala/rx/lang/scala/Observable.scala @@ -385,7 +385,7 @@ trait Observable[+T] * is the minumum of the number of `onNext` invocations of `this` and `that`. */ def zip[U](that: Observable[U]): Observable[(T, U)] = { - zip(that, (t: T, u: U) => (t, u)) + zipWith(that, (t: T, u: U) => (t, u)) } /** @@ -393,10 +393,8 @@ trait Observable[+T] * corresponding elements using the selector function. * The number of `onNext` invocations of the resulting `Observable[(T, U)]` * is the minumum of the number of `onNext` invocations of `this` and `that`. - * - * Note that this function is private because Scala collections don't have such a function. */ - private def zip[U, R](that: Observable[U], selector: (T,U) => R): Observable[R] = { + def zipWith[U, R](that: Observable[U], selector: (T,U) => R): Observable[R] = { toScalaObservable[R](rx.Observable.zip[T, U, R](this.asJavaObservable, that.asJavaObservable, selector)) }