Skip to content

Commit

Permalink
Merge pull request typelevel#975 from peterneyens/add-monadcombine-se…
Browse files Browse the repository at this point in the history
…parate-syntax

Add syntax for separate from MonadCombine.
  • Loading branch information
non committed Apr 21, 2016
2 parents ed194a7 + c21a065 commit d8917df
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 4 deletions.
29 changes: 25 additions & 4 deletions core/src/main/scala/cats/syntax/monadCombine.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,22 @@ package syntax

trait MonadCombineSyntax {
// TODO: use simulacrum instances eventually
implicit def nestedMonadCombineSyntax[F[_]: MonadCombine, G[_], A](fga: F[G[A]]): NestedMonadCombineOps[F, G, A] =
new NestedMonadCombineOps[F, G, A](fga)
implicit def monadCombineSyntax[F[_]: MonadCombine, G[_], A](fga: F[G[A]]): MonadCombineOps[F, G, A] =
new MonadCombineOps[F, G, A](fga)

implicit def separateSyntax[F[_]: MonadCombine, G[_, _], A, B](fgab: F[G[A, B]]): SeparateOps[F, G, A, B] =
new SeparateOps[F, G, A, B](fgab)
}

final class NestedMonadCombineOps[F[_], G[_], A](fga: F[G[A]])(implicit F: MonadCombine[F]) {
final class MonadCombineOps[F[_], G[_], A](fga: F[G[A]])(implicit F: MonadCombine[F]) {

/**
* @see [[MonadCombine.unite]]
*
* Example:
* {{{
* scala> import cats.std.list._
* scala> import cats.std.vector._
* scala> import cats.std.vector._
* scala> import cats.syntax.monadCombine._
* scala> val x: List[Vector[Int]] = List(Vector(1, 2), Vector(3, 4))
* scala> x.unite
Expand All @@ -24,3 +27,21 @@ final class NestedMonadCombineOps[F[_], G[_], A](fga: F[G[A]])(implicit F: Monad
*/
def unite(implicit G: Foldable[G]): F[A] = F.unite(fga)
}

final class SeparateOps[F[_], G[_, _], A, B](fgab: F[G[A, B]])(implicit F: MonadCombine[F]) {

/**
* @see [[MonadCombine.separate]]
*
* Example:
* {{{
* scala> import cats.data.Xor
* scala> import cats.std.list._
* scala> import cats.syntax.monadCombine._
* scala> val l: List[Xor[String, Int]] = List(Xor.right(1), Xor.left("error"))
* scala> l.separate
* res0: (List[String], List[Int]) = (List(error),List(1))
* }}}
*/
def separate(implicit G: Bifoldable[G]): (F[A], F[B]) = F.separate(fgab)
}
8 changes: 8 additions & 0 deletions tests/src/test/scala/cats/tests/SyntaxTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,14 @@ class SyntaxTests extends AllInstances with AllSyntax {
val gfab = fgagb.bisequence
}

def testMonadCombine[F[_]: MonadCombine, G[_]: Foldable, H[_, _]: Bifoldable, A, B]: Unit = {
val fga = mock[F[G[A]]]
val fa = fga.unite

val fhab = mock[F[H[A, B]]]
val fafb = fhab.separate
}

def testApplicative[F[_]: Applicative, A]: Unit = {
val a = mock[A]
val fa = a.pure[F]
Expand Down

0 comments on commit d8917df

Please sign in to comment.