From b77952b4c67fdab4ecc1f93cf484cf873e76b82b Mon Sep 17 00:00:00 2001 From: takayahilton Date: Tue, 4 Aug 2020 22:54:03 +0900 Subject: [PATCH] Enable breakout in Reducible[NonEmptyLazyList].reduceRightTo --- .../main/scala-2.13+/cats/data/NonEmptyLazyList.scala | 2 +- tests/src/test/scala/cats/tests/ReducibleSuite.scala | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) 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 2ff81ceb0e..2e2b64d088 100644 --- a/core/src/main/scala-2.13+/cats/data/NonEmptyLazyList.scala +++ b/core/src/main/scala-2.13+/cats/data/NonEmptyLazyList.scala @@ -484,7 +484,7 @@ sealed abstract private[data] class NonEmptyLazyListInstances extends NonEmptyLa def reduceLeftTo[A, B](fa: NonEmptyLazyList[A])(f: A => B)(g: (B, A) => B): B = fa.reduceLeftTo(f)(g) def reduceRightTo[A, B](fa: NonEmptyLazyList[A])(f: A => B)(g: (A, cats.Eval[B]) => cats.Eval[B]): cats.Eval[B] = - Eval.defer(fa.reduceRightTo(a => Eval.now(f(a))) { (a, b) => + Eval.defer(fa.reduceRightTo(a => Eval.later(f(a))) { (a, b) => Eval.defer(g(a, b)) }) diff --git a/tests/src/test/scala/cats/tests/ReducibleSuite.scala b/tests/src/test/scala/cats/tests/ReducibleSuite.scala index 93f8e74788..2cd4d3e0ec 100644 --- a/tests/src/test/scala/cats/tests/ReducibleSuite.scala +++ b/tests/src/test/scala/cats/tests/ReducibleSuite.scala @@ -69,7 +69,7 @@ class ReducibleSuiteAdditional extends CatsSuite { val large = NonEmptyList(1, (2 to 10000).toList) assert(contains(large, 10000).value) } - + // A simple non-empty stream with lazy `foldRight` and `reduceRightTo` implementations. case class NES[A](h: A, t: Stream[A]) { def toStream: Stream[A] = h #:: t @@ -215,4 +215,13 @@ abstract class ReducibleSuite[F[_]: Reducible](name: String)(implicit assert(out.toList === List(2, 4, 6, 9)) } + + test(s"Reducible[$name].nonEmptyTraverse_ can breakout") { + val notAllEven = fromValues(2, 4, 6, 9, 10, 12, 14) + val out = mutable.ListBuffer[Int]() + + notAllEven.nonEmptyTraverse_ { a => out += a; if (a % 2 == 0) Some(a) else None } + + assert(out.toList === List(2, 4, 6, 9)) + } }