Skip to content

Commit 3d5a5c2

Browse files
backported #2834 added CommutativeMonoid[Option[A]] instance, in binary compatible way (#3334)
1 parent f82cd0d commit 3d5a5c2

File tree

6 files changed

+19
-5
lines changed

6 files changed

+19
-5
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ trait AllInstancesBinCompat7
6969
with VectorInstancesBinCompat1
7070
with EitherInstancesBinCompat0
7171
with StreamInstancesBinCompat1
72+
with OptionInstancesBinCompat1
7273
with QueueInstancesBinCompat0
7374
with TailRecInstances
7475
with SortedSetInstancesBinCompat2

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package cats
22
package instances
33

4+
import cats.kernel.instances.OptionInstances3
5+
46
import scala.annotation.tailrec
57
import cats.data.Ior
68

@@ -172,3 +174,5 @@ private[instances] trait OptionInstancesBinCompat0 {
172174

173175
}
174176
}
177+
178+
private[instances] trait OptionInstancesBinCompat1 extends OptionInstances3

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ package object instances {
2121
object invariant extends InvariantMonoidalInstances
2222
object list extends ListInstances with ListInstancesBinCompat0 with ListInstancesBinCompat1
2323
object long extends LongInstances
24-
object option extends OptionInstances with OptionInstancesBinCompat0
24+
object option extends OptionInstances with OptionInstancesBinCompat0 with OptionInstancesBinCompat1
2525
object map extends MapInstances with MapInstancesBinCompat0 with MapInstancesBinCompat1
2626
object order extends OrderInstances
2727
object ordering extends OrderingInstances

kernel-laws/shared/src/test/scala/cats/kernel/laws/LawTests.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,8 @@ class Tests extends AnyFunSuiteLike with Discipline {
227227

228228
checkAll("Monoid[String]", MonoidTests[String].monoid)
229229
checkAll("Monoid[String]", SerializableTests.serializable(Monoid[String]))
230-
checkAll("Monoid[Option[Int]]", MonoidTests[Option[Int]].monoid)
231-
checkAll("Monoid[Option[Int]]", SerializableTests.serializable(Monoid[String]))
232230
checkAll("Monoid[Option[String]]", MonoidTests[Option[String]].monoid)
233-
checkAll("Monoid[Option[String]]", SerializableTests.serializable(Monoid[String]))
231+
checkAll("Monoid[Option[String]]", SerializableTests.serializable(Monoid[Option[String]]))
234232
checkAll("Monoid[List[Int]]", MonoidTests[List[Int]].monoid)
235233
checkAll("Monoid[List[Int]]", SerializableTests.serializable(Monoid[List[Int]]))
236234
checkAll("Monoid[Vector[Int]]", MonoidTests[Vector[Int]].monoid)
@@ -246,6 +244,8 @@ class Tests extends AnyFunSuiteLike with Discipline {
246244
checkAll("Monoid[Queue[Int]]", MonoidTests[Queue[Int]].monoid)
247245
checkAll("Monoid[Queue[Int]]", SerializableTests.serializable(Monoid[Queue[Int]]))
248246

247+
checkAll("CommutativeMonoid[Option[Int]]", CommutativeMonoidTests[Option[Int]].commutativeMonoid)
248+
checkAll("CommutativeMonoid[Option[Int]]", SerializableTests.serializable(CommutativeMonoid[Option[Int]]))
249249
checkAll("CommutativeMonoid[Map[String, Int]]", CommutativeMonoidTests[Map[String, Int]].commutativeMonoid)
250250
checkAll("CommutativeMonoid[Map[String, Int]]", SerializableTests.serializable(CommutativeMonoid[Map[String, Int]]))
251251
checkAll("CommutativeMonoid[SortedMap[String, Int]]",

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,4 @@ private[instances] trait AllInstancesBinCompat0 extends FiniteDurationInstances
3737

3838
private[instances] trait AllInstancesBinCompat1 extends SortedMapInstances with SortedSetInstances
3939

40-
private[instances] trait AllInstancesBinCompat2 extends SortedSetInstances2
40+
private[instances] trait AllInstancesBinCompat2 extends OptionInstances3 with SortedSetInstances2

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ private[instances] trait OptionInstances2 {
2323
new OptionEq[A]
2424
}
2525

26+
trait OptionInstances3 {
27+
implicit def catsKernelStdCommutativeMonoidForOption[A: CommutativeSemigroup]: CommutativeMonoid[Option[A]] =
28+
new OptionCommutativeMonoid[A]
29+
}
30+
2631
class OptionOrder[A](implicit A: Order[A]) extends Order[Option[A]] {
2732
def compare(x: Option[A], y: Option[A]): Int =
2833
x match {
@@ -80,3 +85,7 @@ class OptionMonoid[A](implicit A: Semigroup[A]) extends Monoid[Option[A]] {
8085
}
8186
}
8287
}
88+
89+
private class OptionCommutativeMonoid[A](implicit A: CommutativeSemigroup[A])
90+
extends OptionMonoid[A]()(A)
91+
with CommutativeMonoid[Option[A]]

0 commit comments

Comments
 (0)