From 5be6a8607eeb1459f225690b573187397ae128e9 Mon Sep 17 00:00:00 2001 From: Luka Jacobowitz Date: Mon, 4 Nov 2019 13:45:57 -0500 Subject: [PATCH] Address feedback --- build.sbt | 3 --- .../scala-2.13+/cats/data/NonEmptyLazyList.scala | 13 ++++++++++++- core/src/main/scala/cats/Align.scala | 7 +++++-- .../cats/data/AbstractNonEmptyInstances.scala | 15 ++------------- core/src/main/scala/cats/data/NonEmptyChain.scala | 12 +++++++++++- 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/build.sbt b/build.sbt index 281de4a830..38f08cb4be 100644 --- a/build.sbt +++ b/build.sbt @@ -387,9 +387,6 @@ def mimaSettings(moduleName: String) = exclude[MissingClassProblem]( "cats.kernel.compat.scalaVersionMoreSpecific$suppressUnusedImportWarningForScalaVersionMoreSpecific" ) - ) ++ //abstract package private classes - Seq( - exclude[DirectMissingMethodProblem]("cats.data.AbstractNonEmptyInstances.this") ) ++ // Only narrowing of types allowed here Seq( exclude[IncompatibleSignatureProblem]("*") diff --git a/core/src/main/scala-2.13+/cats/data/NonEmptyLazyList.scala b/core/src/main/scala-2.13+/cats/data/NonEmptyLazyList.scala index 3906f94315..6f11f312f7 100644 --- a/core/src/main/scala-2.13+/cats/data/NonEmptyLazyList.scala +++ b/core/src/main/scala-2.13+/cats/data/NonEmptyLazyList.scala @@ -334,7 +334,7 @@ sealed abstract private[data] class NonEmptyLazyListInstances extends NonEmptyLa with NonEmptyTraverse[NonEmptyLazyList] with SemigroupK[NonEmptyLazyList] with Align[NonEmptyLazyList] = - new AbstractNonEmptyInstances[LazyList, NonEmptyLazyList] { + new AbstractNonEmptyInstances[LazyList, NonEmptyLazyList] with Align[NonEmptyLazyList] { def extract[A](fa: NonEmptyLazyList[A]): A = fa.head @@ -355,6 +355,17 @@ sealed abstract private[data] class NonEmptyLazyListInstances extends NonEmptyLa Eval.defer(fa.reduceRightTo(a => Eval.now(f(a))) { (a, b) => Eval.defer(g(a, b)) }) + + private val alignInstance = Align[LazyList].asInstanceOf[Align[NonEmptyLazyList]] + + def functor: Functor[NonEmptyLazyList] = alignInstance.functor + + def align[A, B](fa: NonEmptyLazyList[A], fb: NonEmptyLazyList[B]): NonEmptyLazyList[Ior[A, B]] = + alignInstance.align(fa, fb) + + override def alignWith[A, B, C](fa: NonEmptyLazyList[A], + fb: NonEmptyLazyList[B])(f: Ior[A, B] => C): NonEmptyLazyList[C] = + alignInstance.alignWith(fa, fb)(f) } implicit def catsDataOrderForNonEmptyLazyList[A: Order]: Order[NonEmptyLazyList[A]] = diff --git a/core/src/main/scala/cats/Align.scala b/core/src/main/scala/cats/Align.scala index 4100a4a419..801d15a65c 100644 --- a/core/src/main/scala/cats/Align.scala +++ b/core/src/main/scala/cats/Align.scala @@ -77,11 +77,14 @@ import cats.data.Ior * }}} */ def padZipWith[A, B, C](fa: F[A], fb: F[B])(f: (Option[A], Option[B]) => C): F[C] = - alignWith(fa, fb)(ior => Function.tupled(f)(ior.pad)) + alignWith(fa, fb) { ior => + val (oa, ob) = ior.pad + f(oa, ob) + } } object Align { - def semigroup[F[_]: Align, A: Semigroup]: Semigroup[F[A]] = new Semigroup[F[A]] { + def semigroup[F[_], A](implicit F: Align[F], A: Semigroup[A]): Semigroup[F[A]] = new Semigroup[F[A]] { def combine(x: F[A], y: F[A]): F[A] = Align[F].alignCombine(x, y) } } diff --git a/core/src/main/scala/cats/data/AbstractNonEmptyInstances.scala b/core/src/main/scala/cats/data/AbstractNonEmptyInstances.scala index e343e64509..2641a4f364 100644 --- a/core/src/main/scala/cats/data/AbstractNonEmptyInstances.scala +++ b/core/src/main/scala/cats/data/AbstractNonEmptyInstances.scala @@ -4,17 +4,14 @@ package data abstract private[data] class AbstractNonEmptyInstances[F[_], NonEmptyF[_]](implicit MF: Monad[F], CF: CoflatMap[F], TF: Traverse[F], - SF: SemigroupK[F], - AF: Align[F]) + SF: SemigroupK[F]) extends Bimonad[NonEmptyF] with NonEmptyTraverse[NonEmptyF] - with SemigroupK[NonEmptyF] - with Align[NonEmptyF] { + with SemigroupK[NonEmptyF] { val monadInstance = MF.asInstanceOf[Monad[NonEmptyF]] val coflatMapInstance = CF.asInstanceOf[CoflatMap[NonEmptyF]] val traverseInstance = Traverse[F].asInstanceOf[Traverse[NonEmptyF]] val semiGroupKInstance = SemigroupK[F].asInstanceOf[SemigroupK[NonEmptyF]] - val alignInstance = Align[F].asInstanceOf[Align[NonEmptyF]] def combineK[A](a: NonEmptyF[A], b: NonEmptyF[A]): NonEmptyF[A] = semiGroupKInstance.combineK(a, b) @@ -80,12 +77,4 @@ abstract private[data] class AbstractNonEmptyInstances[F[_], NonEmptyF[_]](impli override def collectFirstSome[A, B](fa: NonEmptyF[A])(f: A => Option[B]): Option[B] = traverseInstance.collectFirstSome(fa)(f) - - def align[A, B](fa: NonEmptyF[A], fb: NonEmptyF[B]): NonEmptyF[Ior[A, B]] = - alignInstance.align(fa, fb) - - override def functor: Functor[NonEmptyF] = alignInstance.functor - - override def alignWith[A, B, C](fa: NonEmptyF[A], fb: NonEmptyF[B])(f: Ior[A, B] => C): NonEmptyF[C] = - alignInstance.alignWith(fa, fb)(f) } diff --git a/core/src/main/scala/cats/data/NonEmptyChain.scala b/core/src/main/scala/cats/data/NonEmptyChain.scala index 69a232e719..45d5dbf4db 100644 --- a/core/src/main/scala/cats/data/NonEmptyChain.scala +++ b/core/src/main/scala/cats/data/NonEmptyChain.scala @@ -422,7 +422,7 @@ sealed abstract private[data] class NonEmptyChainInstances extends NonEmptyChain with NonEmptyTraverse[NonEmptyChain] with Bimonad[NonEmptyChain] with Align[NonEmptyChain] = - new AbstractNonEmptyInstances[Chain, NonEmptyChain] { + new AbstractNonEmptyInstances[Chain, NonEmptyChain] with Align[NonEmptyChain] { def extract[A](fa: NonEmptyChain[A]): A = fa.head def nonEmptyTraverse[G[_]: Apply, A, B](fa: NonEmptyChain[A])(f: A => G[B]): G[NonEmptyChain[B]] = @@ -453,6 +453,16 @@ sealed abstract private[data] class NonEmptyChainInstances extends NonEmptyChain override def get[A](fa: NonEmptyChain[A])(idx: Long): Option[A] = if (idx == 0) Some(fa.head) else fa.tail.get(idx - 1) + + private val alignInstance = Align[Chain].asInstanceOf[Align[NonEmptyChain]] + + def functor: Functor[NonEmptyChain] = alignInstance.functor + + def align[A, B](fa: NonEmptyChain[A], fb: NonEmptyChain[B]): NonEmptyChain[Ior[A, B]] = + alignInstance.align(fa, fb) + + override def alignWith[A, B, C](fa: NonEmptyChain[A], fb: NonEmptyChain[B])(f: Ior[A, B] => C): NonEmptyChain[C] = + alignInstance.alignWith(fa, fb)(f) } implicit def catsDataOrderForNonEmptyChain[A: Order]: Order[NonEmptyChain[A]] =