diff --git a/compat/src/main/scala-2.11/scala/collection/compat/package.scala b/compat/src/main/scala-2.11/scala/collection/compat/package.scala index efa2cf7f..e8fa47f5 100644 --- a/compat/src/main/scala-2.11/scala/collection/compat/package.scala +++ b/compat/src/main/scala-2.11/scala/collection/compat/package.scala @@ -32,7 +32,7 @@ package object compat extends compat.PackageShared { // `CanBuildFrom` parameters are used as type constraints, they are not used // at run-time, hence the dummy builder implementations def apply(from: IterableView[(K, V), CC[K, V]]) = new TraversableView.NoBuilder - def apply() = new TraversableView.NoBuilder + def apply() = new TraversableView.NoBuilder } implicit def toTraversableLikeExtensionMethods[Repr](self: Repr)( @@ -43,14 +43,16 @@ package object compat extends compat.PackageShared { implicit def toSeqExtensionMethods[A](self: c.Seq[A]): SeqExtensionMethods[A] = new SeqExtensionMethods[A](self) - implicit def toTrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self: T1)( - implicit w1: T1 => TraversableLike[El1, Repr1]) - : TrulyTraversableLikeExtensionMethods[T1, El1, Repr1] = - new TrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self) + implicit def toTrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self: T1)( + implicit w1: T1 => TraversableLike[El1, Repr1] + ): TrulyTraversableLikeExtensionMethods[El1, Repr1] = + new TrulyTraversableLikeExtensionMethods[El1, Repr1](w1(self)) + + implicit def toTuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2]( + self: Tuple2Zipped[El1, Repr1, El2, Repr2] + ): Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2] = + new Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self) - implicit def toTuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self: Tuple2Zipped[El1, Repr1, El2, Repr2]) - : Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2] = - new Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self) implicit def toImmutableQueueExtensionMethods[A]( self: i.Queue[A]): ImmutableQueueExtensionMethods[A] = new ImmutableQueueExtensionMethods[A](self) diff --git a/compat/src/main/scala-2.11_2.12/scala/collection/compat/PackageShared.scala b/compat/src/main/scala-2.11_2.12/scala/collection/compat/PackageShared.scala index fc3a05c2..9962cb3f 100644 --- a/compat/src/main/scala-2.11_2.12/scala/collection/compat/PackageShared.scala +++ b/compat/src/main/scala-2.11_2.12/scala/collection/compat/PackageShared.scala @@ -371,20 +371,21 @@ class TraversableLikeExtensionMethods[A, Repr](private val self: c.GenTraversabl } } -class TrulyTraversableLikeExtensionMethods[T1, El1, Repr1](private val self: T1) extends AnyVal { - def lazyZip[El2, Repr2, T2](t2: T2)( - implicit w: T1 => TraversableLike[El1, Repr1], - w2: T2 => IterableLike[El2, Repr2]): Tuple2Zipped[El1, Repr1, El2, Repr2] = - new Tuple2Zipped((w(self), t2)) +class TrulyTraversableLikeExtensionMethods[El1, Repr1]( + private val self: TraversableLike[El1, Repr1]) + extends AnyVal { + def lazyZip[El2, Repr2, T2](t2: T2)( + implicit w2: T2 => IterableLike[El2, Repr2] + ): Tuple2Zipped[El1, Repr1, El2, Repr2] = new Tuple2Zipped((self, t2)) } -class Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](private val self: Tuple2Zipped[El1, Repr1, El2, Repr2]) { - def lazyZip[El3, Repr3, T3](t3: T3)(implicit w3: T3 => IterableLike[El3, Repr3]) - : Tuple3Zipped[El1, Repr1, El2, Repr2, El3, Repr3] = { +class Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2]( + private val self: Tuple2Zipped[El1, Repr1, El2, Repr2]) { - new Tuple3Zipped((self.colls._1, self.colls._2, t3)) - } + def lazyZip[El3, Repr3, T3](t3: T3)(implicit w3: T3 => IterableLike[El3, Repr3]) + : Tuple3Zipped[El1, Repr1, El2, Repr2, El3, Repr3] = + new Tuple3Zipped((self.colls._1, self.colls._2, t3)) } class MapViewExtensionMethods[K, V, C <: scala.collection.Map[K, V]]( diff --git a/compat/src/main/scala-2.12/scala/collection/compat/package.scala b/compat/src/main/scala-2.12/scala/collection/compat/package.scala index 9596e5d8..876cfeb0 100644 --- a/compat/src/main/scala-2.12/scala/collection/compat/package.scala +++ b/compat/src/main/scala-2.12/scala/collection/compat/package.scala @@ -18,7 +18,6 @@ import scala.collection.{mutable => m} import scala.runtime.Tuple2Zipped import scala.collection.{immutable => i, mutable => m} - package object compat extends compat.PackageShared { implicit class MutableTreeMapExtensions2(private val fact: m.TreeMap.type) extends AnyVal { def from[K: Ordering, V](source: TraversableOnce[(K, V)]): m.TreeMap[K, V] = @@ -38,12 +37,13 @@ package object compat extends compat.PackageShared { // CanBuildFrom instances for `IterableView[(K, V), Map[K, V]]` that preserve // the strict type of the view to be `Map` instead of `Iterable` // Instances produced by this method are used to chain `filterKeys` after `mapValues` - implicit def canBuildFromIterableViewMapLike[K, V, L, W, CC[X, Y] <: Map[X, Y]]: CanBuildFrom[IterableView[(K, V), CC[K, V]], (L, W), IterableView[(L, W), CC[L, W]]] = + implicit def canBuildFromIterableViewMapLike[K, V, L, W, CC[X, Y] <: Map[X, Y]] + : CanBuildFrom[IterableView[(K, V), CC[K, V]], (L, W), IterableView[(L, W), CC[L, W]]] = new CanBuildFrom[IterableView[(K, V), CC[K, V]], (L, W), IterableView[(L, W), CC[L, W]]] { // `CanBuildFrom` parameters are used as type constraints, they are not used // at run-time, hence the dummy builder implementations def apply(from: IterableView[(K, V), CC[K, V]]) = new TraversableView.NoBuilder - def apply() = new TraversableView.NoBuilder + def apply() = new TraversableView.NoBuilder } implicit def toTraversableLikeExtensionMethods[Repr](self: Repr)( @@ -54,17 +54,17 @@ package object compat extends compat.PackageShared { implicit def toSeqExtensionMethods[A](self: c.Seq[A]): SeqExtensionMethods[A] = new SeqExtensionMethods[A](self) - implicit def toTrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self: T1)( - implicit w1: T1 => TraversableLike[El1, Repr1]) - : TrulyTraversableLikeExtensionMethods[T1, El1, Repr1] = - new TrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self) + implicit def toTrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self: T1)( + implicit w1: T1 => TraversableLike[El1, Repr1] + ): TrulyTraversableLikeExtensionMethods[El1, Repr1] = + new TrulyTraversableLikeExtensionMethods[El1, Repr1](w1(self)) - implicit def toTuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self: Tuple2Zipped[El1, Repr1, El2, Repr2]) - : Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2] = - new Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self) + implicit def toTuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2]( + self: Tuple2Zipped[El1, Repr1, El2, Repr2]) + : Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2] = + new Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self) implicit def toImmutableQueueExtensionMethods[A]( self: i.Queue[A]): ImmutableQueueExtensionMethods[A] = new ImmutableQueueExtensionMethods[A](self) } - diff --git a/compat/src/test/scala/test/scala/collection/LazyZipTest.scala b/compat/src/test/scala/test/scala/collection/LazyZipTest.scala index 84fc1913..a583da52 100644 --- a/compat/src/test/scala/test/scala/collection/LazyZipTest.scala +++ b/compat/src/test/scala/test/scala/collection/LazyZipTest.scala @@ -7,37 +7,37 @@ import scala.collection.compat._ class LazyZipTest { - private val ws = List(1, 2, 3) - private val xs = List(1, 2, 3, 4, 5, 6) - private val ys = List("a", "b", "c", "d", "e", "f") - private val zs = List(true, false, true, false, true, false) - private val zipped2 = ws lazyZip xs - private val zipped3 = ws lazyZip xs lazyZip ys - private val zipped4 = ws lazyZip xs lazyZip ys lazyZip zs - private val map = Map(1 -> "foo" , 2 -> "bar") - - @Test - def lazyZipTest(): Unit = { - val res: List[(Int, Int)] = zipped2.map((a, b) => (a, b)) - assertEquals(List((1, 1), (2, 2), (3, 3)), res) - } - - @Test - def lazyZip3_map(): Unit = { - val res: List[(Int, Int, String)] = zipped3.map((a: Int, b: Int, c: String) => (a, b, c)) - assertEquals(List((1, 1, "a"), (2, 2, "b"), (3, 3, "c")), res) - } - - @Test - def collectionValueIsNotEvaluated(): Unit = { - val st = Stream.cons(1, throw new AssertionError("should not be evaluated")) - ws.lazyZip(st) - } - - @Test - def zip3collectionValueIsNotEvaluated(): Unit = { - val st = Stream.cons(1, throw new AssertionError("should not be evaluated")) - ws.lazyZip(st).lazyZip(st) - } + private val ws = List(1, 2, 3) + private val xs = List(1, 2, 3, 4, 5, 6) + private val ys = List("a", "b", "c", "d", "e", "f") + private val zs = List(true, false, true, false, true, false) + private val zipped2 = ws lazyZip xs + private val zipped3 = ws lazyZip xs lazyZip ys + private val zipped4 = ws lazyZip xs lazyZip ys lazyZip zs + private val map = Map(1 -> "foo", 2 -> "bar") + + @Test + def lazyZipTest(): Unit = { + val res: List[(Int, Int)] = zipped2.map((a, b) => (a, b)) + assertEquals(List((1, 1), (2, 2), (3, 3)), res) + } + + @Test + def lazyZip3_map(): Unit = { + val res: List[(Int, Int, String)] = zipped3.map((a: Int, b: Int, c: String) => (a, b, c)) + assertEquals(List((1, 1, "a"), (2, 2, "b"), (3, 3, "c")), res) + } + + @Test + def collectionValueIsNotEvaluated(): Unit = { + val st = Stream.cons(1, throw new AssertionError("should not be evaluated")) + ws.lazyZip(st) + } + + @Test + def zip3collectionValueIsNotEvaluated(): Unit = { + val st = Stream.cons(1, throw new AssertionError("should not be evaluated")) + ws.lazyZip(st).lazyZip(st) + } }