@@ -277,6 +277,9 @@ sealed abstract class List[+A] extends AbstractSeq[A]
277
277
override def toStream : Stream [A ] =
278
278
if (isEmpty) Stream .Empty
279
279
else new Stream .Cons (head, tail.toStream)
280
+
281
+ @ deprecated(" use `distinct` instead" , " 2.8.0" )
282
+ def removeDuplicates : List [A ] = distinct
280
283
}
281
284
282
285
/** The empty list.
@@ -343,6 +346,8 @@ final case class ::[B](private var hd: B, private[scala] var tl: List[B]) extend
343
346
*/
344
347
object List extends SeqFactory [List ] {
345
348
349
+ import scala .collection .{Iterable , Seq , IndexedSeq }
350
+
346
351
/** $genericCanBuildFromInfo */
347
352
implicit def canBuildFrom [A ]: CanBuildFrom [Coll , A , List [A ]] =
348
353
ReusableCBF .asInstanceOf [GenericCanBuildFrom [A ]]
@@ -352,6 +357,248 @@ object List extends SeqFactory[List] {
352
357
override def empty [A ]: List [A ] = Nil
353
358
354
359
override def apply [A ](xs : A * ): List [A ] = xs.toList
360
+
361
+ /** Create a sorted list with element values `v,,>n+1,, = step(v,,n,,)`
362
+ * where `v,,0,, = start` and elements are in the range between `start`
363
+ * (inclusive) and `end` (exclusive).
364
+ *
365
+ * @param start the start value of the list
366
+ * @param end the end value of the list
367
+ * @param step the increment function of the list, which given `v,,n,,`,
368
+ * computes `v,,n+1,,`. Must be monotonically increasing
369
+ * or decreasing.
370
+ * @return the sorted list of all integers in range `[start;end)`.
371
+ */
372
+ @ deprecated(" use `iterate` instead" , " 2.8.0" )
373
+ def range (start : Int , end : Int , step : Int => Int ): List [Int ] = {
374
+ val up = step(start) > start
375
+ val down = step(start) < start
376
+ val b = new ListBuffer [Int ]
377
+ var i = start
378
+ while ((! up || i < end) && (! down || i > end)) {
379
+ b += i
380
+ val next = step(i)
381
+ if (i == next)
382
+ throw new IllegalArgumentException (" the step function did not make any progress on " + i)
383
+ i = next
384
+ }
385
+ b.toList
386
+ }
387
+
388
+ /** Create a list containing several copies of an element.
389
+ *
390
+ * @param n the length of the resulting list
391
+ * @param elem the element composing the resulting list
392
+ * @return a list composed of `n` elements all equal to `elem`
393
+ */
394
+ @ deprecated(" use `fill` instead" , " 2.8.0" )
395
+ def make [A ](n : Int , elem : A ): List [A ] = {
396
+ val b = new ListBuffer [A ]
397
+ var i = 0
398
+ while (i < n) {
399
+ b += elem
400
+ i += 1
401
+ }
402
+ b.toList
403
+ }
404
+
405
+ /** Concatenate all the elements of a given list of lists.
406
+ *
407
+ * @param xss the list of lists that are to be concatenated
408
+ * @return the concatenation of all the lists
409
+ */
410
+ @ deprecated(" use `xss.flatten` instead of `List.flatten(xss)`" , " 2.8.0" )
411
+ def flatten [A ](xss : List [List [A ]]): List [A ] = {
412
+ val b = new ListBuffer [A ]
413
+ for (xs <- xss) {
414
+ var xc = xs
415
+ while (! xc.isEmpty) {
416
+ b += xc.head
417
+ xc = xc.tail
418
+ }
419
+ }
420
+ b.toList
421
+ }
422
+
423
+ /** Transforms a list of pairs into a pair of lists.
424
+ *
425
+ * @param xs the list of pairs to unzip
426
+ * @return a pair of lists.
427
+ */
428
+ @ deprecated(" use `xs.unzip` instead of `List.unzip(xs)`" , " 2.8.0" )
429
+ def unzip [A ,B ](xs : List [(A ,B )]): (List [A ], List [B ]) = {
430
+ val b1 = new ListBuffer [A ]
431
+ val b2 = new ListBuffer [B ]
432
+ var xc = xs
433
+ while (! xc.isEmpty) {
434
+ b1 += xc.head._1
435
+ b2 += xc.head._2
436
+ xc = xc.tail
437
+ }
438
+ (b1.toList, b2.toList)
439
+ }
440
+
441
+ /** Transforms an iterable of pairs into a pair of lists.
442
+ *
443
+ * @param xs the iterable of pairs to unzip
444
+ * @return a pair of lists.
445
+ */
446
+ @ deprecated(" use `xs.unzip` instead of `List.unzip(xs)`" , " 2.8.0" )
447
+ def unzip [A ,B ](xs : Iterable [(A ,B )]): (List [A ], List [B ]) =
448
+ xs.foldRight[(List [A ], List [B ])]((Nil , Nil )) {
449
+ case ((x, y), (xs, ys)) => (x :: xs, y :: ys)
450
+ }
451
+
452
+ /**
453
+ * Returns the `Left` values in the given `Iterable` of `Either`s.
454
+ */
455
+ @ deprecated(" use `xs collect { case Left(x: A) => x }` instead of `List.lefts(xs)`" , " 2.8.0" )
456
+ def lefts [A , B ](es : Iterable [Either [A , B ]]) =
457
+ es.foldRight[List [A ]](Nil )((e, as) => e match {
458
+ case Left (a) => a :: as
459
+ case Right (_) => as
460
+ })
461
+
462
+ /**
463
+ * Returns the `Right` values in the given `Iterable` of `Either`s.
464
+ */
465
+ @ deprecated(" use `xs collect { case Right(x: B) => x }` instead of `List.rights(xs)`" , " 2.8.0" )
466
+ def rights [A , B ](es : Iterable [Either [A , B ]]) =
467
+ es.foldRight[List [B ]](Nil )((e, bs) => e match {
468
+ case Left (_) => bs
469
+ case Right (b) => b :: bs
470
+ })
471
+
472
+ /** Transforms an Iterable of Eithers into a pair of lists.
473
+ *
474
+ * @param xs the iterable of Eithers to separate
475
+ * @return a pair of lists.
476
+ */
477
+ @ deprecated(" use `(for (Left(x) <- es) yield x, for (Right(x) <- es) yield x)` instead" , " 2.8.0" )
478
+ def separate [A ,B ](es : Iterable [Either [A , B ]]): (List [A ], List [B ]) =
479
+ es.foldRight[(List [A ], List [B ])]((Nil , Nil )) {
480
+ case (Left (a), (lefts, rights)) => (a :: lefts, rights)
481
+ case (Right (b), (lefts, rights)) => (lefts, b :: rights)
482
+ }
483
+
484
+ /** Converts an iterator to a list.
485
+ *
486
+ * @param it the iterator to convert
487
+ * @return a list that contains the elements returned by successive
488
+ * calls to `it.next`
489
+ */
490
+ @ deprecated(" use `it.toList` instead of `List.toList(it)`" , " 2.8.0" )
491
+ def fromIterator [A ](it : Iterator [A ]): List [A ] = it.toList
492
+
493
+ /** Converts an array into a list.
494
+ *
495
+ * @param arr the array to convert
496
+ * @return a list that contains the same elements than `arr`
497
+ * in the same order
498
+ */
499
+ @ deprecated(" use `array.toList` instead of `List.fromArray(array)`" , " 2.8.0" )
500
+ def fromArray [A ](arr : Array [A ]): List [A ] = fromArray(arr, 0 , arr.length)
501
+
502
+ /** Converts a range of an array into a list.
503
+ *
504
+ * @param arr the array to convert
505
+ * @param start the first index to consider
506
+ * @param len the length of the range to convert
507
+ * @return a list that contains the same elements than `arr`
508
+ * in the same order
509
+ */
510
+ @ deprecated(" use `array.view(start, end).toList` instead of `List.fromArray(array, start, end)`" , " 2.8.0" )
511
+ def fromArray [A ](arr : Array [A ], start : Int , len : Int ): List [A ] = {
512
+ var res : List [A ] = Nil
513
+ var i = start + len
514
+ while (i > start) {
515
+ i -= 1
516
+ res = arr(i) :: res
517
+ }
518
+ res
519
+ }
520
+
521
+ /** Returns the list resulting from applying the given function `f`
522
+ * to corresponding elements of the argument lists.
523
+ *
524
+ * @param f function to apply to each pair of elements.
525
+ * @return `[f(a,,0,,,b,,0,,), ..., f(a,,n,,,b,,n,,)]` if the lists are
526
+ * `[a,,0,,, ..., a,,k,,]`, `[b,,0,,, ..., b,,l,,]` and
527
+ * `n = min(k,l)`
528
+ */
529
+ @ deprecated(" use `(xs, ys).zipped.map(f)` instead of `List.map2(xs, ys)(f)`" , " 2.8.0" )
530
+ def map2 [A ,B ,C ](xs : List [A ], ys : List [B ])(f : (A , B ) => C ): List [C ] = {
531
+ val b = new ListBuffer [C ]
532
+ var xc = xs
533
+ var yc = ys
534
+ while (! xc.isEmpty && ! yc.isEmpty) {
535
+ b += f(xc.head, yc.head)
536
+ xc = xc.tail
537
+ yc = yc.tail
538
+ }
539
+ b.toList
540
+ }
541
+
542
+ /** Tests whether the given predicate `p` holds
543
+ * for all corresponding elements of the argument lists.
544
+ *
545
+ * @param p function to apply to each pair of elements.
546
+ * @return `(p(a<sub>0</sub>,b<sub>0</sub>) &&
547
+ * ... && p(a<sub>n</sub>,b<sub>n</sub>))]`
548
+ * if the lists are `[a<sub>0</sub>, ..., a<sub>k</sub>]`;
549
+ * `[b<sub>0</sub>, ..., b<sub>l</sub>]`
550
+ * and `n = min(k,l)`
551
+ */
552
+ @ deprecated(" use `(xs, ys).zipped.forall(f)` instead of `List.forall2(xs, ys)(f)`" , " 2.8.0" )
553
+ def forall2 [A ,B ](xs : List [A ], ys : List [B ])(f : (A , B ) => Boolean ): Boolean = {
554
+ var xc = xs
555
+ var yc = ys
556
+ while (! xc.isEmpty && ! yc.isEmpty) {
557
+ if (! f(xc.head, yc.head)) return false
558
+ xc = xc.tail
559
+ yc = yc.tail
560
+ }
561
+ true
562
+ }
563
+
564
+ /** Tests whether the given predicate `p` holds
565
+ * for some corresponding elements of the argument lists.
566
+ *
567
+ * @param p function to apply to each pair of elements.
568
+ * @return `n != 0 && (p(a<sub>0</sub>,b<sub>0</sub>) ||
569
+ * ... || p(a<sub>n</sub>,b<sub>n</sub>))]` if the lists are
570
+ * `[a<sub>0</sub>, ..., a<sub>k</sub>]`,
571
+ * `[b<sub>0</sub>, ..., b<sub>l</sub>]` and
572
+ * `n = min(k,l)`
573
+ */
574
+ @ deprecated(" use `(xs, ys).zipped.exists(f)` instead of `List.exists2(xs, ys)(f)`" , " 2.8.0" )
575
+ def exists2 [A ,B ](xs : List [A ], ys : List [B ])(f : (A , B ) => Boolean ): Boolean = {
576
+ var xc = xs
577
+ var yc = ys
578
+ while (! xc.isEmpty && ! yc.isEmpty) {
579
+ if (f(xc.head, yc.head)) return true
580
+ xc = xc.tail
581
+ yc = yc.tail
582
+ }
583
+ false
584
+ }
585
+
586
+ /** Transposes a list of lists.
587
+ * pre: All element lists have the same length.
588
+ *
589
+ * @param xss the list of lists
590
+ * @return the transposed list of lists
591
+ */
592
+ @ deprecated(" use `xss.transpose` instead of `List.transpose(xss)`" , " 2.8.0" )
593
+ def transpose [A ](xss : List [List [A ]]): List [List [A ]] = {
594
+ val buf = new ListBuffer [List [A ]]
595
+ var yss = xss
596
+ while (! yss.head.isEmpty) {
597
+ buf += (yss map (_.head))
598
+ yss = (yss map (_.tail))
599
+ }
600
+ buf.toList
601
+ }
355
602
}
356
603
357
604
/** Only used for list serialization */
0 commit comments