Skip to content

Commit 2bd12ab

Browse files
complete WithFilter
1 parent 1d52491 commit 2bd12ab

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

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

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1430,6 +1430,10 @@ class Observable[+T](val asJava: rx.Observable[_ <: T])
14301430
new BlockingObservable[T](asJava.toBlockingObservable())
14311431
}
14321432

1433+
def withFilter(p: T => Boolean): WithFilter[T] = {
1434+
new WithFilter[T](p, asJava)
1435+
}
1436+
14331437
}
14341438

14351439
object Observable {
@@ -1796,18 +1800,25 @@ object Observable {
17961800
}
17971801
}
17981802

1799-
// Cannot yet have inner class because of this error message:
1800-
// implementation restriction: nested class is not allowed in value class.
1801-
// This restriction is planned to be removed in subsequent releases.
1802-
class WithFilter[+T] private[scala] (p: T => Boolean, wrapped: rx.Observable[_ <: T]) {
1803+
// Cannot yet have inner class because of this error message:
1804+
// "implementation restriction: nested class is not allowed in value class.
1805+
// This restriction is planned to be removed in subsequent releases."
1806+
class WithFilter[+T] private[scala] (p: T => Boolean, asJava: rx.Observable[_ <: T]) {
18031807
import rx.lang.scala.internal.ImplicitFunctionConversions._
18041808

1805-
def map[B](f: T => B): Observable[B] = new Observable[B](wrapped.filter(p).map(f))
1809+
def map[B](f: T => B): Observable[B] = {
1810+
Observable[B](asJava.filter(p).map[B](f))
1811+
}
1812+
18061813
def flatMap[B](f: T => Observable[B]): Observable[B] = {
1807-
??? // TODO
1814+
Observable[B](asJava.filter(p).flatMap[B]((x: T) => f(x).asJava))
18081815
}
1809-
def foreach(f: T => Unit): Unit = wrapped.filter(p).toBlockingObservable.forEach(f)
1810-
def withFilter(p: T => Boolean): Observable[T] = new Observable[T](wrapped.filter(p))
1816+
1817+
def withFilter(q: T => Boolean): Observable[T] = {
1818+
Observable[T](asJava.filter((x: T) => p(x) && q(x)))
1819+
}
1820+
1821+
// there is no foreach here, that's only available on BlockingObservable
18111822
}
18121823

18131824
class UnitTestSuite extends JUnitSuite {

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,12 @@ class RxScalaDemo extends JUnitSuite {
119119
for (n <- numbers.toBlockingObservable) println(n+10)
120120
}
121121

122+
@Test def testForComprehension() {
123+
val observables = Observable(Observable(1, 2, 3), Observable(10, 20, 30))
124+
val squares = (for (o <- observables; i <- o if i % 2 == 0) yield i*i)
125+
assertEquals(squares.toBlockingObservable.toList, List(4, 100, 400, 900))
126+
}
127+
122128
def output(s: String): Unit = println(s)
123129

124130
// blocks until obs has completed

0 commit comments

Comments
 (0)