Skip to content

Commit

Permalink
Add lefts and rights functions to MonadPlus
Browse files Browse the repository at this point in the history
They were already present as private functions in `separate`.

(cherry picked from commit 7d865da)
  • Loading branch information
jdnavarro authored and xuwei-k committed Sep 30, 2016
1 parent c7996ac commit 82a5e27
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 0 deletions.
6 changes: 6 additions & 0 deletions core/src/main/scala/scalaz/syntax/MonadPlusSyntax.scala
Expand Up @@ -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))

Expand Down
26 changes: 26 additions & 0 deletions tests/src/test/scala/scalaz/MonadPlusTest.scala
Expand Up @@ -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._
Expand Down

0 comments on commit 82a5e27

Please sign in to comment.