From add2a1a1eb62d927372f06573185af4c5a48626f Mon Sep 17 00:00:00 2001 From: Julien Truffaut Date: Fri, 29 Sep 2017 16:09:50 +0100 Subject: [PATCH] add traverseN to CartesianBuilder --- project/Boilerplate.scala | 8 ++++++++ tests/src/test/scala/cats/tests/SyntaxTests.scala | 10 +++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/project/Boilerplate.scala b/project/Boilerplate.scala index 86b541893f..84092bce04 100644 --- a/project/Boilerplate.scala +++ b/project/Boilerplate.scala @@ -217,6 +217,8 @@ object Boilerplate { - invariant.imap($nestedProducts) { case ${`nested (a..n)`} => f(${`a..n`}) } { z => val ${`(a..n)`} = g(z); ${`nested (a..n)`} } - def tuple$arity[F[_], ${`A..N`}]($fparams)(implicit cartesian: Cartesian[F], invariant: functor.Invariant[F]):F[(${`A..N`})] = - imap$arity($fargsS)((${`_.._`}))(identity) + - def traverse$arity[F[_], G[_], ${`A..N`}, Z]($fparams)(f: (${`A..N`}) => G[Z])(implicit cartesian: Cartesian[F], traverse: Traverse[F], applicative: Applicative[G]): G[F[Z]] = + - traverse.traverse($nestedProducts) { case ${`nested (a..n)`} => f(${`a..n`}) } |} """ } @@ -255,6 +257,11 @@ object Boilerplate { "" } + val traverse = + if (arity == 1) s"def traverse[G[_]: Applicative, Z](f: (${`A..N`}) => G[Z])(implicit traverse: Traverse[F]): G[F[Z]] = traverse.traverse($tupleArgs)(f)" + else s"def traverseN[G[_]: Applicative, Z](f: (${`A..N`}) => G[Z])(implicit traverse: Traverse[F], cartesian: Cartesian[F]): G[F[Z]] = Cartesian.traverse$arity($tupleArgs)(f)" + + block""" |package cats |package syntax @@ -270,6 +277,7 @@ object Boilerplate { - $contramap - $imap - $tupled + - $traverse - def apWith[Z](f: F[(${`A..N`}) => Z])(implicit apply: Apply[F]): F[Z] = apply.ap$n(f)($tupleArgs) -} | diff --git a/tests/src/test/scala/cats/tests/SyntaxTests.scala b/tests/src/test/scala/cats/tests/SyntaxTests.scala index c4e17a28e4..1df7b7c735 100644 --- a/tests/src/test/scala/cats/tests/SyntaxTests.scala +++ b/tests/src/test/scala/cats/tests/SyntaxTests.scala @@ -127,8 +127,11 @@ object SyntaxTests extends AllInstances with AllSyntax { val as2: List[A] = fa.dropWhile_(f5) } - def testTraverse[F[_]: Traverse: FlatMap, G[_]: Applicative, A, B]: Unit = { + def testTraverse[F[_]: Traverse: FlatMap, G[_]: Applicative, A, B, C, Z]: Unit = { + val tfabc = mock[(F[A], F[B], F[C])] val fa = mock[F[A]] + val fb = mock[F[B]] + val fc = mock[F[C]] val f1 = mock[A => G[B]] val gfb: G[F[B]] = fa.traverse(f1) @@ -137,6 +140,11 @@ object SyntaxTests extends AllInstances with AllSyntax { val fga = mock[F[G[A]]] val gunit: G[F[A]] = fga.sequence + + val ft = mock[(A, B, C) => G[Z]] + + val gfabc = tfabc traverseN ft + val gfabc2 = (fa, fb, fc) traverseN ft }