Skip to content

Commit 396947e

Browse files
committed
tuple 2 & 3 for lazy zipped implementation
1 parent 1f591c4 commit 396947e

File tree

4 files changed

+83
-4
lines changed

4 files changed

+83
-4
lines changed

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

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

1515
import scala.collection.generic.{CanBuildFrom, GenericOrderedCompanion, IsTraversableLike}
16+
import scala.runtime.Tuple2Zipped
1617
import scala.{collection => c}
1718

1819
package object compat extends compat.PackageShared {
@@ -39,4 +40,13 @@ package object compat extends compat.PackageShared {
3940

4041
implicit def toSeqExtensionMethods[A](self: c.Seq[A]): SeqExtensionMethods[A] =
4142
new SeqExtensionMethods[A](self)
43+
44+
implicit def toTrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self: T1)(
45+
implicit w1: T1 => TraversableLike[El1, Repr1])
46+
: TrulyTraversableLikeExtensionMethods[T1, El1, Repr1] =
47+
new TrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self)
48+
49+
implicit def toTuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self: Tuple2Zipped[El1, Repr1, El2, Repr2])
50+
: Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2] =
51+
new Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self)
4252
}

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

Lines changed: 30 additions & 4 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 */
@@ -233,7 +242,7 @@ class IteratorExtensionMethods[A](private val self: c.Iterator[A]) extends AnyVa
233242
self.sameElements(that.iterator)
234243
}
235244
def concat[B >: A](that: c.TraversableOnce[B]): c.TraversableOnce[B] = self ++ that
236-
def tapEach[U](f: A => U): c.Iterator[A] = self.map(a => { f(a); a })
245+
def tapEach[U](f: A => U): c.Iterator[A] = self.map(a => { f(a); a })
237246
}
238247

239248
class TraversableOnceExtensionMethods[A](private val self: c.TraversableOnce[A]) extends AnyVal {
@@ -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 {
@@ -338,14 +348,30 @@ class TraversableLikeExtensionMethods[A, Repr](private val self: c.GenTraversabl
338348
val k = key(elem)
339349
val v = map.get(k) match {
340350
case Some(b) => reduce(b, f(elem))
341-
case None => f(elem)
351+
case None => f(elem)
342352
}
343353
map.put(k, v)
344354
}
345355
map.toMap
346356
}
347357
}
348358

359+
class TrulyTraversableLikeExtensionMethods[T1, El1, Repr1](private val self: T1) extends AnyVal {
360+
def lazyZip[El2, Repr2, T2](t2: T2)(
361+
implicit w: T1 => TraversableLike[El1, Repr1],
362+
w2: T2 => IterableLike[El2, Repr2]): Tuple2Zipped[El1, Repr1, El2, Repr2] =
363+
new Tuple2Zipped((w(self), t2))
364+
365+
}
366+
367+
class Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](private val self: Tuple2Zipped[El1, Repr1, El2, Repr2]) {
368+
def lazyZip[El3, Repr3, T3](t3: T3)(implicit w3: T3 => IterableLike[El3, Repr3])
369+
: Tuple3Zipped[El1, Repr1, El2, Repr2, El3, Repr3] = {
370+
371+
new Tuple3Zipped((self.colls._1, self.colls._2, t3))
372+
}
373+
}
374+
349375
class MapViewExtensionMethods[K, V, C <: scala.collection.Map[K, V]](
350376
private val self: IterableView[(K, V), C])
351377
extends AnyVal {

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ package scala.collection
1515
import scala.collection.generic.{CanBuildFrom, GenericOrderedCompanion, IsTraversableLike}
1616
import scala.{collection => c}
1717
import scala.collection.{mutable => m}
18+
import scala.runtime.Tuple2Zipped
1819

1920
package object compat extends compat.PackageShared {
2021
implicit class MutableTreeMapExtensions2(private val fact: m.TreeMap.type) extends AnyVal {
@@ -50,4 +51,14 @@ package object compat extends compat.PackageShared {
5051

5152
implicit def toSeqExtensionMethods[A](self: c.Seq[A]): SeqExtensionMethods[A] =
5253
new SeqExtensionMethods[A](self)
54+
55+
implicit def toTrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self: T1)(
56+
implicit w1: T1 => TraversableLike[El1, Repr1])
57+
: TrulyTraversableLikeExtensionMethods[T1, El1, Repr1] =
58+
new TrulyTraversableLikeExtensionMethods[T1, El1, Repr1](self)
59+
60+
implicit def toTuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self: Tuple2Zipped[El1, Repr1, El2, Repr2])
61+
: Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2] =
62+
new Tuple2ZippedExtensionMethods[El1, Repr1, El2, Repr2](self)
5363
}
64+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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+
22+
val res: List[(Int, Int)] = zipped2.map((a, b) => (a, b))
23+
assertEquals(List((1, 1), (2, 2), (3, 3)), res)
24+
}
25+
26+
@Test
27+
def lazyZip3_map(): Unit = {
28+
val res: List[(Int, Int, String)] = zipped3.map((a: Int, b: Int, c: String) => (a, b, c))
29+
30+
assertEquals(List((1, 1, "a"), (2, 2, "b"), (3, 3, "c")), res)
31+
}
32+
}

0 commit comments

Comments
 (0)