summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library/scala/Predef.scala13
-rw-r--r--src/library/scala/Tuple2.scala20
-rw-r--r--src/library/scala/Tuple3.scala18
-rw-r--r--test/files/pos/t2673.scala4
4 files changed, 33 insertions, 22 deletions
diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala
index d163bca25b..7729dd8886 100644
--- a/src/library/scala/Predef.scala
+++ b/src/library/scala/Predef.scala
@@ -277,8 +277,19 @@ object Predef extends LowPriorityImplicits {
// reusing `Function2` and `identity` leads to ambiguities (any2stringadd is inferred)
// to constrain any abstract type T that's in scope in a method's argument list (not just the method's own type parameters)
// simply add an implicit argument of type `T <:< U`, where U is the required upper bound (for lower-bounds, use: `U <: T`)
+ // 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)
+
+ sealed abstract class =:=[From, To] extends (From => To)
+ object =:= {
+ implicit def tpEquals[A]: A =:= A = new (A =:= A) {def apply(x: A) = x}
+ }
+
+ sealed abstract class <%<[-From, +To] extends (From => To)
+ object <%< {
+ implicit def conformsOrViewsAs[A <% B, B]: A <%< B = new (A <%< B) {def apply(x: A) = x}
+ }
/** A type for which there is aways an implicit value.
* @see fallbackCanBuildFrom in Array.scala
diff --git a/src/library/scala/Tuple2.scala b/src/library/scala/Tuple2.scala
index 94ccc4c3c3..f558826150 100644
--- a/src/library/scala/Tuple2.scala
+++ b/src/library/scala/Tuple2.scala
@@ -12,7 +12,7 @@
package scala
-import scala.collection.{ TraversableLike, IterableLike }
+import scala.collection.{TraversableLike, IterableLike}
import scala.collection.generic.CanBuildFrom
@@ -29,10 +29,8 @@ case class Tuple2[+T1, +T2](_1:T1, _2:T2) extends Product2[T1, T2] {
/** Swap the elements of the tuple */
def swap: Tuple2[T2,T1] = Tuple2(_2, _1)
-// TODO: probably loosen zip and zipped from <:< to <%<
-
- def zip[Repr1, El1, El2, To](implicit w1: T1 <:< TraversableLike[El1, Repr1],
- w2: T2 <:< Iterable[El2],
+ def zip[Repr1, El1, El2, To](implicit w1: T1 => TraversableLike[El1, Repr1],
+ w2: T2 => Iterable[El2],
cbf1: CanBuildFrom[Repr1, (El1, El2), To]): To = {
val coll1: TraversableLike[El1, Repr1] = _1
val coll2: Iterable[El2] = _2
@@ -46,19 +44,19 @@ case class Tuple2[+T1, +T2](_1:T1, _2:T2) extends Product2[T1, T2] {
b1.result
}
- def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 <:< TraversableLike[El1, Repr1], w2: T2 <:< IterableLike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2]
- = new Zipped[Repr1, El1, Repr2, El2](_1, _2)
+ def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TraversableLike[El1, Repr1], w2: T2 => IterableLike[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 = {
- val b = cbf(coll1.repr)
- val elems2 = coll2.iterator
+ val b = cbf(coll1.repr)
+ val elems2 = coll2.iterator
- for(el1 <- coll1)
+ for(el1 <- coll1)
if(elems2.hasNext)
b += f(el1, elems2.next)
- b.result
+ b.result
}
def flatMap[B, To](f: (El1, El2) => Traversable[B])(implicit cbf: CanBuildFrom[Repr1, B, To]): To = {
diff --git a/src/library/scala/Tuple3.scala b/src/library/scala/Tuple3.scala
index 8c669a4c28..b63c5a397f 100644
--- a/src/library/scala/Tuple3.scala
+++ b/src/library/scala/Tuple3.scala
@@ -12,7 +12,7 @@
package scala
-import scala.collection.{ TraversableLike, IterableLike }
+import scala.collection.{TraversableLike, IterableLike}
import scala.collection.generic.CanBuildFrom
@@ -24,11 +24,9 @@ case class Tuple3[+T1, +T2, +T3](_1:T1,_2:T2,_3:T3)
{
override def toString() = "(" + _1 + "," + _2 + "," + _3 + ")"
-// TODO: probably loosen zip and zipped from <:< to <%<
-
- def zip[Repr1, El1, El2, El3, To](implicit w1: T1 <:< TraversableLike[El1, Repr1],
- w2: T2 <:< Iterable[El2],
- w3: T3 <:< Iterable[El3],
+ def zip[Repr1, El1, El2, El3, To](implicit w1: T1 => TraversableLike[El1, Repr1],
+ w2: T2 => Iterable[El2],
+ w3: T3 => Iterable[El3],
cbf1: CanBuildFrom[Repr1, (El1, El2, El3), To]): To = {
val coll1: TraversableLike[El1, Repr1] = _1
val coll2: Iterable[El2] = _2
@@ -44,10 +42,10 @@ case class Tuple3[+T1, +T2, +T3](_1:T1,_2:T2,_3:T3)
b1.result
}
- 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]
- = new Zipped[Repr1, El1, Repr2, El2, Repr3, El3](_1, _2, _3)
+ 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]
+ = 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],
diff --git a/test/files/pos/t2673.scala b/test/files/pos/t2673.scala
new file mode 100644
index 0000000000..7f232df3f5
--- /dev/null
+++ b/test/files/pos/t2673.scala
@@ -0,0 +1,4 @@
+object Test {
+ val xs = Array(1, 2, 3)
+ (xs, xs).zipped map (_ + _)
+} \ No newline at end of file