Skip to content

Commit a628464

Browse files
authored
Merge pull request #305 from pietrotull/lazyzip
Lazyzip
2 parents 5aa9510 + 3a5bbca commit a628464

File tree

4 files changed

+95
-2
lines changed

4 files changed

+95
-2
lines changed

compat/src/main/scala-2.11/scala/collection/compat/package.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
package scala.collection
1414

1515
import scala.collection.generic.{CanBuildFrom, GenericOrderedCompanion, IsTraversableLike}
16+
17+
import scala.runtime.Tuple2Zipped
1618
import scala.collection.{immutable => i}
1719
import scala.{collection => c}
1820

@@ -41,7 +43,16 @@ package object compat extends compat.PackageShared {
4143
implicit def toSeqExtensionMethods[A](self: c.Seq[A]): SeqExtensionMethods[A] =
4244
new SeqExtensionMethods[A](self)
4345

46+
implicit def toTrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self: T1)(
47+
implicit w1: T1 => TraversableLike[El1, Repr1])
48+
: TrulyTraversableLikeExtensionMethods[T1, El1, Repr1] =
49+
new TrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self)
50+
51+
implicit def toTuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self: Tuple2Zipped[El1, Repr1, El2, Repr2])
52+
: Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2] =
53+
new Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self)
4454
implicit def toImmutableQueueExtensionMethods[A](
4555
self: i.Queue[A]): ImmutableQueueExtensionMethods[A] =
4656
new ImmutableQueueExtensionMethods[A](self)
57+
4758
}

compat/src/main/scala-2.11_2.12/scala/collection/compat/PackageShared.scala

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,17 @@ package scala.collection.compat
1414

1515
import scala.collection.generic._
1616
import scala.reflect.ClassTag
17-
import scala.collection.{MapLike, GenTraversable, BitSet, IterableView}
18-
import scala.collection.{immutable => i, mutable => m}
17+
import scala.collection.{
18+
BitSet,
19+
GenTraversable,
20+
IterableLike,
21+
IterableView,
22+
MapLike,
23+
TraversableLike,
24+
immutable => i,
25+
mutable => m
26+
}
27+
import scala.runtime.{Tuple2Zipped, Tuple3Zipped}
1928
import scala.{collection => c}
2029

2130
/** The collection compatibility API */
@@ -246,6 +255,7 @@ class TraversableExtensionMethods[A](private val self: c.Traversable[A]) extends
246255
def sizeCompare(otherSize: Int): Int = SizeCompareImpl.sizeCompareInt(self)(otherSize)
247256
def sizeIs: SizeCompareOps = new SizeCompareOps(self)
248257
def sizeCompare(that: c.Traversable[_]): Int = SizeCompareImpl.sizeCompareColl(self)(that)
258+
249259
}
250260

251261
class SeqExtensionMethods[A](private val self: c.Seq[A]) extends AnyVal {
@@ -361,6 +371,22 @@ class TraversableLikeExtensionMethods[A, Repr](private val self: c.GenTraversabl
361371
}
362372
}
363373

374+
class TrulyTraversableLikeExtensionMethods[T1, El1, Repr1](private val self: T1) extends AnyVal {
375+
def lazyZip[El2, Repr2, T2](t2: T2)(
376+
implicit w: T1 => TraversableLike[El1, Repr1],
377+
w2: T2 => IterableLike[El2, Repr2]): Tuple2Zipped[El1, Repr1, El2, Repr2] =
378+
new Tuple2Zipped((w(self), t2))
379+
380+
}
381+
382+
class Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](private val self: Tuple2Zipped[El1, Repr1, El2, Repr2]) {
383+
def lazyZip[El3, Repr3, T3](t3: T3)(implicit w3: T3 => IterableLike[El3, Repr3])
384+
: Tuple3Zipped[El1, Repr1, El2, Repr2, El3, Repr3] = {
385+
386+
new Tuple3Zipped((self.colls._1, self.colls._2, t3))
387+
}
388+
}
389+
364390
class MapViewExtensionMethods[K, V, C <: scala.collection.Map[K, V]](
365391
private val self: IterableView[(K, V), C])
366392
extends AnyVal {

compat/src/main/scala-2.12/scala/collection/compat/package.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ package scala.collection
1414

1515
import scala.collection.generic.{CanBuildFrom, GenericOrderedCompanion, IsTraversableLike}
1616
import scala.{collection => c}
17+
import scala.collection.{mutable => m}
18+
import scala.runtime.Tuple2Zipped
1719
import scala.collection.{immutable => i, mutable => m}
1820

21+
1922
package object compat extends compat.PackageShared {
2023
implicit class MutableTreeMapExtensions2(private val fact: m.TreeMap.type) extends AnyVal {
2124
def from[K: Ordering, V](source: TraversableOnce[(K, V)]): m.TreeMap[K, V] =
@@ -51,7 +54,17 @@ package object compat extends compat.PackageShared {
5154
implicit def toSeqExtensionMethods[A](self: c.Seq[A]): SeqExtensionMethods[A] =
5255
new SeqExtensionMethods[A](self)
5356

57+
implicit def toTrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self: T1)(
58+
implicit w1: T1 => TraversableLike[El1, Repr1])
59+
: TrulyTraversableLikeExtensionMethods[T1, El1, Repr1] =
60+
new TrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self)
61+
62+
implicit def toTuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self: Tuple2Zipped[El1, Repr1, El2, Repr2])
63+
: Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2] =
64+
new Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self)
65+
5466
implicit def toImmutableQueueExtensionMethods[A](
5567
self: i.Queue[A]): ImmutableQueueExtensionMethods[A] =
5668
new ImmutableQueueExtensionMethods[A](self)
5769
}
70+
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package test.scala.collection
2+
3+
import org.junit.Assert.assertEquals
4+
import org.junit.Test
5+
6+
import scala.collection.compat._
7+
8+
class LazyZipTest {
9+
10+
private val ws = List(1, 2, 3)
11+
private val xs = List(1, 2, 3, 4, 5, 6)
12+
private val ys = List("a", "b", "c", "d", "e", "f")
13+
private val zs = List(true, false, true, false, true, false)
14+
private val zipped2 = ws lazyZip xs
15+
private val zipped3 = ws lazyZip xs lazyZip ys
16+
private val zipped4 = ws lazyZip xs lazyZip ys lazyZip zs
17+
private val map = Map(1 -> "foo" , 2 -> "bar")
18+
19+
@Test
20+
def lazyZipTest(): Unit = {
21+
val res: List[(Int, Int)] = zipped2.map((a, b) => (a, b))
22+
assertEquals(List((1, 1), (2, 2), (3, 3)), res)
23+
}
24+
25+
@Test
26+
def lazyZip3_map(): Unit = {
27+
val res: List[(Int, Int, String)] = zipped3.map((a: Int, b: Int, c: String) => (a, b, c))
28+
assertEquals(List((1, 1, "a"), (2, 2, "b"), (3, 3, "c")), res)
29+
}
30+
31+
@Test
32+
def collectionValueIsNotEvaluated(): Unit = {
33+
val st = Stream.cons(1, throw new AssertionError("should not be evaluated"))
34+
ws.lazyZip(st)
35+
}
36+
37+
@Test
38+
def zip3collectionValueIsNotEvaluated(): Unit = {
39+
val st = Stream.cons(1, throw new AssertionError("should not be evaluated"))
40+
ws.lazyZip(st).lazyZip(st)
41+
}
42+
43+
}

0 commit comments

Comments
 (0)