Skip to content

Commit 90db3cd

Browse files
authored
Merge pull request #4612 from isomarcte/non-empty-vector-order
Add Hash and Order Instances for NonEmptyVector
2 parents 1a0d029 + 4fafcf1 commit 90db3cd

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

core/src/main/scala/cats/data/NonEmptyVector.scala

+20-2
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ final class NonEmptyVector[+A] private (val toVector: Vector[A])
387387
}
388388

389389
@suppressUnusedImportWarningForScalaVersionSpecific
390-
sealed abstract private[data] class NonEmptyVectorInstances {
390+
sealed abstract private[data] class NonEmptyVectorInstances extends NonEmptyVectorInstances0 {
391391

392392
@deprecated(
393393
"maintained for the sake of binary compatibility only - use catsDataInstancesForNonEmptyChainBinCompat1 instead",
@@ -564,7 +564,11 @@ sealed abstract private[data] class NonEmptyVectorInstances {
564564
NonEmptyVector.fromVectorUnsafe(Align[Vector].alignWith(fa.toVector, fb.toVector)(f))
565565
}
566566

567-
implicit def catsDataEqForNonEmptyVector[A: Eq]: Eq[NonEmptyVector[A]] = _ === _
567+
implicit def catsDataOrderForNonEmptyVector[A: Order]: Order[NonEmptyVector[A]] =
568+
new Order[NonEmptyVector[A]] {
569+
override def compare(x: NonEmptyVector[A], y: NonEmptyVector[A]): Int =
570+
Order[Vector[A]].compare(x.toVector, y.toVector)
571+
}
568572

569573
implicit def catsDataShowForNonEmptyVector[A: Show]: Show[NonEmptyVector[A]] = _.show
570574

@@ -637,3 +641,17 @@ object NonEmptyVector extends NonEmptyVectorInstances with Serializable {
637641
implicit def catsDataEqForZipNonEmptyVector[A: Eq]: Eq[ZipNonEmptyVector[A]] = Eq.by(_.value)
638642
}
639643
}
644+
645+
sealed abstract private[data] class NonEmptyVectorInstances0 extends NonEmptyVectorInstances1 {
646+
implicit def catsDataPartialOrderForNonEmptyVector[A: PartialOrder]: PartialOrder[NonEmptyVector[A]] =
647+
PartialOrder.by[NonEmptyVector[A], Vector[A]](_.toVector)
648+
}
649+
650+
sealed abstract private[data] class NonEmptyVectorInstances1 extends NonEmptyVectorInstances2 {
651+
implicit def catsDataHashForNonEmptyVector[A: Hash]: Hash[NonEmptyVector[A]] =
652+
Hash.by(_.toVector)
653+
}
654+
655+
sealed abstract private[data] class NonEmptyVectorInstances2 {
656+
implicit def catsDataEqForNonEmptyVector[A: Eq]: Eq[NonEmptyVector[A]] = _ === _
657+
}

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

+6
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ import cats.data.NonEmptyVector
2626
import cats.data.NonEmptyVector.ZipNonEmptyVector
2727
import cats.kernel.instances.order.catsKernelOrderingForOrder
2828
import cats.kernel.laws.discipline.EqTests
29+
import cats.kernel.laws.discipline.HashTests
30+
import cats.kernel.laws.discipline.OrderTests
2931
import cats.kernel.laws.discipline.SemigroupTests
32+
import cats.kernel.laws.discipline.PartialOrderTests
3033
import cats.laws.discipline._
3134
import cats.laws.discipline.arbitrary._
3235
import cats.platform.Platform
@@ -49,6 +52,9 @@ class NonEmptyVectorSuite extends NonEmptyCollectionSuite[Vector, NonEmptyVector
4952
Parameters.default.withMinSuccessfulTests(20).withMaxSize(Parameters.default.minSize + 5)
5053

5154
checkAll("NonEmptyVector[Int]", EqTests[NonEmptyVector[Int]].eqv)
55+
checkAll("NonEmptyVector[Int]", HashTests[NonEmptyVector[Int]].hash)
56+
checkAll("NonEmptyVector[Int]", OrderTests[NonEmptyVector[Int]].order)
57+
checkAll("NonEmptyVector[Int]", PartialOrderTests[NonEmptyVector[Int]].partialOrder)
5258

5359
checkAll("NonEmptyVector[Int] with Option",
5460
NonEmptyTraverseTests[NonEmptyVector].nonEmptyTraverse[Option, Int, Int, Int, Int, Option, Option]

0 commit comments

Comments
 (0)