Skip to content

Commit

Permalink
Add parTraverse_ and parSequence_ syntax #2341 (#2351)
Browse files Browse the repository at this point in the history
* Add parTraverse_ and parSequence_ syntax #2341

* Remove duplicate parSequence_ implementation

* Move binary incompatible methods to separate trait

* Include syntax extension for single import
  • Loading branch information
denisrosca authored and kailuowang committed Aug 4, 2018
1 parent a23f80a commit 9a59eb6
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 4 deletions.
1 change: 1 addition & 0 deletions core/src/main/scala/cats/implicits.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ object implicits
extends syntax.AllSyntax
with syntax.AllSyntaxBinCompat0
with syntax.AllSyntaxBinCompat1
with syntax.AllSyntaxBinCompat2
with instances.AllInstances
with instances.AllInstancesBinCompat0
4 changes: 4 additions & 0 deletions core/src/main/scala/cats/syntax/all.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ abstract class AllSyntaxBinCompat
extends AllSyntax
with AllSyntaxBinCompat0
with AllSyntaxBinCompat1
with AllSyntaxBinCompat2

trait AllSyntax
extends AlternativeSyntax
Expand Down Expand Up @@ -68,3 +69,6 @@ trait AllSyntaxBinCompat1
with SetSyntax
with ValidatedExtensionSyntax
with RepresentableSyntax

trait AllSyntaxBinCompat2
extends ParallelTraverseSyntax
2 changes: 1 addition & 1 deletion core/src/main/scala/cats/syntax/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ package object syntax {
object nested extends NestedSyntax
object option extends OptionSyntax
object order extends OrderSyntax
object parallel extends ParallelSyntax
object parallel extends ParallelSyntax with ParallelTraverseSyntax
object partialOrder extends PartialOrderSyntax
object profunctor extends ProfunctorSyntax
object reducible extends ReducibleSyntax
Expand Down
24 changes: 22 additions & 2 deletions core/src/main/scala/cats/syntax/parallel.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cats.syntax

import cats.{Monad, Parallel, Traverse, FlatMap}
import cats.{Monad, Parallel, Traverse, FlatMap, Foldable}

trait ParallelSyntax extends TupleParallelSyntax {
implicit final def catsSyntaxParallelTraverse[T[_]: Traverse, A]
Expand All @@ -11,6 +11,7 @@ trait ParallelSyntax extends TupleParallelSyntax {

implicit final def catsSyntaxParallelAp[M[_]: FlatMap, A](ma: M[A]): ParallelApOps[M, A] =
new ParallelApOps[M, A](ma)

}

trait ParallelFlatSyntax {
Expand All @@ -21,11 +22,24 @@ trait ParallelFlatSyntax {
(tmta: T[M[T[A]]]): ParallelFlatSequenceOps[T, M, A] = new ParallelFlatSequenceOps[T, M, A](tmta)
}

final class ParallelTraversableOps[T[_], A](val ta: T[A]) extends AnyVal {
trait ParallelTraverseSyntax {
implicit final def catsSyntaxParallelTraverse_[T[_]: Foldable, A]
(ta: T[A]): ParallelTraversable_Ops[T, A] = new ParallelTraversable_Ops[T, A](ta)

implicit final def catsSyntaxParallelSequence_[T[_]: Foldable, M[_], A]
(tma: T[M[A]]): ParallelSequence_Ops[T, M, A] = new ParallelSequence_Ops[T, M, A](tma)
}

final class ParallelTraversableOps[T[_], A](val ta: T[A]) extends AnyVal {
def parTraverse[M[_]: Monad, F[_], B]
(f: A => M[B])(implicit T: Traverse[T], P: Parallel[M, F]): M[T[B]] =
Parallel.parTraverse(ta)(f)

}

final class ParallelTraversable_Ops[T[_], A](val ta: T[A]) extends AnyVal {
def parTraverse_[M[_], F[_], B](f: A => M[B])(implicit T: Foldable[T], P: Parallel[M, F]): M[Unit] =
Parallel.parTraverse_(ta)(f)
}

final class ParallelFlatTraversableOps[T[_], A](val ta: T[A]) extends AnyVal {
Expand All @@ -40,6 +54,12 @@ final class ParallelSequenceOps[T[_], M[_], A](val tma: T[M[A]]) extends AnyVal
Parallel.parSequence(tma)
}

final class ParallelSequence_Ops[T[_], M[_], A](val tma: T[M[A]]) extends AnyVal {
def parSequence_[F[_]]
(implicit T: Foldable[T], P: Parallel[M, F]): M[Unit] =
Parallel.parSequence_(tma)
}

final class ParallelFlatSequenceOps[T[_], M[_], A](val tmta: T[M[T[A]]]) extends AnyVal {
def parFlatSequence[F[_]]
(implicit M: Monad[M], T0: Traverse[T], T1 : FlatMap[T], P: Parallel[M, F]): M[T[A]] =
Expand Down
3 changes: 2 additions & 1 deletion testkit/src/main/scala/cats/tests/CatsSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package tests

import catalysts.Platform
import cats.instances.{AllInstances, AllInstancesBinCompat0}
import cats.syntax.{AllSyntax, AllSyntaxBinCompat0, AllSyntaxBinCompat1, EqOps}
import cats.syntax.{AllSyntax, AllSyntaxBinCompat0, AllSyntaxBinCompat1, AllSyntaxBinCompat2, EqOps}
import org.scalactic.anyvals.{PosInt, PosZDouble, PosZInt}
import org.scalatest.{FunSuite, FunSuiteLike, Matchers}
import org.scalatest.prop.{Configuration, GeneratorDrivenPropertyChecks}
Expand Down Expand Up @@ -35,6 +35,7 @@ trait CatsSuite extends FunSuite
with TestSettings
with AllInstances with AllInstancesBinCompat0
with AllSyntax with AllSyntaxBinCompat0 with AllSyntaxBinCompat1
with AllSyntaxBinCompat2
with StrictCatsEquality { self: FunSuiteLike =>

implicit override val generatorDrivenConfig: PropertyCheckConfiguration =
Expand Down
12 changes: 12 additions & 0 deletions tests/src/test/scala/cats/tests/ParallelSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,18 @@ class ParallelSuite extends CatsSuite with ApplicativeErrorForEitherTest {
}
}

test("ParTraverse_ syntax should be equivalent to Parallel.parTraverse_") {
forAll { es: SortedSet[Either[String, Int]] =>
Parallel.parTraverse_(es)(identity) should === (es.parTraverse_(identity))
}
}

test("ParSequence_ syntax should be equivalent to Parallel.parSequence_") {
forAll { es: SortedSet[Either[String, Int]] =>
Parallel.parSequence_(es) should === (es.parSequence_)
}
}

test("ParNonEmptyTraverse identity should be equivalent to parNonEmptySequence") {
forAll { es: NonEmptyVector[Either[String, Int]] =>
Parallel.parNonEmptyTraverse(es)(identity) should === (Parallel.parNonEmptySequence(es))
Expand Down

0 comments on commit 9a59eb6

Please sign in to comment.