Skip to content

Commit 96b5e97

Browse files
travisbrownkailuowang
authored andcommitted
Fix #3039 (#3126)
* Hash[Map[K, V]] has unnecessary constraint #3039 * fix binary compatibility * Simplify names, adjust deprecation messages * Make bincompat-only auxiliary constructor package-private
1 parent ed73246 commit 96b5e97

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

core/src/main/scala/cats/instances/sortedSet.scala

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ trait SortedSetInstances extends SortedSetInstances1 {
7373
private[instances] trait SortedSetInstances1 {
7474
@deprecated("Use cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet", "2.0.0-RC2")
7575
private[instances] def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] =
76-
cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A]
76+
cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A](Hash[A])
7777

7878
@deprecated("Use cats.kernel.instances.sortedSet.catsKernelStdSemilatticeForSortedSet", "2.0.0-RC2")
7979
def catsKernelStdSemilatticeForSortedSet[A: Order]: BoundedSemilattice[SortedSet[A]] =
@@ -93,8 +93,12 @@ private[instances] trait SortedSetInstancesBinCompat0 {
9393

9494
private[instances] trait SortedSetInstancesBinCompat1 extends LowPrioritySortedSetInstancesBinCompat1 {
9595
// TODO: Remove when this is no longer necessary for binary compatibility.
96-
implicit override def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] =
97-
cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A]
96+
// Note that the overrides here and below are only necessary because the
97+
// definitions in `SortedSetInstances1` conflict with the ones in
98+
// `cats.kernel.instances.SortedSetInstances`. Both are inherited here, so
99+
// we have to "bubble" the "correct" ones up to the appropriate place.
100+
implicit override def catsKernelStdHashForSortedSet[A: Hash]: Hash[SortedSet[A]] =
101+
cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A](Hash[A])
98102
}
99103

100104
private[instances] trait LowPrioritySortedSetInstancesBinCompat1
@@ -103,8 +107,12 @@ private[instances] trait LowPrioritySortedSetInstancesBinCompat1
103107
implicit override def catsKernelStdOrderForSortedSet[A: Order]: Order[SortedSet[A]] =
104108
cats.kernel.instances.sortedSet.catsKernelStdOrderForSortedSet[A]
105109

110+
implicit override def catsKernelStdHashForSortedSet[A: Hash]: Hash[SortedSet[A]] =
111+
cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A](Hash[A])
112+
113+
@deprecated("Use cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet", "2.0.0-RC2")
106114
override def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] =
107-
cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A]
115+
cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A](Hash[A])
108116
}
109117

110118
@deprecated("Use cats.kernel.instances.SortedSetHash", "2.0.0-RC2")

kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package cats.kernel
22
package instances
33

4-
import cats.kernel.{BoundedSemilattice, Hash, Order}
54
import scala.collection.immutable.SortedSet
65

76
trait SortedSetInstances extends SortedSetInstances1 {
8-
implicit def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] =
7+
@deprecated("Use catsKernelStdHashForSortedSet override without Order", "2.1.0")
8+
def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] =
9+
new SortedSetHash[A]
10+
11+
implicit def catsKernelStdHashForSortedSet[A: Hash]: Hash[SortedSet[A]] =
912
new SortedSetHash[A]
1013
}
1114

@@ -28,9 +31,13 @@ class SortedSetOrder[A: Order] extends Order[SortedSet[A]] {
2831
StaticMethods.iteratorEq(s1.iterator, s2.iterator)
2932
}
3033

31-
class SortedSetHash[A: Order: Hash] extends Hash[SortedSet[A]] {
34+
// FIXME use context bound in 3.x
35+
class SortedSetHash[A](implicit hashA: Hash[A]) extends Hash[SortedSet[A]] {
3236
import scala.util.hashing.MurmurHash3._
3337

38+
@deprecated("Use the constructor _without_ Order instead, since Order is not required", "2.1.0")
39+
private[instances] def this(o: Order[A], h: Hash[A]) = this()(h)
40+
3441
// adapted from [[scala.util.hashing.MurmurHash3]],
3542
// but modified standard `Any#hashCode` to `ev.hash`.
3643
def hash(xs: SortedSet[A]): Int = {
@@ -50,7 +57,7 @@ class SortedSetHash[A: Order: Hash] extends Hash[SortedSet[A]] {
5057
finalizeHash(h, n)
5158
}
5259
override def eqv(s1: SortedSet[A], s2: SortedSet[A]): Boolean =
53-
StaticMethods.iteratorEq(s1.iterator, s2.iterator)(Order[A])
60+
StaticMethods.iteratorEq(s1.iterator, s2.iterator)(Eq[A])
5461
}
5562

5663
class SortedSetSemilattice[A: Order] extends BoundedSemilattice[SortedSet[A]] {

0 commit comments

Comments
 (0)