diff --git a/core/src/main/scala-3/cats/derived/empty.scala b/core/src/main/scala-3/cats/derived/empty.scala index d013fc54..ff192a8c 100644 --- a/core/src/main/scala-3/cats/derived/empty.scala +++ b/core/src/main/scala-3/cats/derived/empty.scala @@ -6,23 +6,25 @@ import shapeless3.deriving.K0 object empty extends EmptyDerivation trait DerivedEmpty[A] extends Empty[A]: - protected def value(): A - lazy val empty: A = value() + protected def emptyValue(): A + lazy val empty: A = emptyValue() -object DerivedEmpty: - type EmptyOrDerived[A] = Empty[A] OrElse DerivedEmpty[A] +object DerivedEmpty extends DerivedEmptyLowPriority: + given delegated[A](using A: => Empty[A]): DerivedEmpty[A] = + () => A.empty - def product[A](using inst: K0.ProductInstances[EmptyOrDerived, A]): DerivedEmpty[A] = - () => inst.construct([A] => (F: EmptyOrDerived[A]) => F.unify.empty) + def product[A](using inst: K0.ProductInstances[DerivedEmpty, A]): DerivedEmpty[A] = + () => inst.construct([A] => (A: DerivedEmpty[A]) => A.empty) inline def coproduct[A](using gen: K0.CoproductGeneric[A]): DerivedEmpty[A] = - () => K0.summonFirst[EmptyOrDerived, gen.MirroredElemTypes, A].unify.empty + K0.summonFirst[DerivedEmpty, gen.MirroredElemTypes, A] +private[derived] sealed abstract class DerivedEmptyLowPriority: inline given derived[A](using gen: K0.Generic[A]): DerivedEmpty[A] = inline gen match - case given K0.ProductGeneric[A] => product - case given K0.CoproductGeneric[A] => coproduct + case given K0.ProductGeneric[A] => DerivedEmpty.product + case given K0.CoproductGeneric[A] => DerivedEmpty.coproduct trait EmptyDerivation: extension (E: Empty.type) - inline def derived[A](using instance: DerivedEmpty[A]): Empty[A] = instance + def derived[A](using instance: DerivedEmpty[A]): Empty[A] = instance diff --git a/core/src/main/scala-3/cats/derived/orelse.scala b/core/src/main/scala-3/cats/derived/orelse.scala deleted file mode 100644 index 6fc6a787..00000000 --- a/core/src/main/scala-3/cats/derived/orelse.scala +++ /dev/null @@ -1,21 +0,0 @@ -package cats.derived - -enum OrElse[+A, +B]: - case Primary(value: A) - case Secondary(value: () => B) - - final def fold[C](primary: A => C, secondary: B => C): C = this match - case Primary(value) => primary(value) - case Secondary(value) => secondary(value()) - - final def unify[C >: A](implicit ev: B <:< C): C = this match - case Primary(value) => value - case Secondary(value) => value() - -object OrElse extends OrElseLowPriority: - inline given primary[A, B](using inline a: A): OrElse[A, B] = - OrElse.Primary(a) - -private[derived] sealed abstract class OrElseLowPriority: - inline given secondary[A, B](using inline b: B): OrElse[A, B] = - OrElse.Secondary(() => b) diff --git a/core/src/test/scala-3/cats/derived/EmptyTests.scala b/core/src/test/scala-3/cats/derived/EmptyTests.scala index f1d1297b..3390e681 100644 --- a/core/src/test/scala-3/cats/derived/EmptyTests.scala +++ b/core/src/test/scala-3/cats/derived/EmptyTests.scala @@ -5,7 +5,7 @@ import cats._ import cats.derived.all._ class EmptyTests: - case class Foo(i: Int, b: Option[IntTree]) derives Empty + case class Foo(i: Int, b: IntTree) derives Empty enum IntTree: case Leaf case Node(left: IntTree, value: Int, right: IntTree)