diff --git a/core/src/main/scala/scalaz/syntax/MonadPlusSyntax.scala b/core/src/main/scala/scalaz/syntax/MonadPlusSyntax.scala index ee109848f3..fd62de446c 100644 --- a/core/src/main/scala/scalaz/syntax/MonadPlusSyntax.scala +++ b/core/src/main/scala/scalaz/syntax/MonadPlusSyntax.scala @@ -20,6 +20,12 @@ final class MonadPlusOps[F[_],A] private[syntax](val self: F[A])(implicit val F: F.unite[T, B](ftb) } + final def lefts[G[_, _], B, C](implicit ev: A === G[B, C], G: Bifoldable[G]): F[B] = + F.bind(ev.subst(self))(b => G.leftFoldable.foldMap(b)(F.point(_))(F.monoid[B])) + + final def rights[G[_, _], B, C](implicit ev: A === G[B, C], G: Bifoldable[G]): F[C] = + F.bind(ev.subst(self))(c => G.rightFoldable.foldMap(c)(F.point(_))(F.monoid[C])) + final def separate[G[_, _], B, C](implicit ev: A === G[B, C], G: Bifoldable[G]): (F[B], F[C]) = F.separate(ev.subst(self)) diff --git a/tests/src/test/scala/scalaz/MonadPlusTest.scala b/tests/src/test/scala/scalaz/MonadPlusTest.scala index c7b807fd2e..4bccf389a3 100644 --- a/tests/src/test/scala/scalaz/MonadPlusTest.scala +++ b/tests/src/test/scala/scalaz/MonadPlusTest.scala @@ -14,6 +14,32 @@ object MonadPlusTest extends SpecLite { MonadPlus[List].uniteU(List(\/.right(1), \/.left("a"), \/.right(2))) must_===(List(1, 2)) } + "lefts" in { + import \&/._ + import syntax.monadPlus._ + + List(\/.right(1), \/.left("a"), \/.right(2)).lefts must_===(List("a")) + + List(1 -> "a", 2 -> "b").lefts must_===(List(1, 2)) + + Vector[Int \&/ String](This(1), Both(3, "a"), That("b")).lefts must_===(Vector(1, 3)) + + Stream(Success(1), Failure("a"), Success(2)).lefts must_===(Stream("a")) + } + + "rights" in { + import \&/._ + import syntax.monadPlus._ + + List(\/.right(1), \/.left("a"), \/.right(2)).rights must_===(List(1, 2)) + + List(1 -> "a", 2 -> "b").rights must_===(List("a", "b")) + + Vector[Int \&/ String](This(1), Both(3, "a"), That("b")).rights must_===(Vector("a", "b")) + + Stream(Success(1), Failure("a"), Success(2)).rights must_===(Stream(1, 2)) + } + "separate" in { import \&/._ import syntax.monadPlus._