diff --git a/core/src/main/scala-3.0.0-RC3/cats/derived/all.scala b/core/src/main/scala-3.0.0-RC3/cats/derived/all.scala index 151ad7ef..9434e033 100644 --- a/core/src/main/scala-3.0.0-RC3/cats/derived/all.scala +++ b/core/src/main/scala-3.0.0-RC3/cats/derived/all.scala @@ -1,13 +1,15 @@ package cats.derived object all extends + CommutativeMonoidDerivation, + CommutativeSemigroupDerivation, EmptyDerivation, - SemigroupDerivation, - MonoidDerivation, EqDerivation, - PartialOrderDerivation, - OrderDerivation, - HashDerivation, - FunctorDerivation, FoldableDerivation, + FunctorDerivation, + HashDerivation, + MonoidDerivation, + OrderDerivation, + PartialOrderDerivation, + SemigroupDerivation, TraverseDerivation diff --git a/core/src/main/scala-3.0.0-RC3/cats/derived/commutativeMonoid.scala b/core/src/main/scala-3.0.0-RC3/cats/derived/commutativeMonoid.scala new file mode 100644 index 00000000..4ec10ad6 --- /dev/null +++ b/core/src/main/scala-3.0.0-RC3/cats/derived/commutativeMonoid.scala @@ -0,0 +1,14 @@ +package cats.derived + +import cats.kernel.CommutativeMonoid +import shapeless3.deriving.K0 + +object commutativeMonoid extends CommutativeMonoidDerivation + +trait ProductCommutativeMonoid[T[x] <: CommutativeMonoid[x], A](using inst: K0.ProductInstances[T, A]) + extends ProductCommutativeSemigroup[T, A], ProductMonoid[T, A], CommutativeMonoid[A] {} + +trait CommutativeMonoidDerivation: + extension (F: CommutativeMonoid.type) + inline def derived[A](using gen: K0.ProductGeneric[A]): CommutativeMonoid[A] = + new ProductCommutativeMonoid[CommutativeMonoid, A]{} diff --git a/core/src/main/scala-3.0.0-RC3/cats/derived/commutativeSemigroup.scala b/core/src/main/scala-3.0.0-RC3/cats/derived/commutativeSemigroup.scala new file mode 100644 index 00000000..043d50d0 --- /dev/null +++ b/core/src/main/scala-3.0.0-RC3/cats/derived/commutativeSemigroup.scala @@ -0,0 +1,14 @@ +package cats.derived + +import cats.kernel.CommutativeSemigroup +import shapeless3.deriving.{K0, Continue} + +object commutativeSemigroup extends CommutativeSemigroupDerivation + +trait ProductCommutativeSemigroup[T[x] <: CommutativeSemigroup[x], A](using inst: K0.ProductInstances[T, A]) + extends ProductSemigroup[T, A], CommutativeSemigroup[A] {} + +trait CommutativeSemigroupDerivation: + extension (F: CommutativeSemigroup.type) + inline def derived[A](using gen: K0.ProductGeneric[A]): CommutativeSemigroup[A] = + new ProductCommutativeSemigroup[CommutativeSemigroup, A]{} diff --git a/core/src/main/scala-3.0.0-RC3/cats/derived/monoid.scala b/core/src/main/scala-3.0.0-RC3/cats/derived/monoid.scala index a715d8c3..e7e40765 100644 --- a/core/src/main/scala-3.0.0-RC3/cats/derived/monoid.scala +++ b/core/src/main/scala-3.0.0-RC3/cats/derived/monoid.scala @@ -5,7 +5,7 @@ import shapeless3.deriving.K0 object monoid extends MonoidDerivation -class ProductMonoid[F[x] <: Monoid[x], A]( +trait ProductMonoid[F[x] <: Monoid[x], A]( using inst: K0.ProductInstances[F, A] ) extends ProductSemigroup[F, A], Monoid[A]: val empty: A = inst.construct([A] => (F: F[A]) => F.empty) @@ -13,4 +13,4 @@ class ProductMonoid[F[x] <: Monoid[x], A]( trait MonoidDerivation: extension (M: Monoid.type) inline def derived[A](using gen: K0.ProductGeneric[A]): Monoid[A] = - ProductMonoid(using K0.mkProductInstances) + new ProductMonoid[Monoid, A]{} diff --git a/core/src/main/scala-3.0.0-RC3/cats/derived/semigroup.scala b/core/src/main/scala-3.0.0-RC3/cats/derived/semigroup.scala index 1a4540f9..86e8f508 100644 --- a/core/src/main/scala-3.0.0-RC3/cats/derived/semigroup.scala +++ b/core/src/main/scala-3.0.0-RC3/cats/derived/semigroup.scala @@ -5,7 +5,7 @@ import shapeless3.deriving.K0 object semigroup extends SemigroupDerivation -class ProductSemigroup[F[x] <: Semigroup[x], A]( +trait ProductSemigroup[F[x] <: Semigroup[x], A]( using inst: K0.ProductInstances[F, A] ) extends Semigroup[A]: def combine(x: A, y: A): A = @@ -14,4 +14,4 @@ class ProductSemigroup[F[x] <: Semigroup[x], A]( trait SemigroupDerivation: extension (S: Semigroup.type) inline def derived[A](using gen: K0.ProductGeneric[A]): Semigroup[A] = - ProductSemigroup(using K0.mkProductInstances) + new ProductSemigroup[Semigroup, A]{} diff --git a/core/src/test/scala-3.0.0-RC3/cats/derived/CommutativeMonoidTests.scala b/core/src/test/scala-3.0.0-RC3/cats/derived/CommutativeMonoidTests.scala new file mode 100644 index 00000000..7cd6378c --- /dev/null +++ b/core/src/test/scala-3.0.0-RC3/cats/derived/CommutativeMonoidTests.scala @@ -0,0 +1,10 @@ +package cats.derived + +import alleycats._ +import cats._ +import cats.kernel.CommutativeMonoid +import cats.derived.all._ + +class CommutativeMonoidTests { // + case class Foo(i: Int, b: Option[Int]) derives CommutativeMonoid +} diff --git a/core/src/test/scala-3.0.0-RC3/cats/derived/CommutativeSemigroupTests.scala b/core/src/test/scala-3.0.0-RC3/cats/derived/CommutativeSemigroupTests.scala new file mode 100644 index 00000000..44b0dbc1 --- /dev/null +++ b/core/src/test/scala-3.0.0-RC3/cats/derived/CommutativeSemigroupTests.scala @@ -0,0 +1,10 @@ +package cats.derived + +import alleycats._ +import cats._ +import cats.kernel.CommutativeSemigroup +import cats.derived.all._ + +class CommutativeSemigroupTests { // + case class Foo(i: Int, b: Option[Int]) derives CommutativeSemigroup +}