Skip to content

Commit 324d528

Browse files
authored
Merge pull request #4734 from ikeyan/patch-1
`Order.fromComparable` Method Signature Change to Allow `java.sql.Date`
2 parents 726be05 + 048591c commit 324d528

2 files changed

Lines changed: 25 additions & 1 deletion

File tree

kernel/src/main/scala/cats/kernel/Order.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,5 +232,7 @@ object Order extends OrderFunctions[Order] with OrderToOrderingConversion {
232232
override def toOrdering: Ordering[A] = ev
233233
}
234234

235-
def fromComparable[A <: Comparable[A]]: Order[A] = _ compareTo _
235+
private type ContravariantComparable[A] = Comparable[? >: A]
236+
237+
def fromComparable[A <: ContravariantComparable[A]]: Order[A] = _ compareTo _
236238
}

tests/shared/src/test/scala/cats/tests/OrderSuite.scala

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,17 @@ class OrderSuite extends CatsSuite {
6565
assert((i.pmax(j)) === (PartialOrder.pmax(i, j)))
6666
}
6767
}
68+
69+
test("Order.fromComparable") {
70+
val OrderOfCmp = Order.fromComparable[OrderSuite.Cmp]
71+
assert(OrderOfCmp.lt(OrderSuite.Cmp(1), OrderSuite.Cmp(2)))
72+
assert(OrderOfCmp.gt(OrderSuite.Cmp(2), OrderSuite.Cmp(1)))
73+
assert(OrderOfCmp.eqv(OrderSuite.Cmp(1), OrderSuite.Cmp(1)))
74+
val OrderOfCmpSub = Order.fromComparable[OrderSuite.CmpSub]
75+
assert(OrderOfCmpSub.lt(OrderSuite.CmpSub(1, "ignored"), OrderSuite.CmpSub(2, "ignored")))
76+
assert(OrderOfCmpSub.gt(OrderSuite.CmpSub(2, "ignored"), OrderSuite.CmpSub(1, "ignored")))
77+
assert(OrderOfCmpSub.eqv(OrderSuite.CmpSub(1, "a"), OrderSuite.CmpSub(1, "b")))
78+
}
6879
}
6980

7081
object OrderSuite {
@@ -87,4 +98,15 @@ object OrderSuite {
8798
implicit val ord: Order[C] = Order.allEqual
8899
Ordering[C]
89100
}
101+
102+
class Cmp(protected val n: Int) extends Comparable[Cmp] {
103+
override def compareTo(o: Cmp): Int = n.compare(o.n)
104+
}
105+
object Cmp {
106+
def apply(n: Int): Cmp = new Cmp(n)
107+
}
108+
class CmpSub(override protected val n: Int, private val ignored: String) extends Cmp(n)
109+
object CmpSub {
110+
def apply(n: Int, ignored: String): CmpSub = new CmpSub(n, ignored)
111+
}
90112
}

0 commit comments

Comments
 (0)