aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/scala/Eq.scala17
-rw-r--r--tests/neg/equality.scala9
2 files changed, 21 insertions, 5 deletions
diff --git a/src/scala/Eq.scala b/src/scala/Eq.scala
new file mode 100644
index 000000000..697ec4318
--- /dev/null
+++ b/src/scala/Eq.scala
@@ -0,0 +1,17 @@
+package scala
+
+/** A marker class indicating that values of kind `T` can be compared. */
+class Eq[-L, -R]
+
+/** Besides being a companion object, this object
+ * can also be used as a value that's compatible with
+ * any instance of `Eq`.
+ */
+object Eq extends Eq[Any, Any] {
+
+ /** An implicit that provides an `Eq` instance for all types `T`
+ * such that `T <: EqClass[T]`.
+ */
+ implicit def eqAny[L, R]: Eq[L, R] = Eq
+}
+
diff --git a/tests/neg/equality.scala b/tests/neg/equality.scala
index a32db57c5..4a77a2d25 100644
--- a/tests/neg/equality.scala
+++ b/tests/neg/equality.scala
@@ -10,10 +10,9 @@ object equality {
case class Some[+T](x: T) extends Option[T]
case object None extends Option[Nothing]
- implicit def eqStr: Eq[Str, Str] = Eq()
- implicit def eqNum: Eq[Num, Num] = Eq()
- implicit def eqOption[T, U, OT <: Option[T], OU <: Option[U]]
- (implicit e: Eq[T, U]): Eq[OT, OU] = Eq()
+ implicit def eqStr: Eq[Str, Str] = Eq
+ implicit def eqNum: Eq[Num, Num] = Eq
+ implicit def eqOption[T, U](implicit e: Eq[T, U]): Eq[Option[T], Option[U]] = Eq
def main(args: Array[String]): Unit = {
Some(Other(3)) == None
@@ -44,7 +43,7 @@ object equality {
class Fruit
- implicit def eqFruit[A <: Fruit, B <: Fruit]: Eq[A, B] = Eq()
+ implicit def eqFruit: Eq[Fruit, Fruit] = Eq
class Apple extends Fruit
class Pear extends Fruit