summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
Diffstat (limited to 'src/library')
-rw-r--r--src/library/scala/Tuple2.scala20
-rw-r--r--src/library/scala/collection/generic/TraversableClass.scala41
2 files changed, 55 insertions, 6 deletions
diff --git a/src/library/scala/Tuple2.scala b/src/library/scala/Tuple2.scala
index bcf30e58aa..7edea7db15 100644
--- a/src/library/scala/Tuple2.scala
+++ b/src/library/scala/Tuple2.scala
@@ -82,10 +82,22 @@ object Tuple2 {
/** Tuple2 is the canonical representation of a @see Product2
*
*/
-case class Tuple2[+T1, +T2](_1:T1,_2:T2)
- extends Product2[T1, T2]
-{
- override def toString() = "(" + _1 + "," + _2 + ")"
+case class Tuple2[+T1, +T2](_1:T1, _2:T2) extends Product2[T1, T2] {
+/*
+ def map[CC[X] <: Traversable[X], A1, A2, B](implicit fst: T1 => CC[A1], snd: T2 => Traversable[A2]) = (f: (A1, A2) => B) => {
+ val b = fst(_1).genericBuilder[B]
+ val it1 = _1.iterator
+ val it2 = _2.iterator
+ while (it1.hasNext && it2.hasNext)
+ b += f(it1.next, it2.next)
+ b.result
+ }
+*/
+ override def toString() = {
+ val sb = new StringBuilder
+ sb.append('(').append(_1).append(',').append(_2).append(')')
+ sb.toString
+ }
/** Swap the elements of the tuple */
def swap: Tuple2[T2,T1] = Tuple2(_2, _1)
diff --git a/src/library/scala/collection/generic/TraversableClass.scala b/src/library/scala/collection/generic/TraversableClass.scala
index c107bddd0d..04c61dc413 100644
--- a/src/library/scala/collection/generic/TraversableClass.scala
+++ b/src/library/scala/collection/generic/TraversableClass.scala
@@ -11,16 +11,53 @@
package scala.collection.generic
+import annotation.unchecked.uncheckedVariance
+
trait TraversableClass[+A, +CC[X] <: Traversable[X]] {
- /** The factory companion object that builds instances of class CC */
+ def foreach[U](f: A => U): Unit
+ def head: A
+ def isEmpty: Boolean
+ /** The factory companion object that builds instances of class CC */
def companion: Companion[CC]
- /** The builder that builds instances of CC[A] */
+ /** The builder that builds instances of CC[A] */
protected[this] def newBuilder: Builder[A, CC[A]] = companion.newBuilder[A]
/** The generic builder that builds instances of CC at arbitrary element types. */
def genericBuilder[B]: Builder[B, CC[B]] = companion.newBuilder[B]
+
+ def unzip[A1, A2](implicit toPair: A => (A1, A2)): (CC[A1], CC[A2]) = {
+ val b1 = genericBuilder[A1]
+ val b2 = genericBuilder[A2]
+ for (xy <- this) {
+ val (x, y) = toPair(xy)
+ b1 += x
+ b2 += y
+ }
+ (b1.result, b2.result)
+ }
+
+ def flatten[B](implicit toTraversable: A => Traversable[B]): CC[B] = {
+ val b = genericBuilder[B]
+ for (xs <- this)
+ b ++= toTraversable(xs)
+ b.result
+ }
+
+ def transpose[B](implicit toTraversable: A => Traversable[B]): CC[CC[B] @uncheckedVariance] = {
+ val bs: Array[Builder[B, CC[B]]] = head.map(_ => genericBuilder[B]).toArray
+ for (xs <- this) {
+ var i = 0
+ for (x <- toTraversable(xs)) {
+ bs(i) += x
+ i += 1
+ }
+ }
+ val bb = genericBuilder[CC[B]]
+ for (b <- bs) bb += b.result
+ bb.result
+ }
}