From 73d180b75f1f43c9d5728841d3efd819931ec74e Mon Sep 17 00:00:00 2001 From: Edmund Noble Date: Wed, 5 Jul 2017 23:04:18 -0400 Subject: [PATCH] Add cats Order->stdlib Ordering implicit summoner to implicits, instances.order (#1670) --- core/src/main/scala/cats/instances/order.scala | 3 ++- kernel/src/main/scala/cats/kernel/Order.scala | 9 +++++++++ tests/src/test/scala/cats/tests/OrderTests.scala | 14 ++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/core/src/main/scala/cats/instances/order.scala b/core/src/main/scala/cats/instances/order.scala index ac05fd87bc..8dba09b790 100644 --- a/core/src/main/scala/cats/instances/order.scala +++ b/core/src/main/scala/cats/instances/order.scala @@ -3,7 +3,7 @@ package instances import cats.functor.Contravariant -trait OrderInstances { +trait OrderInstances extends cats.kernel.OrderToOrderingConversion { implicit val catsFunctorContravariantForOrder: Contravariant[Order] = new Contravariant[Order] { @@ -14,3 +14,4 @@ trait OrderInstances { def contramap[A, B](fa: Order[A])(f: B => A): Order[B] = fa.on(f) } } + diff --git a/kernel/src/main/scala/cats/kernel/Order.scala b/kernel/src/main/scala/cats/kernel/Order.scala index bf31262d93..0292866718 100644 --- a/kernel/src/main/scala/cats/kernel/Order.scala +++ b/kernel/src/main/scala/cats/kernel/Order.scala @@ -139,6 +139,15 @@ abstract class OrderFunctions[O[T] <: Order[T]] extends PartialOrderFunctions[O] ev.max(x, y) } +trait OrderToOrderingConversion { + /** + * Implicitly derive a `scala.math.Ordering[A]` from a `Order[A]` + * instance. + */ + implicit def catsKernelOrderingForOrder[A](implicit ev: Order[A]): Ordering[A] = + ev.toOrdering +} + object Order extends OrderFunctions[Order] { /** * Access an implicit `Order[A]`. diff --git a/tests/src/test/scala/cats/tests/OrderTests.scala b/tests/src/test/scala/cats/tests/OrderTests.scala index e319a4b922..324c4a089e 100644 --- a/tests/src/test/scala/cats/tests/OrderTests.scala +++ b/tests/src/test/scala/cats/tests/OrderTests.scala @@ -17,4 +17,18 @@ class OrderTests extends FunSuite { Invariant[Order] Contravariant[Order] } + + // ambiguity test: + // the Ordering instance from the Order instance should be trumped + // by the one provided in the Ordering companion object + { + import cats.instances.all._ + Ordering[String] + class C + implicit val ording: Ordering[C] = new Ordering[C] { + def compare(x: C, y: C) = 0 + } + implicit val ord: Order[C] = Order.allEqual + Ordering[C] + } }