18
18
package rx .lang .scalaimpl
19
19
20
20
import org .scalatest .junit .JUnitSuite
21
+ import scala .collection .Seq
21
22
22
23
23
24
/**
@@ -29,6 +30,7 @@ class Observable[+T](val asJava: rx.Observable[_ <: T])
29
30
extends AnyVal
30
31
{
31
32
import scala .collection .JavaConverters ._
33
+ import scala .collection .Seq
32
34
import scala .concurrent .duration .Duration
33
35
import rx .{Observable => JObservable }
34
36
import rx .lang .scala .{Notification , Subscription , Scheduler , Observer }
@@ -218,25 +220,10 @@ class Observable[+T](val asJava: rx.Observable[_ <: T])
218
220
* An {@link Observable} which produces connected non-overlapping buffers, which are emitted
219
221
* when the current {@link Observable} created with the {@link Func0} argument produces a {@link rx.util.Closing} object.
220
222
*/
221
- def buffer (bufferClosingSelector : () => Observable [Closing ]) : Observable [java.util. List [_ <: T ]] = {
223
+ def buffer (bufferClosingSelector : () => Observable [Closing ]) : Observable [Seq [ T ]] = {
222
224
val f : rx.util.functions.Func0 [_ <: rx.Observable [_ <: Closing ]] = bufferClosingSelector().asJava
223
- val oJava : rx.Observable [_ <: java.util.List [_]] = asJava.buffer(f)
224
- val oScala1 : Observable [java.util.List [_]] = new Observable [java.util.List [_]](oJava)
225
- oScala1.asInstanceOf [Observable [java.util.List [_ <: T ]]]
226
- }
227
-
228
- // TODO decide whether to return Java list or Scala list
229
-
230
- def bufferReturningScalaList (bufferClosingSelector : () => Observable [Closing ]) : Observable [List [T ]] = {
231
- val f : rx.util.functions.Func0 [_ <: rx.Observable [_ <: Closing ]] = bufferClosingSelector().asJava
232
- val oJava : rx.Observable [_ <: java.util.List [_]] = asJava.buffer(f)
233
- val oScala1 : Observable [java.util.List [_]] = new Observable [java.util.List [_]](oJava)
234
- val oScala2 = oScala1.map((lJava : java.util.List [_]) => {
235
- val bufferScala : scala.collection.mutable.Buffer [_] = lJava.asScala
236
- val listScala : List [Any ] = bufferScala.toList
237
- listScala.asInstanceOf [List [T ]]
238
- })
239
- oScala2
225
+ val jObs : rx.Observable [_ <: java.util.List [_]] = asJava.buffer(f)
226
+ Observable .jObsOfListToScObsOfSeq(jObs.asInstanceOf [rx.Observable [_ <: java.util.List [T ]]])
240
227
}
241
228
242
229
/**
@@ -275,7 +262,10 @@ class Observable[+T](val asJava: rx.Observable[_ <: T])
275
262
* An {@link Observable} which produces connected non-overlapping buffers containing at most
276
263
* "count" produced values.
277
264
*/
278
- // public Observable<List<T>> buffer(int count)
265
+ def buffer (count : Int ): Observable [Seq [T ]] = {
266
+ val oJava : rx.Observable [_ <: java.util.List [_]] = asJava.buffer(count)
267
+ Observable .jObsOfListToScObsOfSeq(oJava.asInstanceOf [rx.Observable [_ <: java.util.List [T ]]])
268
+ }
279
269
280
270
/**
281
271
* Creates an Observable which produces buffers of collected values.
@@ -462,7 +452,17 @@ class Observable[+T](val asJava: rx.Observable[_ <: T])
462
452
* An {@link Observable} which produces connected non-overlapping windows containing at most
463
453
* "count" produced values.
464
454
*/
465
- // public Observable<Observable<T>> window(int count)
455
+ def window (count : Int ): Observable [Observable [T ]] = {
456
+ // this line makes the compiler crash (if it's the last line of the method):
457
+ // Observable.jObsOfJObsToScObsOfScObs(asJava.window(count))
458
+
459
+ // this line gives an error:
460
+ // "type mismatch; found : rx.Observable[rx.Observable[_$1]] required: rx.Observable[rx.Observable[T]]"
461
+ // Observable.jObsOfJObsToScObsOfScObs(asJava.window(count) : JObservable[JObservable[T]])
462
+
463
+ // workaround with a cast:
464
+ Observable .jObsOfJObsToScObsOfScObs(asJava.window(count).asInstanceOf [JObservable [JObservable [T ]]])
465
+ }
466
466
467
467
/**
468
468
* Creates an Observable which produces windows of collected values. This Observable produces windows every
@@ -941,7 +941,7 @@ class Observable[+T](val asJava: rx.Observable[_ <: T])
941
941
* @see <a href="http://en.wikipedia.org/wiki/Fold_(higher-order_function)">Wikipedia: Fold (higher-order function)</a>
942
942
*/
943
943
def fold [R ](initialValue : R )(accumulator : (R , T ) => R ): Observable [R ] = {
944
- new Observable (asJava.reduce(initialValue, accumulator))
944
+ new Observable [ R ] (asJava.reduce(initialValue, accumulator))
945
945
}
946
946
// corresponds to Java's
947
947
// public <R> Observable<R> reduce(R initialValue, Func2<? super R, ? super T, ? extends R> accumulator)
@@ -1009,7 +1009,7 @@ class Observable[+T](val asJava: rx.Observable[_ <: T])
1009
1009
* @see <a href="http://msdn.microsoft.com/en-us/library/hh211665(v%3Dvs.103).aspx">MSDN: Observable.Scan</a>
1010
1010
*/
1011
1011
def scan [R ](initialValue : R )(accumulator : (R , T ) => R ): Observable [R ] = {
1012
- new Observable (asJava.scan(initialValue, accumulator))
1012
+ new Observable [ R ] (asJava.scan(initialValue, accumulator))
1013
1013
}
1014
1014
// corresponds to Scala's
1015
1015
// public <R> Observable<R> scan(R initialValue, Func2<? super R, ? super T, ? extends R> accumulator)
@@ -1106,6 +1106,10 @@ class Observable[+T](val asJava: rx.Observable[_ <: T])
1106
1106
def takeWhileWithIndex (predicate : (T , Integer ) => Boolean ): Observable [T ] = {
1107
1107
new Observable [T ](asJava.takeWhileWithIndex(predicate))
1108
1108
}
1109
+
1110
+ def zipWithIndex : Observable [(T , Int )] = {
1111
+ ???
1112
+ }
1109
1113
1110
1114
/**
1111
1115
* Returns an Observable that emits only the last <code>count</code> items emitted by the source
@@ -1276,13 +1280,26 @@ class Observable[+T](val asJava: rx.Observable[_ <: T])
1276
1280
1277
1281
object Observable {
1278
1282
import scala .collection .JavaConverters ._
1283
+ import scala .collection .immutable .Range
1279
1284
import scala .concurrent .duration .Duration
1280
1285
import scala .concurrent .Future
1281
1286
import rx .{Observable => JObservable }
1282
1287
import rx .lang .scala .{Notification , Subscription , Scheduler , Observer }
1283
1288
import rx .lang .scala .util ._
1284
1289
import rx .lang .scalaimpl .ImplicitFunctionConversions ._
1285
-
1290
+
1291
+ private [scalaimpl]
1292
+ def jObsOfListToScObsOfSeq [T ](jObs : rx.Observable [_ <: java.util.List [T ]]): Observable [Seq [T ]] = {
1293
+ val oScala1 : Observable [java.util.List [T ]] = new Observable [java.util.List [T ]](jObs)
1294
+ oScala1.map((lJava : java.util.List [T ]) => lJava.asScala)
1295
+ }
1296
+
1297
+ private [scalaimpl]
1298
+ def jObsOfJObsToScObsOfScObs [T ](jObs : rx.Observable [_ <: rx.Observable [_ <: T ]]): Observable [Observable [T ]] = {
1299
+ val oScala1 : Observable [rx.Observable [_ <: T ]] = new Observable [rx.Observable [_ <: T ]](jObs)
1300
+ oScala1.map((oJava : rx.Observable [_ <: T ]) => new Observable [T ](oJava))
1301
+ }
1302
+
1286
1303
/**
1287
1304
* Creates an Observable that will execute the given function when an {@link Observer} subscribes to it.
1288
1305
* <p>
@@ -1308,7 +1325,7 @@ object Observable {
1308
1325
* function
1309
1326
*/
1310
1327
def apply [T ](func : Observer [T ] => Subscription ): Observable [T ] = {
1311
- new Observable (JObservable .create(func))
1328
+ new Observable [ T ] (JObservable .create(func))
1312
1329
}
1313
1330
// corresponds to Java's
1314
1331
// public static <T> Observable<T> create(OnSubscribeFunc<T> func)
@@ -1329,7 +1346,7 @@ object Observable {
1329
1346
* @return an Observable that invokes the {@link Observer}'s {@link Observer#onError onError} method when the Observer subscribes to it
1330
1347
*/
1331
1348
def apply (exception : Throwable ): Observable [Nothing ] = {
1332
- new Observable (JObservable .error(exception))
1349
+ new Observable [ Nothing ] (JObservable .error(exception))
1333
1350
}
1334
1351
// corresponds to Java's
1335
1352
// public static <T> Observable<T> error(Throwable exception)
@@ -1354,11 +1371,15 @@ object Observable {
1354
1371
* @return an Observable that emits each item in the source Array
1355
1372
*/
1356
1373
def apply [T ](args : T * ): Observable [T ] = {
1357
- new Observable (JObservable .from(args.toIterable.asJava))
1374
+ new Observable [ T ] (JObservable .from(args.toIterable.asJava))
1358
1375
}
1359
1376
// corresponds to Java's
1360
1377
// public static <T> Observable<T> from(T... items)
1361
1378
1379
+ def apply (range : Range ): Observable [Int ] = {
1380
+ new Observable [Int ](JObservable .from(range.toIterable.asJava))
1381
+ }
1382
+
1362
1383
// There is no method corresponding to
1363
1384
// public static Observable<Integer> range(int start, int count)
1364
1385
// because the Scala collection library provides enough methods to create Iterables.
@@ -1385,7 +1406,7 @@ object Observable {
1385
1406
* factory function
1386
1407
*/
1387
1408
def defer [T ](observable : => Observable [T ]): Observable [T ] = {
1388
- new Observable (JObservable .defer(observable.asJava))
1409
+ new Observable [ T ] (JObservable .defer(observable.asJava))
1389
1410
}
1390
1411
// corresponds to Java's
1391
1412
// public static <T> Observable<T> defer(Func0<? extends Observable<? extends T>> observableFactory)
@@ -1410,7 +1431,7 @@ object Observable {
1410
1431
* @return an Observable that emits a single item and then completes
1411
1432
*/
1412
1433
def just [T ](value : T ): Observable [T ] = {
1413
- new Observable (JObservable .just(value))
1434
+ new Observable [ T ] (JObservable .just(value))
1414
1435
}
1415
1436
// corresponds to Java's
1416
1437
// public static <T> Observable<T> just(T value)
@@ -1548,7 +1569,7 @@ object Observable {
1548
1569
* @return an Observable that never sends any items or notifications to an {@link Observer}
1549
1570
*/
1550
1571
def never : Observable [Nothing ] = {
1551
- new Observable (JObservable .never())
1572
+ new Observable [ Nothing ] (JObservable .never())
1552
1573
}
1553
1574
1554
1575
// There is no method corresponding to
@@ -1623,12 +1644,12 @@ object Observable {
1623
1644
class WithFilter [+ T ] private [scalaimpl] (p : T => Boolean , wrapped : rx.Observable [_ <: T ]) {
1624
1645
import rx .lang .scalaimpl .ImplicitFunctionConversions ._
1625
1646
1626
- def map [B ](f : T => B ): Observable [B ] = new Observable (wrapped.filter(p).map(f))
1647
+ def map [B ](f : T => B ): Observable [B ] = new Observable [ B ] (wrapped.filter(p).map(f))
1627
1648
def flatMap [B ](f : T => Observable [B ]): Observable [B ] = {
1628
1649
??? // TODO
1629
1650
}
1630
1651
def foreach (f : T => Unit ): Unit = wrapped.filter(p).toBlockingObservable.forEach(f)
1631
- def withFilter (p : T => Boolean ): Observable [T ] = new Observable (wrapped.filter(p))
1652
+ def withFilter (p : T => Boolean ): Observable [T ] = new Observable [ T ] (wrapped.filter(p))
1632
1653
}
1633
1654
1634
1655
class UnitTestSuite extends JUnitSuite {
0 commit comments