diff --git a/core/src/main/scala/cats/syntax/foldable.scala b/core/src/main/scala/cats/syntax/foldable.scala index 87902c3ca3..eb6bb70460 100644 --- a/core/src/main/scala/cats/syntax/foldable.scala +++ b/core/src/main/scala/cats/syntax/foldable.scala @@ -4,6 +4,9 @@ package syntax trait FoldableSyntax extends Foldable.ToFoldableOps { implicit final def catsSyntaxNestedFoldable[F[_]: Foldable, G[_], A](fga: F[G[A]]): NestedFoldableOps[F, G, A] = new NestedFoldableOps[F, G, A](fga) + + implicit final def catsSyntaxFoldOps[F[_]: Foldable, A](fa: F[A]): FoldableOps[F, A] = + new FoldableOps[F, A](fa) } final class NestedFoldableOps[F[_], G[_], A](val fga: F[G[A]]) extends AnyVal { @@ -23,3 +26,11 @@ final class NestedFoldableOps[F[_], G[_], A](val fga: F[G[A]]) extends AnyVal { */ def foldK(implicit F: Foldable[F], G: MonoidK[G]): G[A] = F.foldK(fga) } + +final class FoldableOps[F[_], A](val fa: F[A]) extends AnyVal { + def foldl[B](b: B)(f: (B, A) => B)(implicit F: Foldable[F]): B = + F.foldLeft(fa, b)(f) + + def foldr[B](b: Eval[B])(f: (A, Eval[B]) => Eval[B])(implicit F: Foldable[F]): Eval[B] = + F.foldRight(fa, b)(f) +} diff --git a/tests/src/test/scala/cats/tests/SyntaxSuite.scala b/tests/src/test/scala/cats/tests/SyntaxSuite.scala index 2a28009324..736965a2fc 100644 --- a/tests/src/test/scala/cats/tests/SyntaxSuite.scala +++ b/tests/src/test/scala/cats/tests/SyntaxSuite.scala @@ -103,10 +103,12 @@ object SyntaxSuite extends AllInstances with AllSyntax { val b = mock[B] val f1 = mock[(B, A) => B] val b0: B = fa.foldLeft(b)(f1) + val b1: B = fa.foldl(b)(f1) val a0: A = fa.fold val f2 = mock[(A, Eval[B]) => Eval[B]] val lb0: Eval[B] = fa.foldRight(Now(b))(f2) + val lb1: Eval[B] = fa.foldr(Now(b))(f2) val fz = mock[F[Z]] val f3 = mock[Z => A]