From 531d2560c44e92f3e2478dca056620c0ff04dfd7 Mon Sep 17 00:00:00 2001 From: Georgi Krastev Date: Thu, 11 Jan 2024 01:21:58 +0200 Subject: [PATCH] Use context bounds to simplify signatures Updates shapeless to 3.4.0 --- build.sbt | 2 +- .../cats/derived/DerivedAlternative.scala | 8 +-- .../cats/derived/DerivedApplicative.scala | 9 +-- .../scala-3/cats/derived/DerivedApply.scala | 9 +-- .../derived/DerivedCommutativeMonoid.scala | 8 +-- .../derived/DerivedCommutativeSemigroup.scala | 8 +-- .../cats/derived/DerivedContravariant.scala | 13 +++-- .../scala-3/cats/derived/DerivedEmpty.scala | 14 ++--- .../scala-3/cats/derived/DerivedEmptyK.scala | 15 ++--- .../main/scala-3/cats/derived/DerivedEq.scala | 15 ++--- .../cats/derived/DerivedFoldable.scala | 20 ++++--- .../scala-3/cats/derived/DerivedFunctor.scala | 14 +++-- .../scala-3/cats/derived/DerivedHash.scala | 21 +++---- .../cats/derived/DerivedInvariant.scala | 14 +++-- .../scala-3/cats/derived/DerivedMonoid.scala | 8 +-- .../scala-3/cats/derived/DerivedMonoidK.scala | 9 +-- .../derived/DerivedNonEmptyAlternative.scala | 8 +-- .../derived/DerivedNonEmptyTraverse.scala | 31 +++++------ .../scala-3/cats/derived/DerivedOrder.scala | 15 ++--- .../cats/derived/DerivedPartialOrder.scala | 15 ++--- .../scala-3/cats/derived/DerivedPure.scala | 11 ++-- .../cats/derived/DerivedReducible.scala | 27 ++++----- .../cats/derived/DerivedSemigroup.scala | 8 +-- .../cats/derived/DerivedSemigroupK.scala | 9 +-- .../scala-3/cats/derived/DerivedShow.scala | 19 ++++--- .../cats/derived/DerivedShowPretty.scala | 19 ++++--- .../cats/derived/DerivedTraverse.scala | 17 +++--- .../main/scala-3/cats/derived/package.scala | 55 ++++++++++--------- 28 files changed, 220 insertions(+), 201 deletions(-) diff --git a/build.sbt b/build.sbt index 0f690e6e..34fe24c6 100644 --- a/build.sbt +++ b/build.sbt @@ -14,7 +14,7 @@ val munitVersion = "1.0.0-M10" val disciplineMunitVersion = "2.0.0-M3" val kindProjectorVersion = "0.13.2" val shapeless2Version = "2.3.10" -val shapeless3Version = "3.3.0" +val shapeless3Version = "3.4.0" lazy val commonSettings = Seq( scalacOptions ++= Seq( diff --git a/core/src/main/scala-3/cats/derived/DerivedAlternative.scala b/core/src/main/scala-3/cats/derived/DerivedAlternative.scala index c35642e6..a9a61c6c 100644 --- a/core/src/main/scala-3/cats/derived/DerivedAlternative.scala +++ b/core/src/main/scala-3/cats/derived/DerivedAlternative.scala @@ -1,7 +1,7 @@ package cats.derived import cats.Alternative -import shapeless3.deriving.K1 +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -31,14 +31,14 @@ object DerivedAlternative: new Derived.Lazy(() => F.unify.compose(using G.unify)) with Alternative[[x] =>> F[G[x]]]: export delegate.* - given product[F[_]](using inst: => K1.ProductInstances[Or, F]): DerivedAlternative[F] = + given product[F[_]](using inst: => ProductInstances[Or, F]): DerivedAlternative[F] = Strict.product(using inst.unify) - trait Product[T[f[_]] <: Alternative[f], F[_]](using K1.ProductInstances[T, F]) + trait Product[T[f[_]] <: Alternative[f], F[_]: ProductInstancesOf[T]] extends Alternative[F], DerivedNonEmptyAlternative.Product[T, F], DerivedMonoidK.Product[T, F] object Strict: - given product[F[_]](using K1.ProductInstances[Alternative, F]): DerivedAlternative[F] = + given product[F[_]: ProductInstancesOf[Alternative]]: DerivedAlternative[F] = new Alternative[F] with Product[Alternative, F] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedApplicative.scala b/core/src/main/scala-3/cats/derived/DerivedApplicative.scala index cd688cc1..5ab4fb43 100644 --- a/core/src/main/scala-3/cats/derived/DerivedApplicative.scala +++ b/core/src/main/scala-3/cats/derived/DerivedApplicative.scala @@ -1,7 +1,8 @@ package cats.derived import cats.{Applicative, Monoid} -import shapeless3.deriving.{Const, K1} +import shapeless3.deriving.Const +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -33,13 +34,13 @@ object DerivedApplicative: new Derived.Lazy(() => F.unify.compose(using G.unify)) with Applicative[[x] =>> F[G[x]]]: export delegate.* - given [F[_]](using inst: => K1.ProductInstances[Or, F]): DerivedApplicative[F] = + given [F[_]](using inst: => ProductInstances[Or, F]): DerivedApplicative[F] = Strict.product(using inst.unify) @deprecated("Kept for binary compatibility", "3.2.0") protected given [F[_]: Or, G[_]: Or]: DerivedApplicative[[x] =>> F[G[x]]] = nested - trait Product[T[f[_]] <: Applicative[f], F[_]](using inst: K1.ProductInstances[T, F]) + trait Product[T[f[_]] <: Applicative[f], F[_]](using inst: ProductInstances[T, F]) extends Applicative[F], DerivedApply.Product[T, F]: @@ -47,5 +48,5 @@ object DerivedApplicative: inst.construct([f[_]] => (F: T[f]) => F.pure[A](x)) object Strict: - given product[F[_]](using K1.ProductInstances[Applicative, F]): DerivedApplicative[F] = + given product[F[_]: ProductInstancesOf[Applicative]]: DerivedApplicative[F] = new Applicative[F] with Product[Applicative, F] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedApply.scala b/core/src/main/scala-3/cats/derived/DerivedApply.scala index af64da81..c512472d 100644 --- a/core/src/main/scala-3/cats/derived/DerivedApply.scala +++ b/core/src/main/scala-3/cats/derived/DerivedApply.scala @@ -1,7 +1,8 @@ package cats.derived import cats.{Apply, Semigroup} -import shapeless3.deriving.{Const, K1} +import shapeless3.deriving.Const +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -33,18 +34,18 @@ object DerivedApply: new Derived.Lazy(() => F.unify.compose(using G.unify)) with Apply[[x] =>> F[G[x]]]: export delegate.* - given [F[_]](using inst: => K1.ProductInstances[Or, F]): DerivedApply[F] = + given [F[_]](using inst: => ProductInstances[Or, F]): DerivedApply[F] = Strict.product(using inst.unify) @deprecated("Kept for binary compatibility", "3.2.0") protected given [F[_]: Or, G[_]: Or]: DerivedApply[[x] =>> F[G[x]]] = nested - trait Product[T[f[_]] <: Apply[f], F[_]](using inst: K1.ProductInstances[T, F]) extends Apply[F]: + trait Product[T[f[_]] <: Apply[f], F[_]](using inst: ProductInstances[T, F]) extends Apply[F]: private lazy val F = new DerivedFunctor.Generic[T, F] {} final override def map[A, B](fa: F[A])(f: A => B): F[B] = F.map(fa)(f) final override def ap[A, B](ff: F[A => B])(fa: F[A]): F[B] = inst.map2(ff, fa)([f[_]] => (F: T[f], ff: f[A => B], fa: f[A]) => F.ap(ff)(fa)) object Strict: - given product[F[_]](using K1.ProductInstances[Apply, F]): DerivedApply[F] = + given product[F[_]: ProductInstancesOf[Apply]]: DerivedApply[F] = new Product[Apply, F] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedCommutativeMonoid.scala b/core/src/main/scala-3/cats/derived/DerivedCommutativeMonoid.scala index 3a994c36..a0c29cc1 100644 --- a/core/src/main/scala-3/cats/derived/DerivedCommutativeMonoid.scala +++ b/core/src/main/scala-3/cats/derived/DerivedCommutativeMonoid.scala @@ -1,7 +1,7 @@ package cats.derived import cats.kernel.CommutativeMonoid -import shapeless3.deriving.K0 +import shapeless3.deriving.K0.* import scala.annotation.* import scala.compiletime.* @@ -22,13 +22,13 @@ object DerivedCommutativeMonoid: import Strict.given summonInline[DerivedCommutativeMonoid[A]].instance - given [A](using inst: => K0.ProductInstances[Or, A]): DerivedCommutativeMonoid[A] = + given [A](using inst: => ProductInstances[Or, A]): DerivedCommutativeMonoid[A] = Strict.product(using inst.unify) - trait Product[F[x] <: CommutativeMonoid[x], A](using @unused inst: K0.ProductInstances[F, A]) + trait Product[F[x] <: CommutativeMonoid[x], A](using @unused inst: ProductInstances[F, A]) extends DerivedMonoid.Product[F, A], CommutativeMonoid[A] object Strict: - given product[A](using K0.ProductInstances[CommutativeMonoid, A]): DerivedCommutativeMonoid[A] = + given product[A: ProductInstancesOf[CommutativeMonoid]]: DerivedCommutativeMonoid[A] = new Product[CommutativeMonoid, A] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedCommutativeSemigroup.scala b/core/src/main/scala-3/cats/derived/DerivedCommutativeSemigroup.scala index c5c557a1..d5553741 100644 --- a/core/src/main/scala-3/cats/derived/DerivedCommutativeSemigroup.scala +++ b/core/src/main/scala-3/cats/derived/DerivedCommutativeSemigroup.scala @@ -1,7 +1,7 @@ package cats.derived import cats.kernel.CommutativeSemigroup -import shapeless3.deriving.K0 +import shapeless3.deriving.K0.* import scala.annotation.* import scala.compiletime.* @@ -22,13 +22,13 @@ object DerivedCommutativeSemigroup: import Strict.given summonInline[DerivedCommutativeSemigroup[A]].instance - given [A](using inst: => K0.ProductInstances[Or, A]): DerivedCommutativeSemigroup[A] = + given [A](using inst: => ProductInstances[Or, A]): DerivedCommutativeSemigroup[A] = Strict.product(using inst.unify) - trait Product[F[x] <: CommutativeSemigroup[x], A](using @unused inst: K0.ProductInstances[F, A]) + trait Product[F[x] <: CommutativeSemigroup[x], A](using @unused inst: ProductInstances[F, A]) extends DerivedSemigroup.Product[F, A], CommutativeSemigroup[A] object Strict: - given product[A](using K0.ProductInstances[CommutativeSemigroup, A]): DerivedCommutativeSemigroup[A] = + given product[A: ProductInstancesOf[CommutativeSemigroup]]: DerivedCommutativeSemigroup[A] = new Product[CommutativeSemigroup, A] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedContravariant.scala b/core/src/main/scala-3/cats/derived/DerivedContravariant.scala index f902c802..9283ae37 100644 --- a/core/src/main/scala-3/cats/derived/DerivedContravariant.scala +++ b/core/src/main/scala-3/cats/derived/DerivedContravariant.scala @@ -1,7 +1,8 @@ package cats.derived import cats.Contravariant -import shapeless3.deriving.{Const, K1} +import shapeless3.deriving.Const +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -33,20 +34,20 @@ object DerivedContravariant: new Derived.Lazy(() => F.unify.composeContravariant(using G.unify)) with Contravariant[[x] =>> F[G[x]]]: export delegate.* - given [F[_]](using inst: => K1.Instances[Or, F]): DerivedContravariant[F] = + given [F[_]](using inst: => Instances[Or, F]): DerivedContravariant[F] = generic(using inst.unify) @deprecated("Kept for binary compatibility", "3.2.0") protected given [F[_]: DerivedFunctor.Or, G[_]: Or]: DerivedContravariant[[x] =>> F[G[x]]] = nested - private def generic[F[_]](using K1.Instances[Contravariant, F]): DerivedContravariant[F] = + private def generic[F[_]: InstancesOf[Contravariant]]: DerivedContravariant[F] = new Generic[Contravariant, F] {} - trait Generic[T[f[_]] <: Contravariant[f], F[_]](using inst: K1.Instances[T, F]) extends Contravariant[F]: + trait Generic[T[f[_]] <: Contravariant[f], F[_]](using inst: Instances[T, F]) extends Contravariant[F]: final override def contramap[A, B](fa: F[A])(f: B => A): F[B] = inst.map(fa)([f[_]] => (T: T[f], fa: f[A]) => T.contramap(fa)(f)) object Strict: - given product[F[_]](using K1.ProductInstances[Contravariant, F]): DerivedContravariant[F] = generic - given coproduct[F[_]](using inst: => K1.CoproductInstances[Or, F]): DerivedContravariant[F] = + given product[F[_]: ProductInstancesOf[Contravariant]]: DerivedContravariant[F] = generic + given coproduct[F[_]](using inst: => CoproductInstances[Or, F]): DerivedContravariant[F] = generic(using inst.unify) diff --git a/core/src/main/scala-3/cats/derived/DerivedEmpty.scala b/core/src/main/scala-3/cats/derived/DerivedEmpty.scala index 0df77a60..4e62fcbe 100644 --- a/core/src/main/scala-3/cats/derived/DerivedEmpty.scala +++ b/core/src/main/scala-3/cats/derived/DerivedEmpty.scala @@ -1,7 +1,7 @@ package cats.derived import alleycats.Empty -import shapeless3.deriving.K0 +import shapeless3.deriving.K0.* import scala.annotation.* import scala.compiletime.* @@ -24,12 +24,12 @@ object DerivedEmpty: import Strict.given summonInline[DerivedEmpty[A]].instance - given product[A](using inst: K0.ProductInstances[Or, A]): DerivedEmpty[A] = Strict.product(using inst.unify) - inline given coproduct[A](using gen: K0.CoproductGeneric[A]): DerivedEmpty[A] = Strict.coproduct + given product[A: ProductInstancesOf[Or]]: DerivedEmpty[A] = Strict.product(using ProductInstances.unify) + inline given coproduct[A: CoproductGeneric]: DerivedEmpty[A] = Strict.coproduct object Strict: - given product[A](using inst: K0.ProductInstances[Empty, A]): DerivedEmpty[A] = - Empty(inst.construct([a] => (A: Empty[a]) => A.empty)) + given product[A: ProductInstancesOf[Empty]]: DerivedEmpty[A] = + Empty(ProductInstances.construct([a] => (A: Empty[a]) => A.empty)) - inline given coproduct[A](using gen: K0.CoproductGeneric[A]): DerivedEmpty[A] = - Empty(gen.withOnly[Or, A]([a <: A] => (A: Or[a]) => A.unify.empty)) + inline given coproduct[A: CoproductGeneric]: DerivedEmpty[A] = + Empty(CoproductGeneric.withOnly[Or, A]([a <: A] => (A: Or[a]) => A.unify.empty)) diff --git a/core/src/main/scala-3/cats/derived/DerivedEmptyK.scala b/core/src/main/scala-3/cats/derived/DerivedEmptyK.scala index 250f4962..e76f7645 100644 --- a/core/src/main/scala-3/cats/derived/DerivedEmptyK.scala +++ b/core/src/main/scala-3/cats/derived/DerivedEmptyK.scala @@ -1,7 +1,8 @@ package cats.derived import alleycats.{Empty, EmptyK} -import shapeless3.deriving.{Const, K1} +import shapeless3.deriving.Const +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.summonInline @@ -44,8 +45,8 @@ object DerivedEmptyK: lazy val g = G.unify def empty[A]: F[G[A]] = f.pure(g.empty) - given product[F[_]](using inst: K1.ProductInstances[Or, F]): DerivedEmptyK[F] = Strict.product(using inst.unify) - inline given coproduct[F[_]](using K1.CoproductGeneric[F]): DerivedEmptyK[F] = Strict.coproduct + given product[F[_]: ProductInstancesOf[Or]]: DerivedEmptyK[F] = Strict.product(using ProductInstances.unify) + inline given coproduct[F[_]: CoproductGeneric]: DerivedEmptyK[F] = Strict.coproduct @deprecated("Kept for binary compatibility", "3.2.0") protected given [F[_], G[_]](using F: Or[F]): DerivedEmptyK[[x] =>> F[G[x]]] = @@ -58,8 +59,8 @@ object DerivedEmptyK: nested(using ev) object Strict: - given product[F[_]](using inst: K1.ProductInstances[EmptyK, F]): DerivedEmptyK[F] = new EmptyK[F]: - def empty[A]: F[A] = inst.construct([f[_]] => (F: EmptyK[f]) => F.empty[A]) + given product[F[_]: ProductInstancesOf[EmptyK]]: DerivedEmptyK[F] = new EmptyK[F]: + def empty[A]: F[A] = ProductInstances.construct([f[_]] => (F: EmptyK[f]) => F.empty[A]) - inline given coproduct[F[_]](using gen: K1.CoproductGeneric[F]): DerivedEmptyK[F] = - gen.withOnly[Or, EmptyK[F]]([f[x] <: F[x]] => (F: Or[f]) => F.unify.asInstanceOf[EmptyK[F]]) + inline given coproduct[F[_]: CoproductGeneric]: DerivedEmptyK[F] = + CoproductGeneric.withOnly[Or, EmptyK[F]]([f[x] <: F[x]] => (F: Or[f]) => F.unify.asInstanceOf[EmptyK[F]]) diff --git a/core/src/main/scala-3/cats/derived/DerivedEq.scala b/core/src/main/scala-3/cats/derived/DerivedEq.scala index a24757ff..f7b1f48b 100644 --- a/core/src/main/scala-3/cats/derived/DerivedEq.scala +++ b/core/src/main/scala-3/cats/derived/DerivedEq.scala @@ -1,7 +1,8 @@ package cats.derived import cats.Eq -import shapeless3.deriving.{Complete, K0} +import shapeless3.deriving.Complete +import shapeless3.deriving.K0.* import scala.annotation.* import scala.compiletime.* @@ -27,22 +28,22 @@ object DerivedEq: given singleton[A <: Singleton: ValueOf]: DerivedEq[A] = Eq.allEqual - given product[A](using inst: => K0.ProductInstances[Or, A]): DerivedEq[A] = + given product[A](using inst: => ProductInstances[Or, A]): DerivedEq[A] = Strict.product(using inst.unify) - given coproduct[A](using inst: => K0.CoproductInstances[Or, A]): DerivedEq[A] = - given K0.CoproductInstances[Eq, A] = inst.unify + given coproduct[A](using inst: => CoproductInstances[Or, A]): DerivedEq[A] = + given CoproductInstances[Eq, A] = inst.unify new Coproduct[Eq, A] {} - trait Product[F[x] <: Eq[x], A](using inst: K0.ProductInstances[F, A]) extends Eq[A]: + trait Product[F[x] <: Eq[x], A](using inst: ProductInstances[F, A]) extends Eq[A]: final override def eqv(x: A, y: A): Boolean = inst.foldLeft2(x, y)(true: Boolean): [t] => (acc: Boolean, eqt: F[t], x: t, y: t) => Complete(!eqt.eqv(x, y))(false)(true) - trait Coproduct[F[x] <: Eq[x], A](using inst: K0.CoproductInstances[F, A]) extends Eq[A]: + trait Coproduct[F[x] <: Eq[x], A](using inst: CoproductInstances[F, A]) extends Eq[A]: final override def eqv(x: A, y: A): Boolean = inst.fold2(x, y)(false): [t] => (eqt: F[t], x: t, y: t) => eqt.eqv(x, y) object Strict: export DerivedEq.coproduct - given product[A](using K0.ProductInstances[Eq, A]): DerivedEq[A] = + given product[A: ProductInstancesOf[Eq]]: DerivedEq[A] = new Product[Eq, A] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedFoldable.scala b/core/src/main/scala-3/cats/derived/DerivedFoldable.scala index cfc59e66..b3b0df8c 100644 --- a/core/src/main/scala-3/cats/derived/DerivedFoldable.scala +++ b/core/src/main/scala-3/cats/derived/DerivedFoldable.scala @@ -1,7 +1,8 @@ package cats.derived import cats.{Eval, Foldable} -import shapeless3.deriving.{Const, Continue, K1} +import shapeless3.deriving.{Const, Continue} +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -34,13 +35,16 @@ object DerivedFoldable: new Derived.Lazy(() => F.unify.compose(using G.unify)) with Foldable[[x] =>> F[G[x]]]: export delegate.* - given [F[_]](using inst: K1.ProductInstances[Or, F]): DerivedFoldable[F] = Strict.product(using inst.unify) - given [F[_]](using => K1.CoproductInstances[Or, F]): DerivedFoldable[F] = Strict.coproduct + given [F[_]: ProductInstancesOf[Or]]: DerivedFoldable[F] = + Strict.product(using ProductInstances.unify) + + given [F[_]](using => CoproductInstances[Or, F]): DerivedFoldable[F] = + Strict.coproduct @deprecated("Kept for binary compatibility", "3.2.0") protected given [F[_]: Or, G[_]: Or]: DerivedFoldable[[x] =>> F[G[x]]] = nested - trait Product[T[f[_]] <: Foldable[f], F[_]](using inst: K1.ProductInstances[T, F]) extends Foldable[F]: + trait Product[T[f[_]] <: Foldable[f], F[_]](using inst: ProductInstances[T, F]) extends Foldable[F]: final override def foldLeft[A, B](fa: F[A], b: B)(f: (B, A) => B): B = inst.foldLeft(fa)(b)([f[_]] => (b: B, F: T[f], fa: f[A]) => Continue(F.foldLeft(fa, b)(f))) @@ -48,7 +52,7 @@ object DerivedFoldable: inst.foldRight(fa)(lb): [f[_]] => (F: T[f], fa: f[A], lb: Eval[B]) => Continue(Eval.defer(F.foldRight(fa, lb)(f))) - trait Coproduct[T[f[_]] <: Foldable[f], F[_]](using inst: K1.CoproductInstances[T, F]) extends Foldable[F]: + trait Coproduct[T[f[_]] <: Foldable[f], F[_]](using inst: CoproductInstances[T, F]) extends Foldable[F]: final override def foldLeft[A, B](fa: F[A], b: B)(f: (B, A) => B): B = inst.fold(fa)([f[_]] => (F: T[f], fa: f[A]) => F.foldLeft(fa, b)(f)) @@ -56,9 +60,9 @@ object DerivedFoldable: inst.fold(fa)([f[_]] => (F: T[f], fa: f[A]) => Eval.defer(F.foldRight(fa, lb)(f))) object Strict: - given product[F[_]](using K1.ProductInstances[Foldable, F]): DerivedFoldable[F] = + given product[F[_]: ProductInstancesOf[Foldable]]: DerivedFoldable[F] = new Product[Foldable, F] {} - given coproduct[F[_]](using inst: => K1.CoproductInstances[Or, F]): DerivedFoldable[F] = - given K1.CoproductInstances[Foldable, F] = inst.unify + given coproduct[F[_]](using inst: => CoproductInstances[Or, F]): DerivedFoldable[F] = + given CoproductInstances[Foldable, F] = inst.unify new Coproduct[Foldable, F] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedFunctor.scala b/core/src/main/scala-3/cats/derived/DerivedFunctor.scala index 4d7e1e62..d4ff974e 100644 --- a/core/src/main/scala-3/cats/derived/DerivedFunctor.scala +++ b/core/src/main/scala-3/cats/derived/DerivedFunctor.scala @@ -1,7 +1,8 @@ package cats.derived import cats.Functor -import shapeless3.deriving.{Const, K1} +import shapeless3.deriving.Const +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -40,7 +41,7 @@ object DerivedFunctor: ): DerivedFunctor[[x] =>> F[G[x]]] = F.unify.compose(using G.unify) - given [F[_]](using inst: => K1.Instances[Or, F]): DerivedFunctor[F] = + given [F[_]](using inst: => Instances[Or, F]): DerivedFunctor[F] = generic(using inst.unify) @deprecated("Kept for binary compatibility", "3.2.0") @@ -54,13 +55,14 @@ object DerivedFunctor: ): DerivedFunctor[[x] =>> F[G[x]]] = nested(using F, G) - private def generic[F[_]](using K1.Instances[Functor, F]): DerivedFunctor[F] = + private def generic[F[_]: InstancesOf[Functor]]: DerivedFunctor[F] = new Generic[Functor, F] {} - trait Generic[T[f[_]] <: Functor[f], F[_]](using inst: K1.Instances[T, F]) extends Functor[F]: + trait Generic[T[f[_]] <: Functor[f], F[_]](using inst: Instances[T, F]) extends Functor[F]: final override def map[A, B](fa: F[A])(f: A => B): F[B] = inst.map(fa)([f[_]] => (F: T[f], fa: f[A]) => F.map(fa)(f)) object Strict: - given product[F[_]](using K1.ProductInstances[Functor, F]): DerivedFunctor[F] = generic - given coproduct[F[_]](using inst: => K1.CoproductInstances[Or, F]): DerivedFunctor[F] = generic(using inst.unify) + given product[F[_]: ProductInstancesOf[Functor]]: DerivedFunctor[F] = generic + given coproduct[F[_]](using inst: => CoproductInstances[Or, F]): DerivedFunctor[F] = + generic(using inst.unify) diff --git a/core/src/main/scala-3/cats/derived/DerivedHash.scala b/core/src/main/scala-3/cats/derived/DerivedHash.scala index 87f4d542..4f6261e3 100644 --- a/core/src/main/scala-3/cats/derived/DerivedHash.scala +++ b/core/src/main/scala-3/cats/derived/DerivedHash.scala @@ -1,7 +1,8 @@ package cats.derived import cats.Hash -import shapeless3.deriving.{K0, Continue} +import shapeless3.deriving.Continue +import shapeless3.deriving.K0.* import scala.annotation.* import scala.compiletime.* @@ -37,14 +38,14 @@ object DerivedHash: given string[A <: String]: DerivedHash[A] = Hash.fromUniversalHashCode given symbol[A <: Symbol]: DerivedHash[A] = Hash.fromUniversalHashCode - given product[A <: scala.Product](using inst: => K0.ProductInstances[Or, A]): DerivedHash[A] = + given product[A <: scala.Product](using inst: => ProductInstances[Or, A]): DerivedHash[A] = Strict.product(using inst.unify) - given coproduct[A](using inst: => K0.CoproductInstances[Or, A]): DerivedHash[A] = - given K0.CoproductInstances[Hash, A] = inst.unify + given coproduct[A](using inst: => CoproductInstances[Or, A]): DerivedHash[A] = + given CoproductInstances[Hash, A] = inst.unify new Coproduct[Hash, A] {} - trait Product[F[x] <: Hash[x], A <: scala.Product](using inst: K0.ProductInstances[F, A]) + trait Product[F[x] <: Hash[x], A <: scala.Product](using inst: ProductInstances[F, A]) extends DerivedEq.Product[F, A], Hash[A]: @@ -57,14 +58,10 @@ object DerivedHash: [t] => (acc: Int, h: F[t], x: t) => Continue(MurmurHash3.mix(acc, h.hash(x))) MurmurHash3.finalizeHash(hash, arity) - trait Coproduct[F[x] <: Hash[x], A](using inst: K0.CoproductInstances[F, A]) - extends DerivedEq.Coproduct[F, A], - Hash[A]: - - final override def hash(x: A): Int = - inst.fold[Int](x)([t] => (h: F[t], x: t) => h.hash(x)) + trait Coproduct[F[x] <: Hash[x], A](using inst: CoproductInstances[F, A]) extends DerivedEq.Coproduct[F, A], Hash[A]: + final override def hash(x: A): Int = inst.fold[Int](x)([t] => (h: F[t], x: t) => h.hash(x)) object Strict: export DerivedHash.coproduct - given product[A <: scala.Product](using K0.ProductInstances[Hash, A]): DerivedHash[A] = + given product[A <: scala.Product: ProductInstancesOf[Hash]]: DerivedHash[A] = new Product[Hash, A] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedInvariant.scala b/core/src/main/scala-3/cats/derived/DerivedInvariant.scala index 9d496251..36464eac 100644 --- a/core/src/main/scala-3/cats/derived/DerivedInvariant.scala +++ b/core/src/main/scala-3/cats/derived/DerivedInvariant.scala @@ -1,7 +1,8 @@ package cats.derived import cats.Invariant -import shapeless3.deriving.{Const, K1} +import shapeless3.deriving.Const +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -33,19 +34,20 @@ object DerivedInvariant: new Derived.Lazy(() => F.unify.compose(using G.unify)) with Invariant[[x] =>> F[G[x]]]: export delegate.* - given [F[_]](using inst: => K1.Instances[Or, F]): DerivedInvariant[F] = + given [F[_]](using inst: => Instances[Or, F]): DerivedInvariant[F] = generic(using inst.unify) @deprecated("Kept for binary compatibility", "3.2.0") protected given [F[_]: Or, G[_]: Or]: DerivedInvariant[[x] =>> F[G[x]]] = nested - private def generic[F[_]](using K1.Instances[Invariant, F]): DerivedInvariant[F] = + private def generic[F[_]: InstancesOf[Invariant]]: DerivedInvariant[F] = new Generic[Invariant, F] {} - trait Generic[T[f[_]] <: Invariant[f], F[_]](using inst: K1.Instances[T, F]) extends Invariant[F]: + trait Generic[T[f[_]] <: Invariant[f], F[_]](using inst: Instances[T, F]) extends Invariant[F]: final override def imap[A, B](fa: F[A])(f: A => B)(g: B => A): F[B] = inst.map(fa)([f[_]] => (F: T[f], fa: f[A]) => F.imap(fa)(f)(g)) object Strict: - given product[F[_]](using K1.ProductInstances[Invariant, F]): DerivedInvariant[F] = generic - given coproduct[F[_]](using inst: => K1.CoproductInstances[Or, F]): DerivedInvariant[F] = generic(using inst.unify) + given product[F[_]: ProductInstancesOf[Invariant]]: DerivedInvariant[F] = generic + given coproduct[F[_]](using inst: => CoproductInstances[Or, F]): DerivedInvariant[F] = + generic(using inst.unify) diff --git a/core/src/main/scala-3/cats/derived/DerivedMonoid.scala b/core/src/main/scala-3/cats/derived/DerivedMonoid.scala index d16ecc0c..fee400ac 100644 --- a/core/src/main/scala-3/cats/derived/DerivedMonoid.scala +++ b/core/src/main/scala-3/cats/derived/DerivedMonoid.scala @@ -1,7 +1,7 @@ package cats.derived import cats.Monoid -import shapeless3.deriving.K0 +import shapeless3.deriving.K0.* import scala.annotation.* import scala.compiletime.* @@ -22,15 +22,15 @@ object DerivedMonoid: import Strict.given summonInline[DerivedMonoid[A]].instance - given [A](using inst: => K0.ProductInstances[Or, A]): DerivedMonoid[A] = + given [A](using inst: => ProductInstances[Or, A]): DerivedMonoid[A] = Strict.product(using inst.unify) - trait Product[F[x] <: Monoid[x], A](using inst: K0.ProductInstances[F, A]) + trait Product[F[x] <: Monoid[x], A](using inst: ProductInstances[F, A]) extends DerivedSemigroup.Product[F, A], Monoid[A]: final override lazy val empty: A = inst.construct([A] => (F: F[A]) => F.empty) object Strict: - given product[A](using K0.ProductInstances[Monoid, A]): DerivedMonoid[A] = + given product[A: ProductInstancesOf[Monoid]]: DerivedMonoid[A] = new Product[Monoid, A] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedMonoidK.scala b/core/src/main/scala-3/cats/derived/DerivedMonoidK.scala index 4c68cf85..6adfe419 100644 --- a/core/src/main/scala-3/cats/derived/DerivedMonoidK.scala +++ b/core/src/main/scala-3/cats/derived/DerivedMonoidK.scala @@ -1,7 +1,8 @@ package cats.derived import cats.{Monoid, MonoidK} -import shapeless3.deriving.{Const, K1} +import shapeless3.deriving.Const +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -44,7 +45,7 @@ object DerivedMonoidK: def empty[A]: F[G[A]] = f.pure(g.empty[A]) def combineK[A](x: F[G[A]], y: F[G[A]]): F[G[A]] = f.map2(x, y)(g.combineK) - given [F[_]](using inst: => K1.ProductInstances[Or, F]): DerivedMonoidK[F] = + given [F[_]](using inst: => ProductInstances[Or, F]): DerivedMonoidK[F] = Strict.product(using inst.unify) @deprecated("Kept for binary compatibility", "3.2.0") @@ -57,7 +58,7 @@ object DerivedMonoidK: )(using F: DerivedApplicative.Or[F], G: Or[G]): DerivedMonoidK[[x] =>> F[G[x]]] = nested(using ev) - trait Product[T[f[_]] <: MonoidK[f], F[_]](using inst: K1.ProductInstances[T, F]) + trait Product[T[f[_]] <: MonoidK[f], F[_]](using inst: ProductInstances[T, F]) extends MonoidK[F], DerivedSemigroupK.Product[T, F]: @@ -65,5 +66,5 @@ object DerivedMonoidK: inst.construct([f[_]] => (F: T[f]) => F.empty[A]) object Strict: - given product[F[_]](using K1.ProductInstances[MonoidK, F]): DerivedMonoidK[F] = + given product[F[_]: ProductInstancesOf[MonoidK]]: DerivedMonoidK[F] = new Product[MonoidK, F] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedNonEmptyAlternative.scala b/core/src/main/scala-3/cats/derived/DerivedNonEmptyAlternative.scala index a6c24022..7496a5fd 100644 --- a/core/src/main/scala-3/cats/derived/DerivedNonEmptyAlternative.scala +++ b/core/src/main/scala-3/cats/derived/DerivedNonEmptyAlternative.scala @@ -1,7 +1,7 @@ package cats.derived import cats.NonEmptyAlternative -import shapeless3.deriving.K1 +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -31,14 +31,14 @@ object DerivedNonEmptyAlternative: new Derived.Lazy(() => F.unify.compose(using G.unify)) with NonEmptyAlternative[[x] =>> F[G[x]]]: export delegate.* - given product[F[_]](using inst: => K1.ProductInstances[Or, F]): DerivedNonEmptyAlternative[F] = + given product[F[_]](using inst: => ProductInstances[Or, F]): DerivedNonEmptyAlternative[F] = Strict.product(using inst.unify) - trait Product[T[f[_]] <: NonEmptyAlternative[f], F[_]](using K1.ProductInstances[T, F]) + trait Product[T[f[_]] <: NonEmptyAlternative[f], F[_]: ProductInstancesOf[T]] extends NonEmptyAlternative[F], DerivedApplicative.Product[T, F], DerivedSemigroupK.Product[T, F] object Strict: - given product[F[_]](using K1.ProductInstances[NonEmptyAlternative, F]): DerivedNonEmptyAlternative[F] = + given product[F[_]: ProductInstancesOf[NonEmptyAlternative]]: DerivedNonEmptyAlternative[F] = new NonEmptyAlternative[F] with Product[NonEmptyAlternative, F] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedNonEmptyTraverse.scala b/core/src/main/scala-3/cats/derived/DerivedNonEmptyTraverse.scala index 078304be..c0714a0a 100644 --- a/core/src/main/scala-3/cats/derived/DerivedNonEmptyTraverse.scala +++ b/core/src/main/scala-3/cats/derived/DerivedNonEmptyTraverse.scala @@ -1,7 +1,7 @@ package cats.derived import cats.{Applicative, Apply, NonEmptyTraverse, Traverse} -import shapeless3.deriving.K1 +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -31,22 +31,20 @@ object DerivedNonEmptyTraverse: new Derived.Lazy(() => F.unify.compose(using G.unify)) with NonEmptyTraverse[[x] =>> F[G[x]]]: export delegate.* - def product[F[_]](ev: NonEmptyTraverse[?])(using - inst: K1.ProductInstances[DerivedTraverse.Or, F] - ): DerivedNonEmptyTraverse[F] = - Strict.product(ev)(using inst.unify) + def product[F[_]: ProductInstancesOf[DerivedTraverse.Or]](ev: NonEmptyTraverse[?]): DerivedNonEmptyTraverse[F] = + Strict.product(ev)(using ProductInstances.unify) - inline given product[F[_]](using gen: K1.ProductGeneric[F]): DerivedNonEmptyTraverse[F] = - product(K1.summonFirst[Or, gen.MirroredElemTypes].unify) + inline given product[F[_]](using gen: ProductGeneric[F]): DerivedNonEmptyTraverse[F] = + product(summonFirst[Or, gen.MirroredElemTypes].unify) - given [F[_]](using => K1.CoproductInstances[Or, F]): DerivedNonEmptyTraverse[F] = + given [F[_]](using => CoproductInstances[Or, F]): DerivedNonEmptyTraverse[F] = Strict.coproduct @deprecated("Kept for binary compatibility", "3.2.0") protected given [F[_]: Or, G[_]: Or]: DerivedNonEmptyTraverse[[x] =>> F[G[x]]] = nested trait Product[T[x[_]] <: Traverse[x], F[_]](@unused ev: NonEmptyTraverse[?])(using - @unused inst: K1.ProductInstances[T, F] + @unused inst: ProductInstances[T, F] ) extends NonEmptyTraverse[F], DerivedReducible.Product[T, F], DerivedTraverse.Product[T, F]: @@ -56,9 +54,8 @@ object DerivedNonEmptyTraverse: case Left(value) => value case Right(_) => ??? - trait Coproduct[T[x[_]] <: NonEmptyTraverse[x], F[_]](using - inst: K1.CoproductInstances[T, F] - ) extends NonEmptyTraverse[F], + trait Coproduct[T[x[_]] <: NonEmptyTraverse[x], F[_]](using inst: CoproductInstances[T, F]) + extends NonEmptyTraverse[F], DerivedReducible.Coproduct[T, F], DerivedTraverse.Coproduct[T, F]: @@ -78,15 +75,15 @@ object DerivedNonEmptyTraverse: case (Right(f), Right(a)) => Right(f(a)) object Strict: - def product[F[_]](ev: NonEmptyTraverse[?])(using K1.ProductInstances[Traverse, F]): DerivedNonEmptyTraverse[F] = + def product[F[_]: ProductInstancesOf[Traverse]](ev: NonEmptyTraverse[?]): DerivedNonEmptyTraverse[F] = new Product[Traverse, F](ev) with DerivedReducible.Product[Traverse, F](ev) with DerivedTraverse.Product[Traverse, F] with DerivedFunctor.Generic[Traverse, F] {} - inline given product[F[_]](using gen: K1.ProductGeneric[F]): DerivedNonEmptyTraverse[F] = - product(K1.summonFirst[NonEmptyTraverse, gen.MirroredElemTypes]) + inline given product[F[_]](using gen: ProductGeneric[F]): DerivedNonEmptyTraverse[F] = + product(summonFirst[NonEmptyTraverse, gen.MirroredElemTypes]) - given coproduct[F[_]](using inst: => K1.CoproductInstances[Or, F]): DerivedNonEmptyTraverse[F] = - given K1.CoproductInstances[NonEmptyTraverse, F] = inst.unify + given coproduct[F[_]](using inst: => CoproductInstances[Or, F]): DerivedNonEmptyTraverse[F] = + given CoproductInstances[NonEmptyTraverse, F] = inst.unify new NonEmptyTraverse[F] with Coproduct[NonEmptyTraverse, F] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedOrder.scala b/core/src/main/scala-3/cats/derived/DerivedOrder.scala index 3eb6a575..fc322392 100644 --- a/core/src/main/scala-3/cats/derived/DerivedOrder.scala +++ b/core/src/main/scala-3/cats/derived/DerivedOrder.scala @@ -1,7 +1,8 @@ package cats.derived import cats.Order -import shapeless3.deriving.{Complete, K0} +import shapeless3.deriving.Complete +import shapeless3.deriving.K0.* import scala.annotation.* import scala.compiletime.* @@ -27,14 +28,14 @@ object DerivedOrder: given singleton[A <: Singleton: ValueOf]: DerivedOrder[A] = Order.allEqual - given product[A](using inst: => K0.ProductInstances[Or, A]): DerivedOrder[A] = + given product[A](using inst: => ProductInstances[Or, A]): DerivedOrder[A] = Strict.product(using inst.unify) - given coproduct[A](using inst: => K0.CoproductInstances[Or, A]): DerivedOrder[A] = - given K0.CoproductInstances[Order, A] = inst.unify + given coproduct[A](using inst: => CoproductInstances[Or, A]): DerivedOrder[A] = + given CoproductInstances[Order, A] = inst.unify new Coproduct[Order, A] {} - trait Product[T[x] <: Order[x], A](using inst: K0.ProductInstances[T, A]) extends Order[A]: + trait Product[T[x] <: Order[x], A](using inst: ProductInstances[T, A]) extends Order[A]: def compare(x: A, y: A): Int = inst.foldLeft2(x, y)(0: Int): [t] => @@ -42,12 +43,12 @@ object DerivedOrder: val cmp = ord.compare(t0, t1) Complete(cmp != 0)(cmp)(acc) - trait Coproduct[T[x] <: Order[x], A](using inst: K0.CoproductInstances[T, A]) extends Order[A]: + trait Coproduct[T[x] <: Order[x], A](using inst: CoproductInstances[T, A]) extends Order[A]: def compare(x: A, y: A): Int = inst.fold2(x, y)((x: Int, y: Int) => x - y): [t] => (ord: T[t], t0: t, t1: t) => ord.compare(t0, t1) object Strict: export DerivedOrder.coproduct - given product[A](using K0.ProductInstances[Order, A]): DerivedOrder[A] = + given product[A: ProductInstancesOf[Order]]: DerivedOrder[A] = new Product[Order, A] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedPartialOrder.scala b/core/src/main/scala-3/cats/derived/DerivedPartialOrder.scala index da0dfe9e..e8f41867 100644 --- a/core/src/main/scala-3/cats/derived/DerivedPartialOrder.scala +++ b/core/src/main/scala-3/cats/derived/DerivedPartialOrder.scala @@ -1,7 +1,8 @@ package cats.derived import cats.{Order, PartialOrder} -import shapeless3.deriving.{Complete, K0} +import shapeless3.deriving.Complete +import shapeless3.deriving.K0.* import scala.annotation.* import scala.compiletime.* @@ -27,14 +28,14 @@ object DerivedPartialOrder: given singleton[A <: Singleton: ValueOf]: DerivedPartialOrder[A] = Order.allEqual - given product[A](using inst: => K0.ProductInstances[Or, A]): DerivedPartialOrder[A] = + given product[A](using inst: => ProductInstances[Or, A]): DerivedPartialOrder[A] = Strict.product(using inst.unify) - given coproduct[A](using inst: => K0.CoproductInstances[Or, A]): DerivedPartialOrder[A] = - given K0.CoproductInstances[PartialOrder, A] = inst.unify + given coproduct[A](using inst: => CoproductInstances[Or, A]): DerivedPartialOrder[A] = + given CoproductInstances[PartialOrder, A] = inst.unify new Coproduct[PartialOrder, A] {} - trait Product[T[x] <: PartialOrder[x], A](using inst: K0.ProductInstances[T, A]) extends PartialOrder[A]: + trait Product[T[x] <: PartialOrder[x], A](using inst: ProductInstances[T, A]) extends PartialOrder[A]: def partialCompare(x: A, y: A): Double = inst.foldLeft2(x, y)(0: Double): [t] => @@ -42,12 +43,12 @@ object DerivedPartialOrder: val cmp = ord.partialCompare(t0, t1) Complete(cmp != 0)(cmp)(acc) - trait Coproduct[T[x] <: PartialOrder[x], A](using inst: K0.CoproductInstances[T, A]) extends PartialOrder[A]: + trait Coproduct[T[x] <: PartialOrder[x], A](using inst: CoproductInstances[T, A]) extends PartialOrder[A]: def partialCompare(x: A, y: A): Double = inst.fold2(x, y)(Double.NaN: Double): [t] => (ord: T[t], t0: t, t1: t) => ord.partialCompare(t0, t1) object Strict: export DerivedPartialOrder.coproduct - given product[A](using K0.ProductInstances[PartialOrder, A]): DerivedPartialOrder[A] = + given product[A: ProductInstancesOf[PartialOrder]]: DerivedPartialOrder[A] = new Product[PartialOrder, A] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedPure.scala b/core/src/main/scala-3/cats/derived/DerivedPure.scala index 38e9e574..0e53e522 100644 --- a/core/src/main/scala-3/cats/derived/DerivedPure.scala +++ b/core/src/main/scala-3/cats/derived/DerivedPure.scala @@ -1,7 +1,8 @@ package cats.derived import alleycats.{Empty, Pure} -import shapeless3.deriving.{Const, K1} +import shapeless3.deriving.Const +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.summonInline @@ -37,12 +38,12 @@ object DerivedPure: lazy val g = G.unify def pure[A](a: A): F[G[A]] = f.pure(g.pure(a)) - given [F[_]](using inst: K1.ProductInstances[Or, F]): DerivedPure[F] = - Strict.product(using inst.unify) + given [F[_]: ProductInstancesOf[Or]]: DerivedPure[F] = + Strict.product(using ProductInstances.unify) @deprecated("Kept for binary compatibility", "3.2.0") protected given [F[_]: Or, G[_]: Or]: DerivedPure[[x] =>> F[G[x]]] = nested object Strict: - given product[F[_]](using inst: K1.ProductInstances[Pure, F]): DerivedPure[F] = new Pure[F]: - def pure[A](a: A): F[A] = inst.construct([f[_]] => (F: Pure[f]) => F.pure(a)) + given product[F[_]: ProductInstancesOf[Pure]]: DerivedPure[F] = new Pure[F]: + def pure[A](a: A): F[A] = ProductInstances.construct([f[_]] => (F: Pure[f]) => F.pure(a)) diff --git a/core/src/main/scala-3/cats/derived/DerivedReducible.scala b/core/src/main/scala-3/cats/derived/DerivedReducible.scala index 57dddd0d..6a3addd6 100644 --- a/core/src/main/scala-3/cats/derived/DerivedReducible.scala +++ b/core/src/main/scala-3/cats/derived/DerivedReducible.scala @@ -1,7 +1,8 @@ package cats.derived import cats.{Eval, Foldable, Reducible} -import shapeless3.deriving.{Continue, K1} +import shapeless3.deriving.Continue +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -31,19 +32,19 @@ object DerivedReducible: new Derived.Lazy(() => F.unify.compose(using G.unify)) with Reducible[[x] =>> F[G[x]]]: export delegate.* - def product[F[_]](ev: Reducible[?])(using inst: K1.ProductInstances[DerivedFoldable.Or, F]): DerivedReducible[F] = - Strict.product(ev)(using inst.unify) + def product[F[_]: ProductInstancesOf[DerivedFoldable.Or]](ev: Reducible[?]): DerivedReducible[F] = + Strict.product(ev)(using ProductInstances.unify) - inline given product[F[_]](using gen: K1.ProductGeneric[F]): DerivedReducible[F] = - product(K1.summonFirst[Or, gen.MirroredElemTypes].unify) + inline given product[F[_]](using gen: ProductGeneric[F]): DerivedReducible[F] = + product(summonFirst[Or, gen.MirroredElemTypes].unify) - given [F[_]](using => K1.CoproductInstances[Or, F]): DerivedReducible[F] = + given [F[_]](using => CoproductInstances[Or, F]): DerivedReducible[F] = Strict.coproduct @deprecated("Kept for binary compatibility", "3.2.0") protected given [F[_]: Or, G[_]: Or]: DerivedReducible[[x] =>> F[G[x]]] = nested - trait Product[T[f[_]] <: Foldable[f], F[_]](@unused ev: Reducible[?])(using inst: K1.ProductInstances[T, F]) + trait Product[T[f[_]] <: Foldable[f], F[_]](@unused ev: Reducible[?])(using inst: ProductInstances[T, F]) extends DerivedFoldable.Product[T, F], Reducible[F]: @@ -70,7 +71,7 @@ object DerivedReducible: }) .map(_.get) - trait Coproduct[T[f[_]] <: Reducible[f], F[_]](using inst: K1.CoproductInstances[T, F]) + trait Coproduct[T[f[_]] <: Reducible[f], F[_]](using inst: CoproductInstances[T, F]) extends DerivedFoldable.Coproduct[T, F], Reducible[F]: @@ -81,12 +82,12 @@ object DerivedReducible: inst.fold(fa)([f[_]] => (F: T[f], fa: f[A]) => Eval.defer(F.reduceRightTo(fa)(f)(g))) object Strict: - def product[F[_]](ev: Reducible[?])(using K1.ProductInstances[Foldable, F]): DerivedReducible[F] = + def product[F[_]: ProductInstancesOf[Foldable]](ev: Reducible[?]): DerivedReducible[F] = new Product[Foldable, F](ev) {} - inline given product[F[_]](using gen: K1.ProductGeneric[F]): DerivedReducible[F] = - product(K1.summonFirst[Reducible, gen.MirroredElemTypes]) + inline given product[F[_]](using gen: ProductGeneric[F]): DerivedReducible[F] = + product(summonFirst[Reducible, gen.MirroredElemTypes]) - given coproduct[F[_]](using inst: => K1.CoproductInstances[Or, F]): DerivedReducible[F] = - given K1.CoproductInstances[Reducible, F] = inst.unify + given coproduct[F[_]](using inst: => CoproductInstances[Or, F]): DerivedReducible[F] = + given CoproductInstances[Reducible, F] = inst.unify new Coproduct[Reducible, F] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedSemigroup.scala b/core/src/main/scala-3/cats/derived/DerivedSemigroup.scala index df047582..d499dfe3 100644 --- a/core/src/main/scala-3/cats/derived/DerivedSemigroup.scala +++ b/core/src/main/scala-3/cats/derived/DerivedSemigroup.scala @@ -1,7 +1,7 @@ package cats.derived import cats.Semigroup -import shapeless3.deriving.K0 +import shapeless3.deriving.K0.* import scala.annotation.* import scala.compiletime.* @@ -22,13 +22,13 @@ object DerivedSemigroup: import Strict.given summonInline[DerivedSemigroup[A]].instance - given [A](using inst: => K0.ProductInstances[Or, A]): DerivedSemigroup[A] = + given [A](using inst: => ProductInstances[Or, A]): DerivedSemigroup[A] = Strict.product(using inst.unify) - trait Product[F[x] <: Semigroup[x], A](using inst: K0.ProductInstances[F, A]) extends Semigroup[A]: + trait Product[F[x] <: Semigroup[x], A](using inst: ProductInstances[F, A]) extends Semigroup[A]: final override def combine(x: A, y: A): A = inst.map2(x, y)([a] => (F: F[a], x: a, y: a) => F.combine(x, y)) object Strict: - given product[A](using K0.ProductInstances[Semigroup, A]): DerivedSemigroup[A] = + given product[A: ProductInstancesOf[Semigroup]]: DerivedSemigroup[A] = new Product[Semigroup, A] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedSemigroupK.scala b/core/src/main/scala-3/cats/derived/DerivedSemigroupK.scala index 158ca454..c73d255e 100644 --- a/core/src/main/scala-3/cats/derived/DerivedSemigroupK.scala +++ b/core/src/main/scala-3/cats/derived/DerivedSemigroupK.scala @@ -1,7 +1,8 @@ package cats.derived import cats.{Semigroup, SemigroupK} -import shapeless3.deriving.{Const, K1} +import shapeless3.deriving.Const +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -42,7 +43,7 @@ object DerivedSemigroupK: lazy val g = G.unify def combineK[A](x: F[G[A]], y: F[G[A]]): F[G[A]] = f.map2(x, y)(g.combineK) - given [F[_]](using inst: => K1.ProductInstances[Or, F]): DerivedSemigroupK[F] = + given [F[_]](using inst: => ProductInstances[Or, F]): DerivedSemigroupK[F] = Strict.product(using inst.unify) @deprecated("Kept for binary compatibility", "3.2.0") @@ -55,10 +56,10 @@ object DerivedSemigroupK: )(using F: DerivedApply.Or[F], G: Or[G]): DerivedSemigroupK[[x] =>> F[G[x]]] = nested(using ev) - trait Product[T[f[_]] <: SemigroupK[f], F[_]](using inst: K1.ProductInstances[T, F]) extends SemigroupK[F]: + trait Product[T[f[_]] <: SemigroupK[f], F[_]](using inst: ProductInstances[T, F]) extends SemigroupK[F]: final override def combineK[A](x: F[A], y: F[A]): F[A] = inst.map2(x, y)([f[_]] => (F: T[f], x: f[A], y: f[A]) => F.combineK(x, y)) object Strict: - given product[F[_]](using K1.ProductInstances[SemigroupK, F]): DerivedSemigroupK[F] = + given product[F[_]: ProductInstancesOf[SemigroupK]]: DerivedSemigroupK[F] = new Product[SemigroupK, F] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedShow.scala b/core/src/main/scala-3/cats/derived/DerivedShow.scala index 7386a776..0bd267a5 100644 --- a/core/src/main/scala-3/cats/derived/DerivedShow.scala +++ b/core/src/main/scala-3/cats/derived/DerivedShow.scala @@ -1,7 +1,8 @@ package cats.derived import cats.Show -import shapeless3.deriving.{K0, Labelling} +import shapeless3.deriving.K0.* +import shapeless3.deriving.Labelling import scala.annotation.* import scala.compiletime.* @@ -36,13 +37,13 @@ object DerivedShow: given string[A <: String]: DerivedShow[A] = Show.fromToString given symbol[A <: Symbol]: DerivedShow[A] = Show.fromToString - given [A](using inst: K0.ProductInstances[Or, A], labelling: Labelling[A]): DerivedShow[A] = - Strict.product(using labelling, inst.unify) + given [A: ProductInstancesOf[Or]](using labelling: Labelling[A]): DerivedShow[A] = + Strict.product(using labelling, ProductInstances.unify) - given [A](using => K0.CoproductInstances[Or, A]): DerivedShow[A] = + given [A](using => CoproductInstances[Or, A]): DerivedShow[A] = Strict.coproduct - trait Product[F[x] <: Show[x], A](using inst: K0.ProductInstances[F, A], labelling: Labelling[A]) extends Show[A]: + trait Product[F[x] <: Show[x], A](using inst: ProductInstances[F, A], labelling: Labelling[A]) extends Show[A]: def show(a: A): String = val prefix = labelling.label val labels = labelling.elemLabels @@ -64,14 +65,14 @@ object DerivedShow: sb.append(')') sb.toString - trait Coproduct[F[x] <: Show[x], A](using inst: K0.CoproductInstances[F, A]) extends Show[A]: + trait Coproduct[F[x] <: Show[x], A](using inst: CoproductInstances[F, A]) extends Show[A]: def show(a: A): String = inst.fold(a)([t] => (st: F[t], t: t) => st.show(t)) object Strict: - given product[A: Labelling](using => K0.ProductInstances[Show, A]): DerivedShow[A] = + given product[A: Labelling](using => ProductInstances[Show, A]): DerivedShow[A] = new Product[Show, A] {} - given coproduct[A](using inst: => K0.CoproductInstances[Or, A]): DerivedShow[A] = - given K0.CoproductInstances[Show, A] = inst.unify + given coproduct[A](using inst: => CoproductInstances[Or, A]): DerivedShow[A] = + given CoproductInstances[Show, A] = inst.unify new Coproduct[Show, A] {} diff --git a/core/src/main/scala-3/cats/derived/DerivedShowPretty.scala b/core/src/main/scala-3/cats/derived/DerivedShowPretty.scala index 16e9e72f..7a7ccfba 100644 --- a/core/src/main/scala-3/cats/derived/DerivedShowPretty.scala +++ b/core/src/main/scala-3/cats/derived/DerivedShowPretty.scala @@ -1,7 +1,8 @@ package cats.derived import cats.Show -import shapeless3.deriving.{K0, Labelling} +import shapeless3.deriving.K0.* +import shapeless3.deriving.Labelling import scala.annotation.* import scala.compiletime.* @@ -54,16 +55,16 @@ object DerivedShowPretty: given string[A <: String]: DerivedShowPretty[A] = fromToString given symbol[A <: Symbol]: DerivedShowPretty[A] = fromToString - given product[A: Labelling](using => K0.ProductInstances[Or, A]): DerivedShowPretty[A] = new Product[A] {} - given coproduct[A](using => K0.CoproductInstances[Or, A]): DerivedShowPretty[A] = new Coproduct[A] {} + given product[A: Labelling](using => ProductInstances[Or, A]): DerivedShowPretty[A] = new Product[A] {} + given coproduct[A](using => CoproductInstances[Or, A]): DerivedShowPretty[A] = new Coproduct[A] {} @deprecated("Kept for binary compatibility", "3.2.0") - protected given [A](using K0.ProductInstances[Or, A], Labelling[A]): DerivedShowPretty[A] = product + protected given [A: ProductInstancesOf[Or]: Labelling]: DerivedShowPretty[A] = product @deprecated("Kept for binary compatibility", "3.2.0") - protected given [A](using => K0.CoproductInstances[Or, A]): DerivedShowPretty[A] = coproduct + protected given [A](using => CoproductInstances[Or, A]): DerivedShowPretty[A] = coproduct - trait Product[A](using inst: K0.ProductInstances[Or, A], labelling: Labelling[A]) extends ShowPretty[A]: + trait Product[A](using inst: ProductInstances[Or, A], labelling: Labelling[A]) extends ShowPretty[A]: def showLines(a: A): List[String] = val prefix = labelling.label val labels = labelling.elemLabels @@ -83,12 +84,12 @@ object DerivedShowPretty: i -= 1 s"$prefix(" :: lines - trait Coproduct[A](using inst: K0.CoproductInstances[Or, A]) extends ShowPretty[A]: + trait Coproduct[A](using inst: CoproductInstances[Or, A]) extends ShowPretty[A]: def showLines(a: A): List[String] = inst.fold(a)([a] => (show: Or[a], x: a) => show(x)) object Strict: export DerivedShowPretty.coproduct - given product[A: Labelling](using inst: => K0.ProductInstances[Show, A]): DerivedShowPretty[A] = - given K0.ProductInstances[Or, A] = inst.mapK([a] => (show: Show[a]) => Or.fromShow(show)) + given product[A: Labelling](using inst: => ProductInstances[Show, A]): DerivedShowPretty[A] = + given ProductInstances[Or, A] = inst.mapK([a] => (show: Show[a]) => Or.fromShow(show)) DerivedShowPretty.product diff --git a/core/src/main/scala-3/cats/derived/DerivedTraverse.scala b/core/src/main/scala-3/cats/derived/DerivedTraverse.scala index 9120dd3b..3f9a3613 100644 --- a/core/src/main/scala-3/cats/derived/DerivedTraverse.scala +++ b/core/src/main/scala-3/cats/derived/DerivedTraverse.scala @@ -1,7 +1,8 @@ package cats.derived import cats.{Applicative, Eval, Traverse} -import shapeless3.deriving.{Const, K1} +import shapeless3.deriving.Const +import shapeless3.deriving.K1.* import scala.annotation.* import scala.compiletime.* @@ -36,13 +37,13 @@ object DerivedTraverse: new Derived.Lazy(() => F.unify.compose(using G.unify)) with Traverse[[x] =>> F[G[x]]]: export delegate.* - given [F[_]](using inst: K1.ProductInstances[Or, F]): DerivedTraverse[F] = Strict.product(using inst.unify) - given [F[_]](using => K1.CoproductInstances[Or, F]): DerivedTraverse[F] = Strict.coproduct + given [F[_]: ProductInstancesOf[Or]]: DerivedTraverse[F] = Strict.product(using ProductInstances.unify) + given [F[_]](using => CoproductInstances[Or, F]): DerivedTraverse[F] = Strict.coproduct @deprecated("Kept for binary compatibility", "3.2.0") protected given [F[_]: Or, G[_]: Or]: DerivedTraverse[[x] =>> F[G[x]]] = nested - trait Product[T[f[_]] <: Traverse[f], F[_]](using inst: K1.ProductInstances[T, F]) + trait Product[T[f[_]] <: Traverse[f], F[_]](using inst: ProductInstances[T, F]) extends Traverse[F], DerivedFunctor.Generic[T, F], DerivedFoldable.Product[T, F]: @@ -53,7 +54,7 @@ object DerivedTraverse: val ap = [a, b] => (gf: G[a => b], ga: G[a]) => G.ap(gf)(ga) inst.traverse[A, G, B](fa)(map)(pure)(ap)([f[_]] => (F: T[f], fa: f[A]) => F.traverse(fa)(f)) - trait Coproduct[T[f[_]] <: Traverse[f], F[_]](using inst: K1.CoproductInstances[T, F]) + trait Coproduct[T[f[_]] <: Traverse[f], F[_]](using inst: CoproductInstances[T, F]) extends Traverse[F], DerivedFunctor.Generic[T, F], DerivedFoldable.Coproduct[T, F]: @@ -62,9 +63,9 @@ object DerivedTraverse: inst.fold(fa)([f[_]] => (F: T[f], fa: f[A]) => F.traverse(fa)(f).asInstanceOf[G[F[B]]]) object Strict: - given product[F[_]](using K1.ProductInstances[Traverse, F]): DerivedTraverse[F] = + given product[F[_]: ProductInstancesOf[Traverse]]: DerivedTraverse[F] = new Traverse[F] with Product[Traverse, F] {} - given coproduct[F[_]](using inst: => K1.CoproductInstances[Or, F]): DerivedTraverse[F] = - given K1.CoproductInstances[Traverse, F] = inst.unify + given coproduct[F[_]](using inst: => CoproductInstances[Or, F]): DerivedTraverse[F] = + given CoproductInstances[Traverse, F] = inst.unify new Traverse[F] with Coproduct[Traverse, F] {} diff --git a/core/src/main/scala-3/cats/derived/package.scala b/core/src/main/scala-3/cats/derived/package.scala index d656538d..d92fb5c3 100644 --- a/core/src/main/scala-3/cats/derived/package.scala +++ b/core/src/main/scala-3/cats/derived/package.scala @@ -120,80 +120,83 @@ object strict: inline def nonEmptyTraverse[F[_]]: NonEmptyTraverse[F] = DerivedNonEmptyTraverse.strict[F] object auto: + private type NotGivenA[F[_]] = [A] =>> NotGiven[F[A]] + private type NotGivenF[T[_[_]]] = [F[_]] =>> NotGiven[T[F]] + object eq: - inline given [A](using NotGiven[Eq[A]]): Eq[A] = DerivedEq[A] + inline given [A: NotGivenA[Eq]]: Eq[A] = DerivedEq[A] object hash: - inline given [A](using NotGiven[Hash[A]]): Hash[A] = DerivedHash[A] + inline given [A: NotGivenA[Hash]]: Hash[A] = DerivedHash[A] object empty: - inline given [A](using NotGiven[Empty[A]]): Empty[A] = DerivedEmpty[A] + inline given [A: NotGivenA[Empty]]: Empty[A] = DerivedEmpty[A] object semigroup: - inline given [A](using NotGiven[Semigroup[A]]): Semigroup[A] = DerivedSemigroup[A] + inline given [A: NotGivenA[Semigroup]]: Semigroup[A] = DerivedSemigroup[A] object monoid: - inline given [A](using NotGiven[Monoid[A]]): Monoid[A] = DerivedMonoid[A] + inline given [A: NotGivenA[Monoid]]: Monoid[A] = DerivedMonoid[A] object order: - inline given [A](using NotGiven[Order[A]]): Order[A] = DerivedOrder[A] + inline given [A: NotGivenA[Order]]: Order[A] = DerivedOrder[A] object commutativeSemigroup: - inline given [A](using NotGiven[CommutativeSemigroup[A]]): CommutativeSemigroup[A] = DerivedCommutativeSemigroup[A] + inline given [A: NotGivenA[CommutativeSemigroup]]: CommutativeSemigroup[A] = DerivedCommutativeSemigroup[A] object commutativeMonoid: - inline given [A](using NotGiven[CommutativeMonoid[A]]): CommutativeMonoid[A] = DerivedCommutativeMonoid[A] + inline given [A: NotGivenA[CommutativeMonoid]]: CommutativeMonoid[A] = DerivedCommutativeMonoid[A] object show: - inline given [A](using NotGiven[Show[A]]): Show[A] = DerivedShow[A] + inline given [A: NotGivenA[Show]]: Show[A] = DerivedShow[A] object applicative: - inline given [F[_]](using NotGiven[Applicative[F]]): Applicative[F] = DerivedApplicative[F] + inline given [F[_]: NotGivenF[Applicative]]: Applicative[F] = DerivedApplicative[F] object apply: - inline given [F[_]](using NotGiven[Apply[F]]): Apply[F] = DerivedApply[F] + inline given [F[_]: NotGivenF[Apply]]: Apply[F] = DerivedApply[F] object nonEmptyAlternative: - inline given [F[_]](using NotGiven[NonEmptyAlternative[F]]): NonEmptyAlternative[F] = DerivedNonEmptyAlternative[F] + inline given [F[_]: NotGivenF[NonEmptyAlternative]]: NonEmptyAlternative[F] = DerivedNonEmptyAlternative[F] object alternative: - inline given [F[_]](using NotGiven[Alternative[F]]): Alternative[F] = DerivedAlternative[F] + inline given [F[_]: NotGivenF[Alternative]]: Alternative[F] = DerivedAlternative[F] object emptyK: - inline given [F[_]](using NotGiven[EmptyK[F]]): EmptyK[F] = DerivedEmptyK[F] + inline given [F[_]: NotGivenF[EmptyK]]: EmptyK[F] = DerivedEmptyK[F] object pure: - inline given [F[_]](using NotGiven[Pure[F]]): Pure[F] = DerivedPure[F] + inline given [F[_]: NotGivenF[Pure]]: Pure[F] = DerivedPure[F] object functor: - inline given [F[_]](using NotGiven[Functor[F]]): Functor[F] = DerivedFunctor[F] + inline given [F[_]: NotGivenF[Functor]]: Functor[F] = DerivedFunctor[F] object foldable: - inline given [F[_]](using NotGiven[Foldable[F]]): Foldable[F] = DerivedFoldable[F] + inline given [F[_]: NotGivenF[Foldable]]: Foldable[F] = DerivedFoldable[F] object reducible: - inline given [F[_]](using NotGiven[Reducible[F]]): Reducible[F] = DerivedReducible[F] + inline given [F[_]: NotGivenF[Reducible]]: Reducible[F] = DerivedReducible[F] object traverse: - inline given [F[_]](using NotGiven[Traverse[F]]): Traverse[F] = DerivedTraverse[F] + inline given [F[_]: NotGivenF[Traverse]]: Traverse[F] = DerivedTraverse[F] object nonEmptyTraverse: - inline given [F[_]](using NotGiven[NonEmptyTraverse[F]]): NonEmptyTraverse[F] = DerivedNonEmptyTraverse[F] + inline given [F[_]: NotGivenF[NonEmptyTraverse]]: NonEmptyTraverse[F] = DerivedNonEmptyTraverse[F] object semigroupK: - inline given [F[_]](using NotGiven[SemigroupK[F]]): SemigroupK[F] = DerivedSemigroupK[F] + inline given [F[_]: NotGivenF[SemigroupK]]: SemigroupK[F] = DerivedSemigroupK[F] object monoidK: - inline given [F[_]](using NotGiven[MonoidK[F]]): MonoidK[F] = DerivedMonoidK[F] + inline given [F[_]: NotGivenF[MonoidK]]: MonoidK[F] = DerivedMonoidK[F] object contravariant: - inline given [F[_]](using NotGiven[Contravariant[F]]): Contravariant[F] = DerivedContravariant[F] + inline given [F[_]: NotGivenF[Contravariant]]: Contravariant[F] = DerivedContravariant[F] object invariant: - inline given [F[_]](using NotGiven[Invariant[F]]): Invariant[F] = DerivedInvariant[F] + inline given [F[_]: NotGivenF[Invariant]]: Invariant[F] = DerivedInvariant[F] object partialOrder: - inline given [A](using NotGiven[PartialOrder[A]]): PartialOrder[A] = DerivedPartialOrder[A] + inline given [A: NotGivenA[PartialOrder]]: PartialOrder[A] = DerivedPartialOrder[A] object showPretty: - inline given [A](using NotGiven[Show[A]]): ShowPretty[A] = DerivedShowPretty[A] + inline given [A: NotGivenA[Show]]: ShowPretty[A] = DerivedShowPretty[A]