diff options
95 files changed, 390 insertions, 290 deletions
diff --git a/src/build/genprod.scala b/src/build/genprod.scala index 6849206f3c..08e907e99c 100644 --- a/src/build/genprod.scala +++ b/src/build/genprod.scala @@ -154,7 +154,11 @@ object FunctionOne extends Function(1) { */ def andThen[A](g: R => A): T1 => A = { x => g(apply(x)) } - /** Turns a function A => Option[B] into a PartialFunction[A, B]. + /** Turns a function A => Option[B] into a PartialFunction[A, B]. Important note: + * this transformation implies the original function will be called 2 or more + * times on each logical invocation, because the only way to supply an implementation + * of isDefinedAt is to call the function and examine the return value. + * * @see PartialFunction#lift * @return a partial function which is defined for those inputs * where this function returns Some(_) and undefined where @@ -273,8 +277,12 @@ trait {className}{contraCoArgs} extends AnyRef {{ self => T U P L E zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz */ -object Tuple -{ +object Tuple { + val zipImports = """ +import scala.collection.{ TraversableLike => TLike, IterableLike => ILike } +import scala.collection.generic.{ CanBuildFrom => CBF } +""" + def make(i: Int) = apply(i)() def apply(i: Int) = i match { case 1 => TupleOne @@ -291,26 +299,26 @@ object TupleOne extends Tuple(1) object TupleTwo extends Tuple(2) { - override def imports = """ -import scala.collection.{TraversableLike, IterableLike} -import scala.collection.generic.CanBuildFrom -""" + override def imports = Tuple.zipImports override def covariantSpecs = "@specialized(Int, Long, Double) " override def moreMethods = """ /** Swap the elements of the tuple */ def swap: Tuple2[T2,T1] = Tuple2(_2, _1) - def zip[Repr1, El1, El2, To](implicit w1: T1 => TraversableLike[El1, Repr1], + def zip[Repr1, El1, El2, To](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => Iterable[El2], - cbf1: CanBuildFrom[Repr1, (El1, El2), To]): To = { - val coll1: TraversableLike[El1, Repr1] = _1 + cbf1: CBF[Repr1, (El1, El2), To]): To = { + val coll1: TLike[El1, Repr1] = _1 val coll2: Iterable[El2] = _2 val b1 = cbf1(coll1.repr) val elems2 = coll2.iterator - for(el1 <- coll1) - if(elems2.hasNext) + for (el1 <- coll1) { + if (elems2.hasNext) b1 += ((el1, elems2.next)) + else + return b1.result + } b1.result } @@ -320,104 +328,108 @@ import scala.collection.generic.CanBuildFrom * @see Zipped * $willNotTerminateInf */ - def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TraversableLike[El1, Repr1], w2: T2 => IterableLike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2] + def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => ILike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2] = new Zipped[Repr1, El1, Repr2, El2](_1, _2) - class Zipped[+Repr1, +El1, +Repr2, +El2](coll1: TraversableLike[El1, Repr1], coll2: IterableLike[El2, Repr2]) { // coll2: IterableLike for filter - def map[B, To](f: (El1, El2) => B)(implicit cbf: CanBuildFrom[Repr1, B, To]): To = { + class Zipped[+Repr1, +El1, +Repr2, +El2](coll1: TLike[El1, Repr1], coll2: ILike[El2, Repr2]) { // coll2: ILike for filter + def map[B, To](f: (El1, El2) => B)(implicit cbf: CBF[Repr1, B, To]): To = { val b = cbf(coll1.repr) b.sizeHint(coll1) val elems2 = coll2.iterator - for(el1 <- coll1) - if(elems2.hasNext) - b += f(el1, elems2.next) + for (el1 <- coll1) { + if (elems2.hasNext) + b += f(el1, elems2.next) + else + return b.result + } b.result } - def flatMap[B, To](f: (El1, El2) => Traversable[B])(implicit cbf: CanBuildFrom[Repr1, B, To]): To = { + def flatMap[B, To](f: (El1, El2) => Traversable[B])(implicit cbf: CBF[Repr1, B, To]): To = { val b = cbf(coll1.repr) val elems2 = coll2.iterator - for(el1 <- coll1) - if(elems2.hasNext) - b ++= f(el1, elems2.next) + for (el1 <- coll1) { + if (elems2.hasNext) + b ++= f(el1, elems2.next) + else + return b.result + } b.result } - def filter[To1, To2](f: (El1, El2) => Boolean)(implicit cbf1: CanBuildFrom[Repr1, El1, To1], cbf2: CanBuildFrom[Repr2, El2, To2]): (To1, To2) = { + def filter[To1, To2](f: (El1, El2) => Boolean)(implicit cbf1: CBF[Repr1, El1, To1], cbf2: CBF[Repr2, El2, To2]): (To1, To2) = { val b1 = cbf1(coll1.repr) val b2 = cbf2(coll2.repr) val elems2 = coll2.iterator - for(el1 <- coll1) { - if(elems2.hasNext) { + for (el1 <- coll1) { + if (elems2.hasNext) { val el2 = elems2.next - if(f(el1, el2)) { + if (f(el1, el2)) { b1 += el1 b2 += el2 } } + else return (b1.result, b2.result) } (b1.result, b2.result) } def exists(f: (El1, El2) => Boolean): Boolean = { - var acc = false val elems2 = coll2.iterator - for(el1 <- coll1) - if(!acc && elems2.hasNext) - acc = f(el1, elems2.next) - - acc + for (el1 <- coll1) { + if (elems2.hasNext) { + if (f(el1, elems2.next)) + return true + } + else return false + } + false } - def forall(f: (El1, El2) => Boolean): Boolean = { - var acc = true - val elems2 = coll2.iterator - - for(el1 <- coll1) - if(acc && elems2.hasNext) - acc = f(el1, elems2.next) - - acc - } + def forall(f: (El1, El2) => Boolean): Boolean = + !exists((x, y) => !f(x, y)) def foreach[U](f: (El1, El2) => U): Unit = { val elems2 = coll2.iterator - for(el1 <- coll1) - if(elems2.hasNext) - f(el1, elems2.next) + for (el1 <- coll1) { + if (elems2.hasNext) + f(el1, elems2.next) + else + return + } } } """ } object TupleThree extends Tuple(3) { - override def imports = """ -import scala.collection.{TraversableLike, IterableLike} -import scala.collection.generic.CanBuildFrom -""" + override def imports = Tuple.zipImports override def moreMethods = """ - def zip[Repr1, El1, El2, El3, To](implicit w1: T1 => TraversableLike[El1, Repr1], + def zip[Repr1, El1, El2, El3, To](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => Iterable[El2], w3: T3 => Iterable[El3], - cbf1: CanBuildFrom[Repr1, (El1, El2, El3), To]): To = { - val coll1: TraversableLike[El1, Repr1] = _1 + cbf1: CBF[Repr1, (El1, El2, El3), To]): To = { + val coll1: TLike[El1, Repr1] = _1 val coll2: Iterable[El2] = _2 val coll3: Iterable[El3] = _3 val b1 = cbf1(coll1.repr) val elems2 = coll2.iterator val elems3 = coll3.iterator - for(el1 <- coll1) - if(elems2.hasNext && elems3.hasNext) + for (el1 <- coll1) { + if (elems2.hasNext && elems3.hasNext) b1 += ((el1, elems2.next, elems3.next)) + else + return b1.result + } b1.result } @@ -427,94 +439,108 @@ import scala.collection.generic.CanBuildFrom * @see Zipped * $willNotTerminateInf */ - def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 => TraversableLike[El1, Repr1], - w2: T2 => IterableLike[El2, Repr2], - w3: T3 => IterableLike[El3, Repr3]): Zipped[Repr1, El1, Repr2, El2, Repr3, El3] + def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 => TLike[El1, Repr1], + w2: T2 => ILike[El2, Repr2], + w3: T3 => ILike[El3, Repr3]): Zipped[Repr1, El1, Repr2, El2, Repr3, El3] = new Zipped[Repr1, El1, Repr2, El2, Repr3, El3](_1, _2, _3) - class Zipped[+Repr1, +El1, +Repr2, +El2, +Repr3, +El3](coll1: TraversableLike[El1, Repr1], - coll2: IterableLike[El2, Repr2], - coll3: IterableLike[El3, Repr3]) { - def map[B, To](f: (El1, El2, El3) => B)(implicit cbf: CanBuildFrom[Repr1, B, To]): To = { - val b = cbf(coll1.repr) - val elems2 = coll2.iterator - val elems3 = coll3.iterator - - for(el1 <- coll1) - if(elems2.hasNext && elems3.hasNext) - b += f(el1, elems2.next, elems3.next) + class Zipped[+Repr1, +El1, +Repr2, +El2, +Repr3, +El3](coll1: TLike[El1, Repr1], + coll2: ILike[El2, Repr2], + coll3: ILike[El3, Repr3]) { + def map[B, To](f: (El1, El2, El3) => B)(implicit cbf: CBF[Repr1, B, To]): To = { + val b = cbf(coll1.repr) + val elems2 = coll2.iterator + val elems3 = coll3.iterator - b.result + for (el1 <- coll1) { + if (elems2.hasNext && elems3.hasNext) + b += f(el1, elems2.next, elems3.next) + else + return b.result + } + b.result } - def flatMap[B, To](f: (El1, El2, El3) => Traversable[B])(implicit cbf: CanBuildFrom[Repr1, B, To]): To = { + def flatMap[B, To](f: (El1, El2, El3) => Traversable[B])(implicit cbf: CBF[Repr1, B, To]): To = { val b = cbf(coll1.repr) val elems2 = coll2.iterator val elems3 = coll3.iterator - for(el1 <- coll1) - if(elems2.hasNext && elems3.hasNext) - b ++= f(el1, elems2.next, elems3.next) - + for (el1 <- coll1) { + if (elems2.hasNext && elems3.hasNext) + b ++= f(el1, elems2.next, elems3.next) + else + return b.result + } b.result } def filter[To1, To2, To3](f: (El1, El2, El3) => Boolean)( - implicit cbf1: CanBuildFrom[Repr1, El1, To1], - cbf2: CanBuildFrom[Repr2, El2, To2], - cbf3: CanBuildFrom[Repr3, El3, To3]): (To1, To2, To3) = { + implicit cbf1: CBF[Repr1, El1, To1], + cbf2: CBF[Repr2, El2, To2], + cbf3: CBF[Repr3, El3, To3]): (To1, To2, To3) = { val b1 = cbf1(coll1.repr) val b2 = cbf2(coll2.repr) val b3 = cbf3(coll3.repr) val elems2 = coll2.iterator val elems3 = coll3.iterator + def result = (b1.result, b2.result, b3.result) for(el1 <- coll1) { - if(elems2.hasNext && elems3.hasNext) { + if (elems2.hasNext && elems3.hasNext) { val el2 = elems2.next val el3 = elems3.next - if(f(el1, el2, el3)) { + + if (f(el1, el2, el3)) { b1 += el1 b2 += el2 b3 += el3 } } + else return result } - (b1.result, b2.result, b3.result) + result } def exists(f: (El1, El2, El3) => Boolean): Boolean = { - var acc = false val elems2 = coll2.iterator val elems3 = coll3.iterator - for(el1 <- coll1) - if(!acc && elems2.hasNext && elems3.hasNext) - acc = f(el1, elems2.next, elems3.next) - - acc + for (el1 <- coll1) { + if (elems2.hasNext && elems3.hasNext) { + if (f(el1, elems2.next, elems3.next)) + return true + } + else return false + } + false } - def forall(f: (El1, El2, El3) => Boolean): Boolean = { - var acc = true - val elems2 = coll2.iterator - val elems3 = coll3.iterator + def forall(f: (El1, El2, El3) => Boolean): Boolean = + !exists((x, y, z) => !f(x, y, z)) - for(el1 <- coll1) - if(acc && elems2.hasNext && elems3.hasNext) - acc = f(el1, elems2.next, elems3.next) + def foreach[U](f: (El1, El2) => U): Unit = { + val elems2 = coll2.iterator - acc + for (el1 <- coll1) { + if (elems2.hasNext) + f(el1, elems2.next) + else + return + } } def foreach[U](f: (El1, El2, El3) => U): Unit = { val elems2 = coll2.iterator val elems3 = coll3.iterator - for(el1 <- coll1) - if(elems2.hasNext && elems3.hasNext) - f(el1, elems2.next, elems3.next) + for (el1 <- coll1) { + if (elems2.hasNext && elems3.hasNext) + f(el1, elems2.next, elems3.next) + else + return + } } } """ diff --git a/src/library/scala/Function0.scala b/src/library/scala/Function0.scala index af51ca8851..09347783ef 100644 --- a/src/library/scala/Function0.scala +++ b/src/library/scala/Function0.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with fancy comment) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with fancy comment) package scala diff --git a/src/library/scala/Function1.scala b/src/library/scala/Function1.scala index beac376f4e..38b84025b9 100644 --- a/src/library/scala/Function1.scala +++ b/src/library/scala/Function1.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with fancy comment) (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with fancy comment) (with extra methods) package scala @@ -62,4 +62,5 @@ trait Function1[@specialized(scala.Int, scala.Long, scala.Float, scala.Double) - def isDefinedAt(x: T1): Boolean = Function1.this.apply(x).isDefined override def lift = Function1.this.asInstanceOf[T1 => Option[R1]] } + } diff --git a/src/library/scala/Function10.scala b/src/library/scala/Function10.scala index 11d73d704f..64c5607505 100644 --- a/src/library/scala/Function10.scala +++ b/src/library/scala/Function10.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function11.scala b/src/library/scala/Function11.scala index f4f5102c3e..18564bdc68 100644 --- a/src/library/scala/Function11.scala +++ b/src/library/scala/Function11.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function12.scala b/src/library/scala/Function12.scala index d952f571c7..b669f18e8b 100644 --- a/src/library/scala/Function12.scala +++ b/src/library/scala/Function12.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function13.scala b/src/library/scala/Function13.scala index 4f05319331..1a6da81a57 100644 --- a/src/library/scala/Function13.scala +++ b/src/library/scala/Function13.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function14.scala b/src/library/scala/Function14.scala index eb17a7ab86..85a069f1aa 100644 --- a/src/library/scala/Function14.scala +++ b/src/library/scala/Function14.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function15.scala b/src/library/scala/Function15.scala index 3dc448f816..cdde24a450 100644 --- a/src/library/scala/Function15.scala +++ b/src/library/scala/Function15.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function16.scala b/src/library/scala/Function16.scala index 567fd02c7a..4f4806a9cf 100644 --- a/src/library/scala/Function16.scala +++ b/src/library/scala/Function16.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function17.scala b/src/library/scala/Function17.scala index 87c956dc90..44676996aa 100644 --- a/src/library/scala/Function17.scala +++ b/src/library/scala/Function17.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function18.scala b/src/library/scala/Function18.scala index c876413e11..6f74fd69c0 100644 --- a/src/library/scala/Function18.scala +++ b/src/library/scala/Function18.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function19.scala b/src/library/scala/Function19.scala index 4b96cdd245..f200fd6db1 100644 --- a/src/library/scala/Function19.scala +++ b/src/library/scala/Function19.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function2.scala b/src/library/scala/Function2.scala index fdc44fc647..545bbb151d 100644 --- a/src/library/scala/Function2.scala +++ b/src/library/scala/Function2.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with fancy comment) (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with fancy comment) (with extra methods) package scala diff --git a/src/library/scala/Function20.scala b/src/library/scala/Function20.scala index d1cb6d2894..0a99abd4ec 100644 --- a/src/library/scala/Function20.scala +++ b/src/library/scala/Function20.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function21.scala b/src/library/scala/Function21.scala index c0aecc7c3e..9f99cc0966 100644 --- a/src/library/scala/Function21.scala +++ b/src/library/scala/Function21.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function22.scala b/src/library/scala/Function22.scala index 6fa78b94f0..6ddf1140e9 100644 --- a/src/library/scala/Function22.scala +++ b/src/library/scala/Function22.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function3.scala b/src/library/scala/Function3.scala index 58ad87c026..62369583df 100644 --- a/src/library/scala/Function3.scala +++ b/src/library/scala/Function3.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function4.scala b/src/library/scala/Function4.scala index 2fbf49d424..0ff2595615 100644 --- a/src/library/scala/Function4.scala +++ b/src/library/scala/Function4.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function5.scala b/src/library/scala/Function5.scala index 27a55238e7..c2442b2dbf 100644 --- a/src/library/scala/Function5.scala +++ b/src/library/scala/Function5.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function6.scala b/src/library/scala/Function6.scala index d2d0925f3a..d4f72f68eb 100644 --- a/src/library/scala/Function6.scala +++ b/src/library/scala/Function6.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function7.scala b/src/library/scala/Function7.scala index 98b6a6501e..c48f9112ff 100644 --- a/src/library/scala/Function7.scala +++ b/src/library/scala/Function7.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function8.scala b/src/library/scala/Function8.scala index 92ab40606e..bfc57942e1 100644 --- a/src/library/scala/Function8.scala +++ b/src/library/scala/Function8.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Function9.scala b/src/library/scala/Function9.scala index 7b9317190d..af04539fb9 100644 --- a/src/library/scala/Function9.scala +++ b/src/library/scala/Function9.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala index 973e54fa43..bd8f6b6822 100644 --- a/src/library/scala/Predef.scala +++ b/src/library/scala/Predef.scala @@ -10,9 +10,10 @@ package scala -import collection.immutable.StringOps -import collection.mutable.ArrayOps -import collection.generic.CanBuildFrom +import scala.collection.{ mutable, immutable, generic } +import immutable.StringOps +import mutable.ArrayOps +import generic.CanBuildFrom import annotation.elidable import annotation.elidable.ASSERTION @@ -35,10 +36,10 @@ object Predef extends LowPriorityImplicits { type Function[-A, +B] = Function1[A, B] - type Map[A, +B] = collection.immutable.Map[A, B] - type Set[A] = collection.immutable.Set[A] - val Map = collection.immutable.Map - val Set = collection.immutable.Set + type Map[A, +B] = immutable.Map[A, B] + type Set[A] = immutable.Set[A] + val Map = immutable.Map + val Set = immutable.Set type Manifest[T] = scala.reflect.Manifest[T] type ClassManifest[T] = scala.reflect.ClassManifest[T] @@ -209,6 +210,18 @@ object Predef extends LowPriorityImplicits { implicit def exceptionWrapper(exc: Throwable) = new runtime.RichException(exc) + // tuple zip views + + implicit def zipped2ToTraversable[El1, El2](zz: Tuple2[_, _]#Zipped[_, El1, _, El2]): Traversable[(El1, El2)] = + new Traversable[(El1, El2)] { + def foreach[U](f: ((El1, El2)) => U): Unit = zz foreach Function.untupled(f) + } + + implicit def zipped3ToTraversable[El1, El2, El3](zz: Tuple3[_, _, _]#Zipped[_, El1, _, El2, _, El3]): Traversable[(El1, El2, El3)] = + new Traversable[(El1, El2, El3)] { + def foreach[U](f: ((El1, El2, El3)) => U): Unit = zz foreach Function.untupled(f) + } + implicit def genericArrayOps[T](xs: Array[T]): ArrayOps[T] = (xs: AnyRef) match { // !!! drop the AnyRef and get unreachable code errors! case x: Array[AnyRef] => refArrayOps[AnyRef](x).asInstanceOf[ArrayOps[T]] case x: Array[Int] => intArrayOps(x).asInstanceOf[ArrayOps[T]] @@ -290,7 +303,7 @@ object Predef extends LowPriorityImplicits { implicit def stringCanBuildFrom: CanBuildFrom[String, Char, String] = new CanBuildFrom[String, Char, String] { def apply(from: String) = apply() - def apply() = scala.collection.mutable.StringBuilder.newBuilder + def apply() = StringBuilder.newBuilder } implicit def seqToCharSequence(xs: collection.IndexedSeq[Char]): CharSequence = new CharSequence { @@ -320,7 +333,7 @@ object Predef extends LowPriorityImplicits { * in part contributed by Jason Zaugg */ sealed abstract class <:<[-From, +To] extends (From => To) - implicit def conforms[A]: A <:< A = new (A <:< A) {def apply(x: A) = x} + implicit def conforms[A]: A <:< A = new (A <:< A) { def apply(x: A) = x } // not in the <:< companion object because it is also intended to subsume identity (which is no longer implicit) /** An instance of `A =:= B` witnesses that the types `A` and `B` are equal. diff --git a/src/library/scala/Product1.scala b/src/library/scala/Product1.scala index 2199de22ba..d257b44447 100644 --- a/src/library/scala/Product1.scala +++ b/src/library/scala/Product1.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product10.scala b/src/library/scala/Product10.scala index d2f6de3775..6a9feab70e 100644 --- a/src/library/scala/Product10.scala +++ b/src/library/scala/Product10.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product11.scala b/src/library/scala/Product11.scala index 3f685b11a3..604bf8382d 100644 --- a/src/library/scala/Product11.scala +++ b/src/library/scala/Product11.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product12.scala b/src/library/scala/Product12.scala index fa926f7816..7781d4e84f 100644 --- a/src/library/scala/Product12.scala +++ b/src/library/scala/Product12.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product13.scala b/src/library/scala/Product13.scala index 75d346e3ec..b75077c811 100644 --- a/src/library/scala/Product13.scala +++ b/src/library/scala/Product13.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product14.scala b/src/library/scala/Product14.scala index c933518260..bf1014adc6 100644 --- a/src/library/scala/Product14.scala +++ b/src/library/scala/Product14.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product15.scala b/src/library/scala/Product15.scala index 4a24391dc0..9436a5434b 100644 --- a/src/library/scala/Product15.scala +++ b/src/library/scala/Product15.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product16.scala b/src/library/scala/Product16.scala index 053e1ab3e6..cb657617e7 100644 --- a/src/library/scala/Product16.scala +++ b/src/library/scala/Product16.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product17.scala b/src/library/scala/Product17.scala index 118a10163f..a4caf476b1 100644 --- a/src/library/scala/Product17.scala +++ b/src/library/scala/Product17.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product18.scala b/src/library/scala/Product18.scala index b36c947b0f..47cafe5286 100644 --- a/src/library/scala/Product18.scala +++ b/src/library/scala/Product18.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product19.scala b/src/library/scala/Product19.scala index 1c5d58208c..9ca00034e0 100644 --- a/src/library/scala/Product19.scala +++ b/src/library/scala/Product19.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product2.scala b/src/library/scala/Product2.scala index 0fc6bc40d6..720fb1d08e 100644 --- a/src/library/scala/Product2.scala +++ b/src/library/scala/Product2.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product20.scala b/src/library/scala/Product20.scala index 47864978b1..02777fc127 100644 --- a/src/library/scala/Product20.scala +++ b/src/library/scala/Product20.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product21.scala b/src/library/scala/Product21.scala index c53a944886..d784e80ba1 100644 --- a/src/library/scala/Product21.scala +++ b/src/library/scala/Product21.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product22.scala b/src/library/scala/Product22.scala index 02279303cd..208f3d2912 100644 --- a/src/library/scala/Product22.scala +++ b/src/library/scala/Product22.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product3.scala b/src/library/scala/Product3.scala index eb1ac7997c..c695b2c6c5 100644 --- a/src/library/scala/Product3.scala +++ b/src/library/scala/Product3.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product4.scala b/src/library/scala/Product4.scala index 582028f2e0..d26e2a54e8 100644 --- a/src/library/scala/Product4.scala +++ b/src/library/scala/Product4.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product5.scala b/src/library/scala/Product5.scala index 3f55bb109f..42bc69b8c3 100644 --- a/src/library/scala/Product5.scala +++ b/src/library/scala/Product5.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product6.scala b/src/library/scala/Product6.scala index 4d17b5cc42..a24268ecd7 100644 --- a/src/library/scala/Product6.scala +++ b/src/library/scala/Product6.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product7.scala b/src/library/scala/Product7.scala index 4f3e401da4..a295a24c78 100644 --- a/src/library/scala/Product7.scala +++ b/src/library/scala/Product7.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product8.scala b/src/library/scala/Product8.scala index 5ed5f178b7..a7ee297bef 100644 --- a/src/library/scala/Product8.scala +++ b/src/library/scala/Product8.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Product9.scala b/src/library/scala/Product9.scala index 62e4586d80..c0e5d64142 100644 --- a/src/library/scala/Product9.scala +++ b/src/library/scala/Product9.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple1.scala b/src/library/scala/Tuple1.scala index 02ff079c7d..698173948b 100644 --- a/src/library/scala/Tuple1.scala +++ b/src/library/scala/Tuple1.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple10.scala b/src/library/scala/Tuple10.scala index f8c1e20da9..5fafadc526 100644 --- a/src/library/scala/Tuple10.scala +++ b/src/library/scala/Tuple10.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple11.scala b/src/library/scala/Tuple11.scala index b655f67f23..f33460c90b 100644 --- a/src/library/scala/Tuple11.scala +++ b/src/library/scala/Tuple11.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple12.scala b/src/library/scala/Tuple12.scala index f99a6795d6..8df5601426 100644 --- a/src/library/scala/Tuple12.scala +++ b/src/library/scala/Tuple12.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple13.scala b/src/library/scala/Tuple13.scala index 064f2d6352..3c4b6bdeac 100644 --- a/src/library/scala/Tuple13.scala +++ b/src/library/scala/Tuple13.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple14.scala b/src/library/scala/Tuple14.scala index fa021dc1c7..f16b46cce9 100644 --- a/src/library/scala/Tuple14.scala +++ b/src/library/scala/Tuple14.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple15.scala b/src/library/scala/Tuple15.scala index 6e4184c750..503f131165 100644 --- a/src/library/scala/Tuple15.scala +++ b/src/library/scala/Tuple15.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple16.scala b/src/library/scala/Tuple16.scala index fcf2d010bf..46398884ee 100644 --- a/src/library/scala/Tuple16.scala +++ b/src/library/scala/Tuple16.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple17.scala b/src/library/scala/Tuple17.scala index f14c9e1554..63516930fe 100644 --- a/src/library/scala/Tuple17.scala +++ b/src/library/scala/Tuple17.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple18.scala b/src/library/scala/Tuple18.scala index 62cb68e154..aacc6db44a 100644 --- a/src/library/scala/Tuple18.scala +++ b/src/library/scala/Tuple18.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple19.scala b/src/library/scala/Tuple19.scala index 22ada79d0d..3ff60e5fea 100644 --- a/src/library/scala/Tuple19.scala +++ b/src/library/scala/Tuple19.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple2.scala b/src/library/scala/Tuple2.scala index 9948206329..460dd0e6aa 100644 --- a/src/library/scala/Tuple2.scala +++ b/src/library/scala/Tuple2.scala @@ -7,12 +7,12 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala -import scala.collection.{TraversableLike, IterableLike} -import scala.collection.generic.CanBuildFrom +import scala.collection.{ TraversableLike => TLike, IterableLike => ILike } +import scala.collection.generic.{ CanBuildFrom => CBF } @@ -28,17 +28,20 @@ case class Tuple2[@specialized(Int, Long, Double) +T1, @specialized(Int, Long, D /** Swap the elements of the tuple */ def swap: Tuple2[T2,T1] = Tuple2(_2, _1) - def zip[Repr1, El1, El2, To](implicit w1: T1 => TraversableLike[El1, Repr1], + def zip[Repr1, El1, El2, To](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => Iterable[El2], - cbf1: CanBuildFrom[Repr1, (El1, El2), To]): To = { - val coll1: TraversableLike[El1, Repr1] = _1 + cbf1: CBF[Repr1, (El1, El2), To]): To = { + val coll1: TLike[El1, Repr1] = _1 val coll2: Iterable[El2] = _2 val b1 = cbf1(coll1.repr) val elems2 = coll2.iterator - for(el1 <- coll1) - if(elems2.hasNext) + for (el1 <- coll1) { + if (elems2.hasNext) b1 += ((el1, elems2.next)) + else + return b1.result + } b1.result } @@ -48,79 +51,83 @@ case class Tuple2[@specialized(Int, Long, Double) +T1, @specialized(Int, Long, D * @see Zipped * $willNotTerminateInf */ - def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TraversableLike[El1, Repr1], w2: T2 => IterableLike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2] + def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => ILike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2] = new Zipped[Repr1, El1, Repr2, El2](_1, _2) - class Zipped[+Repr1, +El1, +Repr2, +El2](coll1: TraversableLike[El1, Repr1], coll2: IterableLike[El2, Repr2]) { // coll2: IterableLike for filter - def map[B, To](f: (El1, El2) => B)(implicit cbf: CanBuildFrom[Repr1, B, To]): To = { + class Zipped[+Repr1, +El1, +Repr2, +El2](coll1: TLike[El1, Repr1], coll2: ILike[El2, Repr2]) { // coll2: ILike for filter + def map[B, To](f: (El1, El2) => B)(implicit cbf: CBF[Repr1, B, To]): To = { val b = cbf(coll1.repr) b.sizeHint(coll1) val elems2 = coll2.iterator - for(el1 <- coll1) - if(elems2.hasNext) - b += f(el1, elems2.next) + for (el1 <- coll1) { + if (elems2.hasNext) + b += f(el1, elems2.next) + else + return b.result + } b.result } - def flatMap[B, To](f: (El1, El2) => Traversable[B])(implicit cbf: CanBuildFrom[Repr1, B, To]): To = { + def flatMap[B, To](f: (El1, El2) => Traversable[B])(implicit cbf: CBF[Repr1, B, To]): To = { val b = cbf(coll1.repr) val elems2 = coll2.iterator - for(el1 <- coll1) - if(elems2.hasNext) - b ++= f(el1, elems2.next) + for (el1 <- coll1) { + if (elems2.hasNext) + b ++= f(el1, elems2.next) + else + return b.result + } b.result } - def filter[To1, To2](f: (El1, El2) => Boolean)(implicit cbf1: CanBuildFrom[Repr1, El1, To1], cbf2: CanBuildFrom[Repr2, El2, To2]): (To1, To2) = { + def filter[To1, To2](f: (El1, El2) => Boolean)(implicit cbf1: CBF[Repr1, El1, To1], cbf2: CBF[Repr2, El2, To2]): (To1, To2) = { val b1 = cbf1(coll1.repr) val b2 = cbf2(coll2.repr) val elems2 = coll2.iterator - for(el1 <- coll1) { - if(elems2.hasNext) { + for (el1 <- coll1) { + if (elems2.hasNext) { val el2 = elems2.next - if(f(el1, el2)) { + if (f(el1, el2)) { b1 += el1 b2 += el2 } } + else return (b1.result, b2.result) } (b1.result, b2.result) } def exists(f: (El1, El2) => Boolean): Boolean = { - var acc = false val elems2 = coll2.iterator - for(el1 <- coll1) - if(!acc && elems2.hasNext) - acc = f(el1, elems2.next) - - acc + for (el1 <- coll1) { + if (elems2.hasNext) { + if (f(el1, elems2.next)) + return true + } + else return false + } + false } - def forall(f: (El1, El2) => Boolean): Boolean = { - var acc = true - val elems2 = coll2.iterator - - for(el1 <- coll1) - if(acc && elems2.hasNext) - acc = f(el1, elems2.next) - - acc - } + def forall(f: (El1, El2) => Boolean): Boolean = + !exists((x, y) => !f(x, y)) def foreach[U](f: (El1, El2) => U): Unit = { val elems2 = coll2.iterator - for(el1 <- coll1) - if(elems2.hasNext) - f(el1, elems2.next) + for (el1 <- coll1) { + if (elems2.hasNext) + f(el1, elems2.next) + else + return + } } } diff --git a/src/library/scala/Tuple20.scala b/src/library/scala/Tuple20.scala index ed26f3d8ce..3affc1fdf9 100644 --- a/src/library/scala/Tuple20.scala +++ b/src/library/scala/Tuple20.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple21.scala b/src/library/scala/Tuple21.scala index 3242c86ebf..26c72f1a83 100644 --- a/src/library/scala/Tuple21.scala +++ b/src/library/scala/Tuple21.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple22.scala b/src/library/scala/Tuple22.scala index 4fbe298483..05fbefb7fb 100644 --- a/src/library/scala/Tuple22.scala +++ b/src/library/scala/Tuple22.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple3.scala b/src/library/scala/Tuple3.scala index 47d6bfac22..876475c2e3 100644 --- a/src/library/scala/Tuple3.scala +++ b/src/library/scala/Tuple3.scala @@ -7,12 +7,12 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 (with extra methods) +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 (with extra methods) package scala -import scala.collection.{TraversableLike, IterableLike} -import scala.collection.generic.CanBuildFrom +import scala.collection.{ TraversableLike => TLike, IterableLike => ILike } +import scala.collection.generic.{ CanBuildFrom => CBF } @@ -25,20 +25,23 @@ case class Tuple3[+T1, +T2, +T3](_1:T1,_2:T2,_3:T3) { override def toString() = "(" + _1 + "," + _2 + "," + _3 + ")" - def zip[Repr1, El1, El2, El3, To](implicit w1: T1 => TraversableLike[El1, Repr1], + def zip[Repr1, El1, El2, El3, To](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => Iterable[El2], w3: T3 => Iterable[El3], - cbf1: CanBuildFrom[Repr1, (El1, El2, El3), To]): To = { - val coll1: TraversableLike[El1, Repr1] = _1 + cbf1: CBF[Repr1, (El1, El2, El3), To]): To = { + val coll1: TLike[El1, Repr1] = _1 val coll2: Iterable[El2] = _2 val coll3: Iterable[El3] = _3 val b1 = cbf1(coll1.repr) val elems2 = coll2.iterator val elems3 = coll3.iterator - for(el1 <- coll1) - if(elems2.hasNext && elems3.hasNext) + for (el1 <- coll1) { + if (elems2.hasNext && elems3.hasNext) b1 += ((el1, elems2.next, elems3.next)) + else + return b1.result + } b1.result } @@ -48,94 +51,108 @@ case class Tuple3[+T1, +T2, +T3](_1:T1,_2:T2,_3:T3) * @see Zipped * $willNotTerminateInf */ - def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 => TraversableLike[El1, Repr1], - w2: T2 => IterableLike[El2, Repr2], - w3: T3 => IterableLike[El3, Repr3]): Zipped[Repr1, El1, Repr2, El2, Repr3, El3] + def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 => TLike[El1, Repr1], + w2: T2 => ILike[El2, Repr2], + w3: T3 => ILike[El3, Repr3]): Zipped[Repr1, El1, Repr2, El2, Repr3, El3] = new Zipped[Repr1, El1, Repr2, El2, Repr3, El3](_1, _2, _3) - class Zipped[+Repr1, +El1, +Repr2, +El2, +Repr3, +El3](coll1: TraversableLike[El1, Repr1], - coll2: IterableLike[El2, Repr2], - coll3: IterableLike[El3, Repr3]) { - def map[B, To](f: (El1, El2, El3) => B)(implicit cbf: CanBuildFrom[Repr1, B, To]): To = { - val b = cbf(coll1.repr) - val elems2 = coll2.iterator - val elems3 = coll3.iterator - - for(el1 <- coll1) - if(elems2.hasNext && elems3.hasNext) - b += f(el1, elems2.next, elems3.next) + class Zipped[+Repr1, +El1, +Repr2, +El2, +Repr3, +El3](coll1: TLike[El1, Repr1], + coll2: ILike[El2, Repr2], + coll3: ILike[El3, Repr3]) { + def map[B, To](f: (El1, El2, El3) => B)(implicit cbf: CBF[Repr1, B, To]): To = { + val b = cbf(coll1.repr) + val elems2 = coll2.iterator + val elems3 = coll3.iterator - b.result + for (el1 <- coll1) { + if (elems2.hasNext && elems3.hasNext) + b += f(el1, elems2.next, elems3.next) + else + return b.result + } + b.result } - def flatMap[B, To](f: (El1, El2, El3) => Traversable[B])(implicit cbf: CanBuildFrom[Repr1, B, To]): To = { + def flatMap[B, To](f: (El1, El2, El3) => Traversable[B])(implicit cbf: CBF[Repr1, B, To]): To = { val b = cbf(coll1.repr) val elems2 = coll2.iterator val elems3 = coll3.iterator - for(el1 <- coll1) - if(elems2.hasNext && elems3.hasNext) - b ++= f(el1, elems2.next, elems3.next) - + for (el1 <- coll1) { + if (elems2.hasNext && elems3.hasNext) + b ++= f(el1, elems2.next, elems3.next) + else + return b.result + } b.result } def filter[To1, To2, To3](f: (El1, El2, El3) => Boolean)( - implicit cbf1: CanBuildFrom[Repr1, El1, To1], - cbf2: CanBuildFrom[Repr2, El2, To2], - cbf3: CanBuildFrom[Repr3, El3, To3]): (To1, To2, To3) = { + implicit cbf1: CBF[Repr1, El1, To1], + cbf2: CBF[Repr2, El2, To2], + cbf3: CBF[Repr3, El3, To3]): (To1, To2, To3) = { val b1 = cbf1(coll1.repr) val b2 = cbf2(coll2.repr) val b3 = cbf3(coll3.repr) val elems2 = coll2.iterator val elems3 = coll3.iterator + def result = (b1.result, b2.result, b3.result) for(el1 <- coll1) { - if(elems2.hasNext && elems3.hasNext) { + if (elems2.hasNext && elems3.hasNext) { val el2 = elems2.next val el3 = elems3.next - if(f(el1, el2, el3)) { + + if (f(el1, el2, el3)) { b1 += el1 b2 += el2 b3 += el3 } } + else return result } - (b1.result, b2.result, b3.result) + result } def exists(f: (El1, El2, El3) => Boolean): Boolean = { - var acc = false val elems2 = coll2.iterator val elems3 = coll3.iterator - for(el1 <- coll1) - if(!acc && elems2.hasNext && elems3.hasNext) - acc = f(el1, elems2.next, elems3.next) - - acc + for (el1 <- coll1) { + if (elems2.hasNext && elems3.hasNext) { + if (f(el1, elems2.next, elems3.next)) + return true + } + else return false + } + false } - def forall(f: (El1, El2, El3) => Boolean): Boolean = { - var acc = true - val elems2 = coll2.iterator - val elems3 = coll3.iterator + def forall(f: (El1, El2, El3) => Boolean): Boolean = + !exists((x, y, z) => !f(x, y, z)) - for(el1 <- coll1) - if(acc && elems2.hasNext && elems3.hasNext) - acc = f(el1, elems2.next, elems3.next) + def foreach[U](f: (El1, El2) => U): Unit = { + val elems2 = coll2.iterator - acc + for (el1 <- coll1) { + if (elems2.hasNext) + f(el1, elems2.next) + else + return + } } def foreach[U](f: (El1, El2, El3) => U): Unit = { val elems2 = coll2.iterator val elems3 = coll3.iterator - for(el1 <- coll1) - if(elems2.hasNext && elems3.hasNext) - f(el1, elems2.next, elems3.next) + for (el1 <- coll1) { + if (elems2.hasNext && elems3.hasNext) + f(el1, elems2.next, elems3.next) + else + return + } } } diff --git a/src/library/scala/Tuple4.scala b/src/library/scala/Tuple4.scala index 74bd38b6ab..8590314db6 100644 --- a/src/library/scala/Tuple4.scala +++ b/src/library/scala/Tuple4.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple5.scala b/src/library/scala/Tuple5.scala index d8e4eff9d9..3ac931f9b5 100644 --- a/src/library/scala/Tuple5.scala +++ b/src/library/scala/Tuple5.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple6.scala b/src/library/scala/Tuple6.scala index a59416fdbf..089a394bb3 100644 --- a/src/library/scala/Tuple6.scala +++ b/src/library/scala/Tuple6.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple7.scala b/src/library/scala/Tuple7.scala index 25f3aa85a4..24a29c5207 100644 --- a/src/library/scala/Tuple7.scala +++ b/src/library/scala/Tuple7.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple8.scala b/src/library/scala/Tuple8.scala index 3389287627..59b6c3d679 100644 --- a/src/library/scala/Tuple8.scala +++ b/src/library/scala/Tuple8.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/Tuple9.scala b/src/library/scala/Tuple9.scala index 0eb3664834..579ecc8577 100644 --- a/src/library/scala/Tuple9.scala +++ b/src/library/scala/Tuple9.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala diff --git a/src/library/scala/package.scala b/src/library/scala/package.scala index 9531572321..69966d003b 100644 --- a/src/library/scala/package.scala +++ b/src/library/scala/package.scala @@ -63,6 +63,7 @@ package object scala { val Vector = scala.collection.immutable.Vector type StringBuilder = scala.collection.mutable.StringBuilder + val StringBuilder = scala.collection.mutable.StringBuilder type Range = scala.collection.immutable.Range val Range = scala.collection.immutable.Range diff --git a/src/library/scala/runtime/AbstractFunction0.scala b/src/library/scala/runtime/AbstractFunction0.scala index 974e122a8f..f7e636e081 100644 --- a/src/library/scala/runtime/AbstractFunction0.scala +++ b/src/library/scala/runtime/AbstractFunction0.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction1.scala b/src/library/scala/runtime/AbstractFunction1.scala index 238ef87e74..dc57ae5841 100644 --- a/src/library/scala/runtime/AbstractFunction1.scala +++ b/src/library/scala/runtime/AbstractFunction1.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction10.scala b/src/library/scala/runtime/AbstractFunction10.scala index dda05ebae2..2dc6291abd 100644 --- a/src/library/scala/runtime/AbstractFunction10.scala +++ b/src/library/scala/runtime/AbstractFunction10.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction11.scala b/src/library/scala/runtime/AbstractFunction11.scala index c6ca9c67a5..926d009c08 100644 --- a/src/library/scala/runtime/AbstractFunction11.scala +++ b/src/library/scala/runtime/AbstractFunction11.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction12.scala b/src/library/scala/runtime/AbstractFunction12.scala index c391b38461..21d1ea08fb 100644 --- a/src/library/scala/runtime/AbstractFunction12.scala +++ b/src/library/scala/runtime/AbstractFunction12.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction13.scala b/src/library/scala/runtime/AbstractFunction13.scala index 32fa820001..a152eb1a77 100644 --- a/src/library/scala/runtime/AbstractFunction13.scala +++ b/src/library/scala/runtime/AbstractFunction13.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction14.scala b/src/library/scala/runtime/AbstractFunction14.scala index fec1247a08..578057cc75 100644 --- a/src/library/scala/runtime/AbstractFunction14.scala +++ b/src/library/scala/runtime/AbstractFunction14.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction15.scala b/src/library/scala/runtime/AbstractFunction15.scala index a41cf47d7b..5504c64239 100644 --- a/src/library/scala/runtime/AbstractFunction15.scala +++ b/src/library/scala/runtime/AbstractFunction15.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction16.scala b/src/library/scala/runtime/AbstractFunction16.scala index f6d92f1209..a2a5b9c442 100644 --- a/src/library/scala/runtime/AbstractFunction16.scala +++ b/src/library/scala/runtime/AbstractFunction16.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction17.scala b/src/library/scala/runtime/AbstractFunction17.scala index f76e2d0a89..0d44cb263c 100644 --- a/src/library/scala/runtime/AbstractFunction17.scala +++ b/src/library/scala/runtime/AbstractFunction17.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction18.scala b/src/library/scala/runtime/AbstractFunction18.scala index cf0b67dff6..701d928b49 100644 --- a/src/library/scala/runtime/AbstractFunction18.scala +++ b/src/library/scala/runtime/AbstractFunction18.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction19.scala b/src/library/scala/runtime/AbstractFunction19.scala index 54d1fb9b7e..4360f43845 100644 --- a/src/library/scala/runtime/AbstractFunction19.scala +++ b/src/library/scala/runtime/AbstractFunction19.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction2.scala b/src/library/scala/runtime/AbstractFunction2.scala index 45d81290db..8be9909fef 100644 --- a/src/library/scala/runtime/AbstractFunction2.scala +++ b/src/library/scala/runtime/AbstractFunction2.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction20.scala b/src/library/scala/runtime/AbstractFunction20.scala index 6e5dd4ef41..0bff861cc4 100644 --- a/src/library/scala/runtime/AbstractFunction20.scala +++ b/src/library/scala/runtime/AbstractFunction20.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction21.scala b/src/library/scala/runtime/AbstractFunction21.scala index e0c20644c3..39daaab700 100644 --- a/src/library/scala/runtime/AbstractFunction21.scala +++ b/src/library/scala/runtime/AbstractFunction21.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction22.scala b/src/library/scala/runtime/AbstractFunction22.scala index 30aaafecc6..ed68e3cc4e 100644 --- a/src/library/scala/runtime/AbstractFunction22.scala +++ b/src/library/scala/runtime/AbstractFunction22.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction3.scala b/src/library/scala/runtime/AbstractFunction3.scala index 78686e5b7f..66aef7e3d3 100644 --- a/src/library/scala/runtime/AbstractFunction3.scala +++ b/src/library/scala/runtime/AbstractFunction3.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction4.scala b/src/library/scala/runtime/AbstractFunction4.scala index 4e4a57d984..d09df303d9 100644 --- a/src/library/scala/runtime/AbstractFunction4.scala +++ b/src/library/scala/runtime/AbstractFunction4.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction5.scala b/src/library/scala/runtime/AbstractFunction5.scala index ce8bbe5710..28b7c6bc44 100644 --- a/src/library/scala/runtime/AbstractFunction5.scala +++ b/src/library/scala/runtime/AbstractFunction5.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction6.scala b/src/library/scala/runtime/AbstractFunction6.scala index 74ca01b581..d50930b34a 100644 --- a/src/library/scala/runtime/AbstractFunction6.scala +++ b/src/library/scala/runtime/AbstractFunction6.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction7.scala b/src/library/scala/runtime/AbstractFunction7.scala index fcd01598d7..78e0336006 100644 --- a/src/library/scala/runtime/AbstractFunction7.scala +++ b/src/library/scala/runtime/AbstractFunction7.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction8.scala b/src/library/scala/runtime/AbstractFunction8.scala index 8ba94b9bee..d449eecdc5 100644 --- a/src/library/scala/runtime/AbstractFunction8.scala +++ b/src/library/scala/runtime/AbstractFunction8.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/src/library/scala/runtime/AbstractFunction9.scala b/src/library/scala/runtime/AbstractFunction9.scala index c96770762b..17129f9453 100644 --- a/src/library/scala/runtime/AbstractFunction9.scala +++ b/src/library/scala/runtime/AbstractFunction9.scala @@ -7,7 +7,7 @@ \* */ -// generated by genprod on Thu Sep 09 09:06:40 PDT 2010 +// generated by genprod on Thu Sep 16 10:52:35 PDT 2010 package scala.runtime diff --git a/test/files/pos/t2673.scala b/test/files/pos/t2673.scala deleted file mode 100644 index 7f232df3f5..0000000000 --- a/test/files/pos/t2673.scala +++ /dev/null @@ -1,4 +0,0 @@ -object Test { - val xs = Array(1, 2, 3) - (xs, xs).zipped map (_ + _) -}
\ No newline at end of file diff --git a/test/files/run/tuple-zipped.scala b/test/files/run/tuple-zipped.scala new file mode 100644 index 0000000000..8f482dc3bf --- /dev/null +++ b/test/files/run/tuple-zipped.scala @@ -0,0 +1,39 @@ +object Test { + val xs1 = List.range(1, 100) + val xs2 = xs1.view + val xs3 = xs1 take 10 + val ss1 = Stream from 1 + val ss2 = ss1.view + val ss3 = ss1 take 10 + val as1 = 1 to 100 toArray + val as2 = as1.view + val as3 = as1 take 10 + + def xss1 = List[Seq[Int]](xs1, xs2, xs3, ss1, ss2, ss3, as1, as2, as3) + def xss2 = List[Seq[Int]](xs1, xs2, xs3, ss3, as1, as2, as3) // no infinities + def xss3 = List[Seq[Int]](xs2, xs3, ss3, as1) // representative sampling + + def main(args: Array[String]): Unit = { + for (cc1 <- xss1 ; cc2 <- xss2) { + val sum1 = (cc1, cc2).zip map { case (x, y) => x + y } sum + val sum2 = (cc1, cc2).zipped map (_ + _) sum + + assert(sum1 == sum2) + } + + for (cc1 <- xss1 ; cc2 <- xss2 ; cc3 <- xss3) { + val sum1 = (cc1, cc2, cc3).zip map { case (x, y, z) => x + y + z } sum + val sum2 = (cc1, cc2, cc3).zipped map (_ + _ + _) sum + + assert(sum1 == sum2) + } + + assert((ss1, ss1).zipped exists ((x, y) => true)) + assert((ss1, ss1, ss1).zipped exists ((x, y, z) => true)) + + assert(!(ss1, ss2, 1 to 3).zipped.exists(_ + _ + _ > 100000)) + assert((1 to 3, ss1, ss2).zipped.forall(_ + _ + _ > 0)) + assert((ss1, 1 to 3, ss2).zipped.map(_ + _ + _).size == 3) + } +} + |