diff --git a/build.sbt b/build.sbt index d018665e..c2679f34 100644 --- a/build.sbt +++ b/build.sbt @@ -14,7 +14,7 @@ val munitVersion = "1.0.0-M6" val disciplineMunitVersion = "2.0.0-M3" val kindProjectorVersion = "0.13.2" val shapeless2Version = "2.3.10" -val shapeless3Version = "3.1.0" +val shapeless3Version = "3.2.0" lazy val commonSettings = Seq( scalacOptions ++= Seq( diff --git a/core/src/main/scala-3/cats/derived/DerivedEmpty.scala b/core/src/main/scala-3/cats/derived/DerivedEmpty.scala index c9681ccb..8284d118 100644 --- a/core/src/main/scala-3/cats/derived/DerivedEmpty.scala +++ b/core/src/main/scala-3/cats/derived/DerivedEmpty.scala @@ -1,7 +1,6 @@ package cats.derived import alleycats.Empty -import cats.derived.util.Kinds import shapeless3.deriving.K0 import scala.annotation.implicitNotFound @@ -19,7 +18,7 @@ object DerivedEmpty: summonInline[DerivedEmpty[A]].instance given product[A](using inst: K0.ProductInstances[Or, A]): DerivedEmpty[A] = - Empty(inst.unify.construct([A] => (A: Empty[A]) => A.empty)) + Empty(inst.unify.construct([a] => (_: Empty[a]).empty)) inline given coproduct[A](using gen: K0.CoproductGeneric[A]): DerivedEmpty[A] = - Kinds.summonOne0[Or, gen.MirroredElemTypes, A].unify + Empty(gen.withOnly[Or, A]([a <: A] => (_: Or[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 42bcd800..53d55adc 100644 --- a/core/src/main/scala-3/cats/derived/DerivedEmptyK.scala +++ b/core/src/main/scala-3/cats/derived/DerivedEmptyK.scala @@ -1,7 +1,6 @@ package cats.derived import alleycats.{Empty, EmptyK, Pure} -import cats.derived.util.Kinds import shapeless3.deriving.{Const, K1} import scala.annotation.implicitNotFound @@ -39,4 +38,4 @@ object DerivedEmptyK: def empty[A]: F[A] = inst.unify.construct([f[_]] => (E: EmptyK[f]) => E.empty[A]) inline given coproduct[F[_]](using gen: K1.CoproductGeneric[F]): DerivedEmptyK[F] = - Kinds.summonOne1[Or, gen.MirroredElemTypes, F].unify + gen.withOnly[Or, EmptyK[F]]([f[x] <: F[x]] => (ek: Or[f]) => ek.unify.asInstanceOf[EmptyK[F]]) diff --git a/core/src/main/scala-3/cats/derived/DerivedNonEmptyTraverse.scala b/core/src/main/scala-3/cats/derived/DerivedNonEmptyTraverse.scala index fba29218..c13e305b 100644 --- a/core/src/main/scala-3/cats/derived/DerivedNonEmptyTraverse.scala +++ b/core/src/main/scala-3/cats/derived/DerivedNonEmptyTraverse.scala @@ -32,7 +32,7 @@ object DerivedNonEmptyTraverse: with DerivedFunctor.Generic[Traverse, F] {} inline given [F[_]](using gen: K1.ProductGeneric[F]): DerivedNonEmptyTraverse[F] = - product(K1.summonFirst[Or, gen.MirroredElemTypes, Const[Any]].unify) + product(K1.summonFirst[Or, gen.MirroredElemTypes].unify) given [F[_]](using inst: => K1.CoproductInstances[Or, F]): DerivedNonEmptyTraverse[F] = given K1.CoproductInstances[NonEmptyTraverse, F] = inst.unify diff --git a/core/src/main/scala-3/cats/derived/DerivedReducible.scala b/core/src/main/scala-3/cats/derived/DerivedReducible.scala index a51aedfb..e6dfdea1 100644 --- a/core/src/main/scala-3/cats/derived/DerivedReducible.scala +++ b/core/src/main/scala-3/cats/derived/DerivedReducible.scala @@ -27,7 +27,7 @@ object DerivedReducible: new Product[Foldable, F](ev) {} inline given [F[_]](using gen: K1.ProductGeneric[F]): DerivedReducible[F] = - product(K1.summonFirst[Or, gen.MirroredElemTypes, Const[Any]].unify) + product(K1.summonFirst[Or, gen.MirroredElemTypes].unify) given [F[_]](using inst: => K1.CoproductInstances[Or, F]): DerivedReducible[F] = given K1.CoproductInstances[Reducible, F] = inst.unify diff --git a/core/src/main/scala-3/cats/derived/util/Kinds.scala b/core/src/main/scala-3/cats/derived/util/Kinds.scala deleted file mode 100644 index 2182c7d1..00000000 --- a/core/src/main/scala-3/cats/derived/util/Kinds.scala +++ /dev/null @@ -1,37 +0,0 @@ -package cats.derived.util - -import shapeless3.deriving._ - -import scala.compiletime.* -import scala.util.NotGiven - -object Kinds: - inline def summonOne0[F[_], T, U]: F[U] = - summonOneFrom[K0.LiftP[F, T]].asInstanceOf[F[U]] - - inline def summonOne1[F[_[_]], T[_], U[_]]: F[U] = - summonOneFrom[K1.LiftP[F, T]].asInstanceOf[F[U]] - - inline def summonNone0[F[_], T]: Unit = - summonNoneFrom[K0.LiftP[F, T]] - - inline def summonNone1[F[_[_]], T[_]]: Unit = - summonNoneFrom[K1.LiftP[F, T]] - - transparent inline def summonOneFrom[T <: Tuple]: Any = - inline erasedValue[T] match - case _: (a *: b) => - summonFrom { - case instance: `a` => - summonNoneFrom[b] - instance - case _ => - summonOneFrom[b] - } - - transparent inline def summonNoneFrom[T <: Tuple]: Unit = - inline erasedValue[T] match - case _: EmptyTuple => () - case _: (a *: b) => - summonInline[NotGiven[`a`]] - summonNoneFrom[b]