summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2009-10-20 19:49:20 +0000
committerPaul Phillips <paulp@improving.org>2009-10-20 19:49:20 +0000
commit081e2fb747892a7efe12f1e9b0138b9d1726ab6b (patch)
tree588cdc6bf3b98d404b4b22ca76d445ce9a0670a0
parentcd98a5a1869bc1737753c41ccacef17cd4a28cb8 (diff)
downloadscala-081e2fb747892a7efe12f1e9b0138b9d1726ab6b.tar.gz
scala-081e2fb747892a7efe12f1e9b0138b9d1726ab6b.tar.bz2
scala-081e2fb747892a7efe12f1e9b0138b9d1726ab6b.zip
Fix and test case for #2260. Hooray for the
ability to influence the priority of implicits.
-rw-r--r--src/library/scala/Ordered.scala6
-rw-r--r--src/library/scala/Ordering.scala17
-rw-r--r--src/library/scala/Predef.scala4
-rw-r--r--test/files/pos/bug2260.scala10
4 files changed, 27 insertions, 10 deletions
diff --git a/src/library/scala/Ordered.scala b/src/library/scala/Ordered.scala
index 009502619c..45e10b3a25 100644
--- a/src/library/scala/Ordered.scala
+++ b/src/library/scala/Ordered.scala
@@ -48,6 +48,10 @@ trait Ordered[A] extends java.lang.Comparable[A] {
def <= (that: A): Boolean = (this compare that) <= 0
def >= (that: A): Boolean = (this compare that) >= 0
def compareTo(that: A): Int = compare(that)
+}
-
+object Ordered {
+ /** Lens from Ordering[T] to Ordered[T] */
+ implicit def orderingToOrdered[T](x: T)(implicit ord: Ordering[T]): Ordered[T] =
+ new Ordered[T] { def compare(that: T): Int = ord.compare(x, that) }
}
diff --git a/src/library/scala/Ordering.scala b/src/library/scala/Ordering.scala
index fed776147f..8b4db3f549 100644
--- a/src/library/scala/Ordering.scala
+++ b/src/library/scala/Ordering.scala
@@ -104,7 +104,18 @@ trait Ordering[T] extends Comparator[T] with PartialOrdering[T] {
implicit def mkOrderingOps(lhs: T): Ops = new Ops(lhs)
}
-object Ordering {
+/** This would conflict with all the nice implicit Orderings
+ * available, but thanks to the magic of prioritized implicits
+ * via subclassing we can make Ordered[A] => Ordering[A] only
+ * turn up if nothing else works.
+ */
+trait LowPriorityOrderingImplicits {
+ implicit def ordered[A <: Ordered[A]]: Ordering[A] = new Ordering[A] {
+ def compare(x: A, y: A) = x.compare(y)
+ }
+}
+
+object Ordering extends LowPriorityOrderingImplicits {
def apply[T](implicit ord : Ordering[T]) = ord
@@ -112,10 +123,6 @@ object Ordering {
def compare(x: T, y: T) = if (cmp(x, y)) -1 else if (cmp(y, x)) 1 else 0
}
- def ordered[A <: Ordered[A]]: Ordering[A] = new Ordering[A] {
- def compare(x: A, y: A) = x.compare(y)
- }
-
trait UnitOrdering extends Ordering[Unit] {
def compare(x: Unit, y: Unit) = 0
}
diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala
index 6cb073b173..71fdd64832 100644
--- a/src/library/scala/Predef.scala
+++ b/src/library/scala/Predef.scala
@@ -247,10 +247,6 @@ object Predef extends LowPriorityImplicits {
implicit def exceptionWrapper(exc: Throwable) = new runtime.RichException(exc)
- /** Lens from Ordering[T] to Ordered[T] */
- implicit def orderingToOrdered[T](x: T)(implicit ord: Ordering[T]): Ordered[T] =
- new Ordered[T] { def compare(that: T): Int = ord.compare(x, that) }
-
implicit def byte2short(x: Byte): Short = x.toShort
implicit def byte2int(x: Byte): Int = x.toInt
implicit def byte2long(x: Byte): Long = x.toLong
diff --git a/test/files/pos/bug2260.scala b/test/files/pos/bug2260.scala
new file mode 100644
index 0000000000..4e4cc5ab2c
--- /dev/null
+++ b/test/files/pos/bug2260.scala
@@ -0,0 +1,10 @@
+package top
+
+class Text(val value: String) extends Ordered[Text] {
+ def compare(that: Text) = value.compare(that.value)
+}
+
+object Index {
+ import scala.collection.immutable.TreeMap
+ val tree = TreeMap.empty[Text, String]
+}