From f785937b68f3e02ff391639f513a2d0257db7a93 Mon Sep 17 00:00:00 2001 From: Bondarenko Date: Fri, 13 Sep 2019 17:45:28 +0300 Subject: [PATCH 1/4] Hash[Map[K, V]] has unnecessary constraint #3039 --- core/src/main/scala/cats/instances/sortedSet.scala | 6 +++--- .../cats/kernel/instances/SortedSetInstances.scala | 11 +++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/core/src/main/scala/cats/instances/sortedSet.scala b/core/src/main/scala/cats/instances/sortedSet.scala index 9136b8d551..615101b8a2 100644 --- a/core/src/main/scala/cats/instances/sortedSet.scala +++ b/core/src/main/scala/cats/instances/sortedSet.scala @@ -73,7 +73,7 @@ trait SortedSetInstances extends SortedSetInstances1 { private[instances] trait SortedSetInstances1 { @deprecated("Use cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet", "2.0.0-RC2") private[instances] def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] = - cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A] + cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet1[A] @deprecated("Use cats.kernel.instances.sortedSet.catsKernelStdSemilatticeForSortedSet", "2.0.0-RC2") def catsKernelStdSemilatticeForSortedSet[A: Order]: BoundedSemilattice[SortedSet[A]] = @@ -94,7 +94,7 @@ private[instances] trait SortedSetInstancesBinCompat0 { private[instances] trait SortedSetInstancesBinCompat1 extends LowPrioritySortedSetInstancesBinCompat1 { // TODO: Remove when this is no longer necessary for binary compatibility. implicit override def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] = - cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A] + cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet1[A] } private[instances] trait LowPrioritySortedSetInstancesBinCompat1 @@ -104,7 +104,7 @@ private[instances] trait LowPrioritySortedSetInstancesBinCompat1 cats.kernel.instances.sortedSet.catsKernelStdOrderForSortedSet[A] override def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] = - cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A] + cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet1[A] } @deprecated("Use cats.kernel.instances.SortedSetHash", "2.0.0-RC2") diff --git a/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala b/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala index 618c6610d1..9d35218180 100644 --- a/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala +++ b/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala @@ -1,11 +1,14 @@ package cats.kernel package instances -import cats.kernel.{BoundedSemilattice, Hash, Order} import scala.collection.immutable.SortedSet trait SortedSetInstances extends SortedSetInstances1 { - implicit def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] = + @deprecated("Will be removed after dropping Scala 2.11 support", "") + def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] = + new SortedSetHash[A] + + implicit def catsKernelStdHashForSortedSet1[A: Hash]: Hash[SortedSet[A]] = new SortedSetHash[A] } @@ -28,7 +31,7 @@ class SortedSetOrder[A: Order] extends Order[SortedSet[A]] { StaticMethods.iteratorEq(s1.iterator, s2.iterator) } -class SortedSetHash[A: Order: Hash] extends Hash[SortedSet[A]] { +class SortedSetHash[A: Hash] extends Hash[SortedSet[A]] { import scala.util.hashing.MurmurHash3._ // adapted from [[scala.util.hashing.MurmurHash3]], @@ -50,7 +53,7 @@ class SortedSetHash[A: Order: Hash] extends Hash[SortedSet[A]] { finalizeHash(h, n) } override def eqv(s1: SortedSet[A], s2: SortedSet[A]): Boolean = - StaticMethods.iteratorEq(s1.iterator, s2.iterator)(Order[A]) + StaticMethods.iteratorEq(s1.iterator, s2.iterator)(Eq[A]) } class SortedSetSemilattice[A: Order] extends BoundedSemilattice[SortedSet[A]] { From 5369df12bdeed313f4277d1100061909f8ba5a4e Mon Sep 17 00:00:00 2001 From: Lars Hupel Date: Sat, 5 Oct 2019 14:56:34 +0200 Subject: [PATCH 2/4] fix binary compatibility --- .../scala/cats/kernel/instances/SortedSetInstances.scala | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala b/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala index 9d35218180..b9075584b1 100644 --- a/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala +++ b/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala @@ -31,9 +31,13 @@ class SortedSetOrder[A: Order] extends Order[SortedSet[A]] { StaticMethods.iteratorEq(s1.iterator, s2.iterator) } -class SortedSetHash[A: Hash] extends Hash[SortedSet[A]] { +// FIXME use context bound in 3.x +class SortedSetHash[A](implicit hashA: Hash[A]) extends Hash[SortedSet[A]] { import scala.util.hashing.MurmurHash3._ + @deprecated("Use the constructor _without_ Order instead, since Order is not required", "2.0.1") + def this(o: Order[A], h: Hash[A]) = this()(h) + // adapted from [[scala.util.hashing.MurmurHash3]], // but modified standard `Any#hashCode` to `ev.hash`. def hash(xs: SortedSet[A]): Int = { From 1194733048e6148f32a6bfca98b2dec462906f86 Mon Sep 17 00:00:00 2001 From: Travis Brown Date: Tue, 5 Nov 2019 11:02:54 +0000 Subject: [PATCH 3/4] Simplify names, adjust deprecation messages --- .../main/scala/cats/instances/sortedSet.scala | 16 ++++++++++++---- .../kernel/instances/SortedSetInstances.scala | 6 +++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/core/src/main/scala/cats/instances/sortedSet.scala b/core/src/main/scala/cats/instances/sortedSet.scala index 615101b8a2..582dd6ec54 100644 --- a/core/src/main/scala/cats/instances/sortedSet.scala +++ b/core/src/main/scala/cats/instances/sortedSet.scala @@ -73,7 +73,7 @@ trait SortedSetInstances extends SortedSetInstances1 { private[instances] trait SortedSetInstances1 { @deprecated("Use cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet", "2.0.0-RC2") private[instances] def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] = - cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet1[A] + cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A](Hash[A]) @deprecated("Use cats.kernel.instances.sortedSet.catsKernelStdSemilatticeForSortedSet", "2.0.0-RC2") def catsKernelStdSemilatticeForSortedSet[A: Order]: BoundedSemilattice[SortedSet[A]] = @@ -93,8 +93,12 @@ private[instances] trait SortedSetInstancesBinCompat0 { private[instances] trait SortedSetInstancesBinCompat1 extends LowPrioritySortedSetInstancesBinCompat1 { // TODO: Remove when this is no longer necessary for binary compatibility. - implicit override def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] = - cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet1[A] + // Note that the overrides here and below are only necessary because the + // definitions in `SortedSetInstances1` conflict with the ones in + // `cats.kernel.instances.SortedSetInstances`. Both are inherited here, so + // we have to "bubble" the "correct" ones up to the appropriate place. + implicit override def catsKernelStdHashForSortedSet[A: Hash]: Hash[SortedSet[A]] = + cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A](Hash[A]) } private[instances] trait LowPrioritySortedSetInstancesBinCompat1 @@ -103,8 +107,12 @@ private[instances] trait LowPrioritySortedSetInstancesBinCompat1 implicit override def catsKernelStdOrderForSortedSet[A: Order]: Order[SortedSet[A]] = cats.kernel.instances.sortedSet.catsKernelStdOrderForSortedSet[A] + implicit override def catsKernelStdHashForSortedSet[A: Hash]: Hash[SortedSet[A]] = + cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A](Hash[A]) + + @deprecated("Use cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet", "2.0.0-RC2") override def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] = - cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet1[A] + cats.kernel.instances.sortedSet.catsKernelStdHashForSortedSet[A](Hash[A]) } @deprecated("Use cats.kernel.instances.SortedSetHash", "2.0.0-RC2") diff --git a/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala b/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala index b9075584b1..c89dd56307 100644 --- a/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala +++ b/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala @@ -4,11 +4,11 @@ package instances import scala.collection.immutable.SortedSet trait SortedSetInstances extends SortedSetInstances1 { - @deprecated("Will be removed after dropping Scala 2.11 support", "") + @deprecated("Use catsKernelStdHashForSortedSet override without Order", "2.1.0") def catsKernelStdHashForSortedSet[A: Order: Hash]: Hash[SortedSet[A]] = new SortedSetHash[A] - implicit def catsKernelStdHashForSortedSet1[A: Hash]: Hash[SortedSet[A]] = + implicit def catsKernelStdHashForSortedSet[A: Hash]: Hash[SortedSet[A]] = new SortedSetHash[A] } @@ -35,7 +35,7 @@ class SortedSetOrder[A: Order] extends Order[SortedSet[A]] { class SortedSetHash[A](implicit hashA: Hash[A]) extends Hash[SortedSet[A]] { import scala.util.hashing.MurmurHash3._ - @deprecated("Use the constructor _without_ Order instead, since Order is not required", "2.0.1") + @deprecated("Use the constructor _without_ Order instead, since Order is not required", "2.1.0") def this(o: Order[A], h: Hash[A]) = this()(h) // adapted from [[scala.util.hashing.MurmurHash3]], From c1b48bbc247e72a848bc71774edd22d118fdd179 Mon Sep 17 00:00:00 2001 From: Travis Brown Date: Tue, 5 Nov 2019 11:13:33 +0000 Subject: [PATCH 4/4] Make bincompat-only auxiliary constructor package-private --- .../main/scala/cats/kernel/instances/SortedSetInstances.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala b/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala index c89dd56307..63913b59f7 100644 --- a/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala +++ b/kernel/src/main/scala/cats/kernel/instances/SortedSetInstances.scala @@ -36,7 +36,7 @@ class SortedSetHash[A](implicit hashA: Hash[A]) extends Hash[SortedSet[A]] { import scala.util.hashing.MurmurHash3._ @deprecated("Use the constructor _without_ Order instead, since Order is not required", "2.1.0") - def this(o: Order[A], h: Hash[A]) = this()(h) + private[instances] def this(o: Order[A], h: Hash[A]) = this()(h) // adapted from [[scala.util.hashing.MurmurHash3]], // but modified standard `Any#hashCode` to `ev.hash`.