From 8d068f791bfc04f1b903ff0c10eff82a7978b8fb Mon Sep 17 00:00:00 2001 From: Arya Irani Date: Mon, 28 Dec 2015 20:46:18 -0500 Subject: [PATCH 1/3] add Reducible instance for OneAnd, deprecate Foldable instance --- core/src/main/scala/cats/data/OneAnd.scala | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/src/main/scala/cats/data/OneAnd.scala b/core/src/main/scala/cats/data/OneAnd.scala index 5500d15548..5564e818eb 100644 --- a/core/src/main/scala/cats/data/OneAnd.scala +++ b/core/src/main/scala/cats/data/OneAnd.scala @@ -106,8 +106,20 @@ private[data] sealed trait OneAndInstances extends OneAndLowPriority1 { implicit def oneAndSemigroup[F[_]: MonadCombine, A]: Semigroup[OneAnd[F, A]] = oneAndSemigroupK.algebra - implicit def oneAndFoldable[F[_]](implicit foldable: Foldable[F]): Foldable[OneAnd[F, ?]] = - new Foldable[OneAnd[F, ?]] { + @deprecated("use oneAndReducible", "0.4.0") + def oneAndFoldable[F[_]: Foldable]: Foldable[OneAnd[F, ?]] = oneAndReducible[F] + + implicit def oneAndReducible[F[_]](implicit F: Foldable[F]): Reducible[OneAnd[F, ?]] = + new Reducible[OneAnd[F, ?]] { + override def reduceLeftTo[A, B](fa: OneAnd[F, A])(f: (A) => B)(g: (B, A) => B): B = + F.foldLeft[A, B](fa.tail, f(fa.head))(g) + + override def reduceRightTo[A, B](fa: OneAnd[F, A])(f: (A) => B)(g: (A, Eval[B]) => Eval[B]): Eval[B] = + F.reduceRightToOption(fa.tail)(f)(g).flatMap { + case None => Eval.later(f(fa.head)) + case Some(b) => g(fa.head, Eval.now(b)) + } + override def foldLeft[A, B](fa: OneAnd[F, A], b: B)(f: (B, A) => B): B = fa.foldLeft(b)(f) override def foldRight[A, B](fa: OneAnd[F, A], lb: Eval[B])(f: (A, Eval[B]) => Eval[B]): Eval[B] = From 9c1802eba4a12644a7a821e40d1c9b7bcbc9f67e Mon Sep 17 00:00:00 2001 From: Arya Irani Date: Tue, 29 Dec 2015 09:11:54 -0500 Subject: [PATCH 2/3] refactor oneAndReducible to use NonEmptyReducible --- core/src/main/scala/cats/data/OneAnd.scala | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/core/src/main/scala/cats/data/OneAnd.scala b/core/src/main/scala/cats/data/OneAnd.scala index 5564e818eb..8900f8fc59 100644 --- a/core/src/main/scala/cats/data/OneAnd.scala +++ b/core/src/main/scala/cats/data/OneAnd.scala @@ -110,21 +110,8 @@ private[data] sealed trait OneAndInstances extends OneAndLowPriority1 { def oneAndFoldable[F[_]: Foldable]: Foldable[OneAnd[F, ?]] = oneAndReducible[F] implicit def oneAndReducible[F[_]](implicit F: Foldable[F]): Reducible[OneAnd[F, ?]] = - new Reducible[OneAnd[F, ?]] { - override def reduceLeftTo[A, B](fa: OneAnd[F, A])(f: (A) => B)(g: (B, A) => B): B = - F.foldLeft[A, B](fa.tail, f(fa.head))(g) - - override def reduceRightTo[A, B](fa: OneAnd[F, A])(f: (A) => B)(g: (A, Eval[B]) => Eval[B]): Eval[B] = - F.reduceRightToOption(fa.tail)(f)(g).flatMap { - case None => Eval.later(f(fa.head)) - case Some(b) => g(fa.head, Eval.now(b)) - } - - override def foldLeft[A, B](fa: OneAnd[F, A], b: B)(f: (B, A) => B): B = - fa.foldLeft(b)(f) - override def foldRight[A, B](fa: OneAnd[F, A], lb: Eval[B])(f: (A, Eval[B]) => Eval[B]): Eval[B] = - fa.foldRight(lb)(f) - override def isEmpty[A](fa: OneAnd[F, A]): Boolean = false + new NonEmptyReducible[OneAnd[F,?], F] { + override def split[A](fa: OneAnd[F,A]): (A, F[A]) = (fa.head, fa.tail) } implicit def oneAndMonad[F[_]](implicit monad: MonadCombine[F]): Monad[OneAnd[F, ?]] = From 7fe2d24876a2d5688a377aacc7294563875b8373 Mon Sep 17 00:00:00 2001 From: Arya Irani Date: Mon, 4 Jan 2016 18:35:32 -0500 Subject: [PATCH 3/3] now without binary compatibility --- core/src/main/scala/cats/data/OneAnd.scala | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/src/main/scala/cats/data/OneAnd.scala b/core/src/main/scala/cats/data/OneAnd.scala index 8900f8fc59..369816cb10 100644 --- a/core/src/main/scala/cats/data/OneAnd.scala +++ b/core/src/main/scala/cats/data/OneAnd.scala @@ -106,9 +106,6 @@ private[data] sealed trait OneAndInstances extends OneAndLowPriority1 { implicit def oneAndSemigroup[F[_]: MonadCombine, A]: Semigroup[OneAnd[F, A]] = oneAndSemigroupK.algebra - @deprecated("use oneAndReducible", "0.4.0") - def oneAndFoldable[F[_]: Foldable]: Foldable[OneAnd[F, ?]] = oneAndReducible[F] - implicit def oneAndReducible[F[_]](implicit F: Foldable[F]): Reducible[OneAnd[F, ?]] = new NonEmptyReducible[OneAnd[F,?], F] { override def split[A](fa: OneAnd[F,A]): (A, F[A]) = (fa.head, fa.tail)