From b9c5b3e35848352198a2b76b33b695cc71524965 Mon Sep 17 00:00:00 2001 From: Maxim Davydov Date: Fri, 27 Sep 2019 20:59:09 +0300 Subject: [PATCH] #2947 Added bifold to Bifoldable typeclass --- core/src/main/scala/cats/Bifoldable.scala | 3 +++ tests/src/test/scala/cats/tests/BifoldableSuite.scala | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/core/src/main/scala/cats/Bifoldable.scala b/core/src/main/scala/cats/Bifoldable.scala index ae49e72d327..a41f9c27c95 100644 --- a/core/src/main/scala/cats/Bifoldable.scala +++ b/core/src/main/scala/cats/Bifoldable.scala @@ -25,6 +25,9 @@ import simulacrum.typeclass val F = self val G = ev } + + def bifold[A, B](fab: F[A, B])(implicit A: Monoid[A], B: Monoid[B], C: Monoid[(A, B)]): (A, B) = + bifoldMap(fab)((_, B.empty), (A.empty, _)) } private[cats] trait ComposedBifoldable[F[_, _], G[_, _]] extends Bifoldable[λ[(α, β) => F[G[α, β], G[α, β]]]] { diff --git a/tests/src/test/scala/cats/tests/BifoldableSuite.scala b/tests/src/test/scala/cats/tests/BifoldableSuite.scala index 2dc2930c692..9715f8149a8 100644 --- a/tests/src/test/scala/cats/tests/BifoldableSuite.scala +++ b/tests/src/test/scala/cats/tests/BifoldableSuite.scala @@ -10,4 +10,9 @@ class BifoldableSuite extends CatsSuite { checkAll("Either compose Either", BifoldableTests(eitherComposeEither).bifoldable[Int, Int, Int]) checkAll("Bifoldable[Either compose Either]", SerializableTests.serializable(eitherComposeEither)) + + test("bifold works for 2 monoids") { + Bifoldable[Either].bifold(Either.right[Int, String]("something")) should === ((0, "something")) + Bifoldable[Either].bifold(Either.left[Int, String](5)) should === ((5, "")) + } }