Skip to content

Commit

Permalink
Merge pull request #4092 from isomarcte/sortedmap-order
Browse files Browse the repository at this point in the history
  • Loading branch information
johnynek authored Jan 21, 2022
2 parents 67c5d40 + 3d38c36 commit d9616c8
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,9 @@ class Tests extends TestsConfig with DisciplineSuite {
checkAll("PartialOrder[Vector[HasPartialOrder[Int]]]", PartialOrderTests[Vector[HasPartialOrder[Int]]].partialOrder)
checkAll("PartialOrder[Stream[HasPartialOrder[Int]]]", PartialOrderTests[Stream[HasPartialOrder[Int]]].partialOrder)
checkAll("PartialOrder[Queue[HasPartialOrder[Int]]]", PartialOrderTests[Queue[HasPartialOrder[Int]]].partialOrder)
checkAll("PartialOrder[SortedMap[Int, HasPartialOrder[Int]]]",
PartialOrderTests[SortedMap[Int, HasPartialOrder[Int]]].partialOrder
)
checkAll("Semilattice.asMeetPartialOrder[Set[Int]]",
PartialOrderTests(Semilattice.asMeetPartialOrder[Set[Int]]).partialOrder
)
Expand All @@ -171,6 +174,7 @@ class Tests extends TestsConfig with DisciplineSuite {
checkAll("Order[Stream[Int]]", OrderTests[Stream[Int]].order)
checkAll("Order[Queue[Int]]", OrderTests[Queue[Int]].order)
checkAll("Order[SortedSet[String]", OrderTests[SortedSet[String]].order)
checkAll("Order[SortedMap[Int, String]]", OrderTests[SortedMap[Int, String]].order)
checkAll("fromOrdering[Int]", OrderTests(Order.fromOrdering[Int]).order)
checkAll("Order.reverse(Order[Int])", OrderTests(Order.reverse(Order[Int])).order)
checkAll("Order.reverse(Order.reverse(Order[Int]))", OrderTests(Order.reverse(Order.reverse(Order[Int]))).order)
Expand Down
14 changes: 12 additions & 2 deletions kernel/src/main/scala/cats/kernel/Eq.scala
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ object Eq
with EqToEquivConversion
with ScalaVersionSpecificOrderInstances
with instances.TupleOrderInstances
with OrderInstances0 {
with OrderInstances1 {

/**
* Access an implicit `Eq[A]`.
Expand Down Expand Up @@ -224,7 +224,12 @@ private[kernel] trait OrderInstances0 extends PartialOrderInstances {
cats.kernel.instances.seq.catsKernelStdOrderForSeq[A]
}

private[kernel] trait PartialOrderInstances extends PartialOrderInstances0 {
private[kernel] trait OrderInstances1 extends OrderInstances0 {
implicit def catsKernelOrderForSortedMap[K, V: Order]: Order[SortedMap[K, V]] =
cats.kernel.instances.sortedMap.catsKernelStdOrderForSortedMap[K, V]
}

private[kernel] trait PartialOrderInstances extends PartialOrderInstances1 {
implicit def catsKernelPartialOrderForOption[A: PartialOrder]: PartialOrder[Option[A]] =
cats.kernel.instances.option.catsKernelStdPartialOrderForOption[A]
implicit def catsKernelPartialOrderForList[A: PartialOrder]: PartialOrder[List[A]] =
Expand All @@ -242,6 +247,11 @@ private[kernel] trait PartialOrderInstances0 extends HashInstances {
cats.kernel.instances.seq.catsKernelStdPartialOrderForSeq[A]
}

private[kernel] trait PartialOrderInstances1 extends PartialOrderInstances0 {
implicit def catsKernelPartialOrderForSortedMap[K, V: PartialOrder]: PartialOrder[SortedMap[K, V]] =
cats.kernel.instances.sortedMap.catsKernelStdPartialOrderForSortedMap[K, V]
}

private[kernel] trait HashInstances extends HashInstances0 {
implicit def catsKernelHashForSet[A]: Hash[Set[A]] = cats.kernel.instances.set.catsKernelStdHashForSet[A]
implicit def catsKernelHashForOption[A: Hash]: Hash[Option[A]] =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package instances

import scala.collection.immutable.SortedMap

trait SortedMapInstances extends SortedMapInstances2 {
trait SortedMapInstances extends SortedMapInstances3 {
implicit def catsKernelStdHashForSortedMap[K: Hash, V: Hash]: Hash[SortedMap[K, V]] =
new SortedMapHash[K, V]

Expand Down Expand Up @@ -35,6 +35,38 @@ private[instances] trait SortedMapInstances2 extends SortedMapInstances1 {

implicit def catsKernelStdMonoidForSortedMap[K: Order, V: Semigroup]: Monoid[SortedMap[K, V]] =
new SortedMapMonoid[K, V]

implicit def catsKernelStdPartialOrderForSortedMap[K, V: PartialOrder]: PartialOrder[SortedMap[K, V]] =
new SortedMapPartialOrder[K, V]
}

private[instances] trait SortedMapInstances3 extends SortedMapInstances2 {
implicit def catsKernelStdOrderForSortedMap[K, V: Order]: Order[SortedMap[K, V]] =
new SortedMapOrder[K, V]
}

private[instances] class SortedMapOrder[K, V](implicit V: Order[V]) extends Order[SortedMap[K, V]] {
override def compare(x: SortedMap[K, V], y: SortedMap[K, V]): Int = {
implicit val order: Order[K] = Order.fromOrdering(x.ordering)
if (x eq y) {
0
} else {
StaticMethods.iteratorCompare(x.iterator, y.iterator)
}
}
}

private[instances] class SortedMapPartialOrder[K, V](implicit V: PartialOrder[V])
extends PartialOrder[SortedMap[K, V]] {
override def partialCompare(x: SortedMap[K, V], y: SortedMap[K, V]): Double = {
implicit val order: Order[K] = Order.fromOrdering(x.ordering)

if (x eq y) {
0.0
} else {
StaticMethods.iteratorPartialCompare(x.iterator, y.iterator)
}
}
}

class SortedMapHash[K, V](implicit V: Hash[V], K: Hash[K]) extends SortedMapEq[K, V]()(V) with Hash[SortedMap[K, V]] {
Expand Down

0 comments on commit d9616c8

Please sign in to comment.