diff --git a/core/src/main/scala/cats/data/OneAnd.scala b/core/src/main/scala/cats/data/OneAnd.scala index 06df7e742b..47f52c4b49 100644 --- a/core/src/main/scala/cats/data/OneAnd.scala +++ b/core/src/main/scala/cats/data/OneAnd.scala @@ -34,12 +34,12 @@ import kernel.compat.scalaVersionSpecific.* * type NonEmptyStream[A] = OneAnd[Stream, A] * }}} */ -final case class OneAnd[F[_], A](head: A, tail: F[A]) { +final case class OneAnd[F[_], A](head: A, tail: F[A]) extends OneAndBinCompat0[F, A] { /** * Combine the head and tail into a single `F[A]` value. */ - def unwrap(implicit F: Alternative[F]): F[A] = + def unwrap(implicit F: NonEmptyAlternative[F]): F[A] = F.prependK(head, tail) /** @@ -53,7 +53,7 @@ final case class OneAnd[F[_], A](head: A, tail: F[A]) { /** * Append another OneAnd to this */ - def combine(other: OneAnd[F, A])(implicit F: Alternative[F]): OneAnd[F, A] = + def combine(other: OneAnd[F, A])(implicit F: NonEmptyAlternative[F]): OneAnd[F, A] = OneAnd(head, F.combineK(tail, other.unwrap)) /** @@ -123,8 +123,18 @@ final case class OneAnd[F[_], A](head: A, tail: F[A]) { s"OneAnd(${A.show(head)}, ${FA.show(tail)})" } +sealed private[data] trait OneAndBinCompat0[F[_], A] { self: OneAnd[F, A] => + // Kept for binary compatibility + private[data] def unwrap(F: Alternative[F]): F[A] = + self.unwrap(F) + + // Kept for binary compatibility + private[data] def combine(other: OneAnd[F, A])(F: Alternative[F]): OneAnd[F, A] = + self.combine(other)(F) +} + @suppressUnusedImportWarningForScalaVersionSpecific -sealed abstract private[data] class OneAndInstances extends OneAndLowPriority0 { +sealed abstract private[data] class OneAndInstances extends OneAndLowPriority0 with OneAndInstancesBinCompat0 { implicit def catsDataParallelForOneAnd[A, M[_]: Alternative, F0[_]: Alternative](implicit P: Parallel.Aux[M, F0] @@ -158,13 +168,13 @@ sealed abstract private[data] class OneAndInstances extends OneAndLowPriority0 { implicit def catsDataShowForOneAnd[A, F[_]](implicit A: Show[A], FA: Show[F[A]]): Show[OneAnd[F, A]] = _.show - implicit def catsDataSemigroupKForOneAnd[F[_]: Alternative]: SemigroupK[OneAnd[F, *]] = + implicit def catsDataSemigroupKForOneAnd[F[_]: NonEmptyAlternative]: SemigroupK[OneAnd[F, *]] = new SemigroupK[OneAnd[F, *]] { def combineK[A](a: OneAnd[F, A], b: OneAnd[F, A]): OneAnd[F, A] = a.combine(b) } - implicit def catsDataSemigroupForOneAnd[F[_]: Alternative, A]: Semigroup[OneAnd[F, A]] = + implicit def catsDataSemigroupForOneAnd[F[_]: NonEmptyAlternative, A]: Semigroup[OneAnd[F, A]] = catsDataSemigroupKForOneAnd[F].algebra implicit def catsDataMonadForOneAnd[F[_]](implicit @@ -331,4 +341,15 @@ sealed abstract private[data] class OneAndLowPriority0 extends OneAndLowPriority } } +sealed private[data] trait OneAndInstancesBinCompat0 { self: OneAndInstances => + + // Kept for binary compatibility + def catsDataSemigroupKForOneAnd[F[_]](F: Alternative[F]): SemigroupK[OneAnd[F, *]] = + self.catsDataSemigroupKForOneAnd[F](F) + + // Kept for binary compatibility + def catsDataSemigroupForOneAnd[F[_], A](F: Alternative[F]): Semigroup[OneAnd[F, A]] = + self.catsDataSemigroupKForOneAnd[F](F).algebra +} + object OneAnd extends OneAndInstances