From a41f638d09a8a48829a067dfd47d99fe80b2a2e0 Mon Sep 17 00:00:00 2001 From: Ryan Mehri Date: Sun, 28 Jun 2020 15:11:39 -0600 Subject: [PATCH 1/3] Add Tuple2K Semigroupal --- core/src/main/scala/cats/data/Tuple2K.scala | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/src/main/scala/cats/data/Tuple2K.scala b/core/src/main/scala/cats/data/Tuple2K.scala index bd7f009e15..7493dfadca 100644 --- a/core/src/main/scala/cats/data/Tuple2K.scala +++ b/core/src/main/scala/cats/data/Tuple2K.scala @@ -189,6 +189,22 @@ sealed abstract private[data] class Tuple2KInstances8 { def F: Functor[F] = FF def G: Functor[G] = GG } + implicit def catsDataSemigroupalForTuple2K[F[_], G[_]](implicit + FF: Semigroupal[F], + GG: Semigroupal[G] + ): Semigroupal[λ[α => Tuple2K[F, G, α]]] = + new Tuple2KSemigroupal[F, G] { + def F: Semigroupal[F] = FF + def G: Semigroupal[G] = GG + } +} + +sealed private[data] trait Tuple2KSemigroupal[F[_], G[_]] extends Semigroupal[λ[α => Tuple2K[F, G, α]]] { + def F: Semigroupal[F] + def G: Semigroupal[G] + + override def product[A, B](fa: Tuple2K[F, G, A], fb: Tuple2K[F, G, B]): Tuple2K[F, G, (A, B)] = + Tuple2K(F.product(fa.first, fb.first), G.product(fa.second, fb.second)) } sealed private[data] trait Tuple2KFunctor[F[_], G[_]] extends Functor[λ[α => Tuple2K[F, G, α]]] { From 83f3aca8b592a153a1d6079917afeb5e448f7bd6 Mon Sep 17 00:00:00 2001 From: Ryan Mehri Date: Sun, 28 Jun 2020 18:43:30 -0600 Subject: [PATCH 2/3] Make Tuple2KApply subclass Tuple2KSemigroupal --- core/src/main/scala/cats/data/Tuple2K.scala | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/main/scala/cats/data/Tuple2K.scala b/core/src/main/scala/cats/data/Tuple2K.scala index 7493dfadca..308bd7e856 100644 --- a/core/src/main/scala/cats/data/Tuple2K.scala +++ b/core/src/main/scala/cats/data/Tuple2K.scala @@ -249,7 +249,10 @@ sealed private[data] trait Tuple2KContravariantMonoidal[F[_], G[_]] Tuple2K(F.contramap(fa.first)(f), G.contramap(fa.second)(f)) } -sealed private[data] trait Tuple2KApply[F[_], G[_]] extends Apply[λ[α => Tuple2K[F, G, α]]] with Tuple2KFunctor[F, G] { +sealed private[data] trait Tuple2KApply[F[_], G[_]] + extends Apply[λ[α => Tuple2K[F, G, α]]] + with Tuple2KFunctor[F, G] + with Tuple2KSemigroupal[F, G] { def F: Apply[F] def G: Apply[G] override def ap[A, B](f: Tuple2K[F, G, A => B])(fa: Tuple2K[F, G, A]): Tuple2K[F, G, B] = From 08962fc5d677c97c16b446e51f0aed9ebefae879 Mon Sep 17 00:00:00 2001 From: Ryan Mehri Date: Sun, 28 Jun 2020 20:18:20 -0600 Subject: [PATCH 3/3] Remove overridden product in Apply --- core/src/main/scala/cats/data/Tuple2K.scala | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/src/main/scala/cats/data/Tuple2K.scala b/core/src/main/scala/cats/data/Tuple2K.scala index 308bd7e856..97a347b62d 100644 --- a/core/src/main/scala/cats/data/Tuple2K.scala +++ b/core/src/main/scala/cats/data/Tuple2K.scala @@ -257,8 +257,6 @@ sealed private[data] trait Tuple2KApply[F[_], G[_]] def G: Apply[G] override def ap[A, B](f: Tuple2K[F, G, A => B])(fa: Tuple2K[F, G, A]): Tuple2K[F, G, B] = Tuple2K(F.ap(f.first)(fa.first), G.ap(f.second)(fa.second)) - override def product[A, B](fa: Tuple2K[F, G, A], fb: Tuple2K[F, G, B]): Tuple2K[F, G, (A, B)] = - Tuple2K(F.product(fa.first, fb.first), G.product(fa.second, fb.second)) override def map2Eval[A, B, Z](fa: Tuple2K[F, G, A], fb: Eval[Tuple2K[F, G, B]])( f: (A, B) => Z ): Eval[Tuple2K[F, G, Z]] = {