From 1c1da2a5fb54c25ae04223aa7f1a76bc1ded5fc2 Mon Sep 17 00:00:00 2001 From: mhughe008 Date: Fri, 25 Jan 2019 10:13:02 -0500 Subject: [PATCH 1/4] Adds version of mkString_ with no prefix/suffix, matching the std lib. --- .../src/main/scala/cats/syntax/foldable.scala | 24 ++++++++++++++++++- .../test/scala/cats/tests/FoldableSuite.scala | 6 +++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/core/src/main/scala/cats/syntax/foldable.scala b/core/src/main/scala/cats/syntax/foldable.scala index 38b2ee6c78..51ba04469d 100644 --- a/core/src/main/scala/cats/syntax/foldable.scala +++ b/core/src/main/scala/cats/syntax/foldable.scala @@ -77,7 +77,9 @@ final class FoldableOps[F[_], A](private val fa: F[A]) extends AnyVal { A.combine(prefix, A.combine(F.intercalate(fa, delim), suffix)) /** - * Make a string using `Show`, named as `mkString_` to avoid conflict + * Make a string using `Show`, prefix, delimiter, and suffix. + * + * Named as `mkString_` to avoid conflict. * * Example: * {{{ @@ -204,6 +206,26 @@ final class FoldableOps[F[_], A](private val fa: F[A]) extends AnyVal { final class FoldableOps0[F[_], A](private val fa: F[A]) extends AnyVal { + /** + * Make a string using `Show` and delimiter. + * + * Named as `mkString_` to avoid conflict. + * + * Example: + * {{{ + * scala> import cats.implicits._ + * + * scala> val l: List[Int] = List(1, 2, 3) + * scala> l.mkString_(",") + * res0: String = 1,2,3 + * scala> val el: List[Int] = List() + * scala> el.mkString_(",") + * res1: String = + * }}} + */ + def mkString_(delim: String)(implicit A: Show[A], F: Foldable[F]): String = + new FoldableOps(fa).mkString_("", delim, "") + /** * Fold implemented by mapping `A` values into `B` in a context `G` and then * combining them using the `MonoidK[G]` instance. diff --git a/tests/src/test/scala/cats/tests/FoldableSuite.scala b/tests/src/test/scala/cats/tests/FoldableSuite.scala index 2b9e28e093..c0bfd5e722 100644 --- a/tests/src/test/scala/cats/tests/FoldableSuite.scala +++ b/tests/src/test/scala/cats/tests/FoldableSuite.scala @@ -222,6 +222,12 @@ abstract class FoldableSuite[F[_]: Foldable](name: String)(implicit ArbFInt: Arb } } + test(s"Foldable[$name] mkString_ delimiter only") { + forAll { (fa: F[Int]) => + fa.mkString_(",") should ===(fa.toList.mkString(",")) + } + } + test(s"Foldable[$name].collectFirstSomeM") { forAll { (fa: F[Int], n: Int) => fa.collectFirstSomeM(x => (x > n).guard[Option].as(x).asRight[String]) should ===( From 52f366803681a946ef238c7e4f3562b0e70e42d2 Mon Sep 17 00:00:00 2001 From: "Kai(luo) Wang" Date: Wed, 30 Jan 2019 09:11:59 -0500 Subject: [PATCH 2/4] update CatsSuite to pass build --- testkit/src/main/scala/cats/tests/CatsSuite.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/testkit/src/main/scala/cats/tests/CatsSuite.scala b/testkit/src/main/scala/cats/tests/CatsSuite.scala index e4da414b36..22b08c9c26 100644 --- a/testkit/src/main/scala/cats/tests/CatsSuite.scala +++ b/testkit/src/main/scala/cats/tests/CatsSuite.scala @@ -16,6 +16,7 @@ import cats.syntax.{ AllSyntaxBinCompat1, AllSyntaxBinCompat2, AllSyntaxBinCompat3, + AllSyntaxBinCompat4 EqOps } import org.scalactic.anyvals.{PosInt, PosZDouble, PosZInt} @@ -59,6 +60,7 @@ trait CatsSuite with AllSyntaxBinCompat1 with AllSyntaxBinCompat2 with AllSyntaxBinCompat3 + with AllSyntaxBinCompat4 with StrictCatsEquality { self: FunSuiteLike => implicit override val generatorDrivenConfig: PropertyCheckConfiguration = From 3b00b80f60d4f6363e3c872d3d20a93cd849ab93 Mon Sep 17 00:00:00 2001 From: "Kai(luo) Wang" Date: Wed, 30 Jan 2019 11:35:09 -0500 Subject: [PATCH 3/4] Update CatsSuite.scala --- testkit/src/main/scala/cats/tests/CatsSuite.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testkit/src/main/scala/cats/tests/CatsSuite.scala b/testkit/src/main/scala/cats/tests/CatsSuite.scala index 22b08c9c26..b71890c035 100644 --- a/testkit/src/main/scala/cats/tests/CatsSuite.scala +++ b/testkit/src/main/scala/cats/tests/CatsSuite.scala @@ -16,7 +16,7 @@ import cats.syntax.{ AllSyntaxBinCompat1, AllSyntaxBinCompat2, AllSyntaxBinCompat3, - AllSyntaxBinCompat4 + AllSyntaxBinCompat4, EqOps } import org.scalactic.anyvals.{PosInt, PosZDouble, PosZInt} From 68be2188adf62dcb22dad48d229f9333aead8e6b Mon Sep 17 00:00:00 2001 From: Kailuo Wang Date: Wed, 30 Jan 2019 21:10:03 -0500 Subject: [PATCH 4/4] removed unneccessary imports --- tests/src/test/scala/cats/tests/FoldableSuite.scala | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/src/test/scala/cats/tests/FoldableSuite.scala b/tests/src/test/scala/cats/tests/FoldableSuite.scala index c0bfd5e722..1986caa511 100644 --- a/tests/src/test/scala/cats/tests/FoldableSuite.scala +++ b/tests/src/test/scala/cats/tests/FoldableSuite.scala @@ -79,7 +79,6 @@ abstract class FoldableSuite[F[_]: Foldable](name: String)(implicit ArbFInt: Arb } test("Foldable#partitionEitherM retains size") { - import cats.syntax.foldable._ forAll { (fi: F[Int], f: Int => Either[String, String]) => val vector = Foldable[F].toList(fi).toVector val result = Foldable[Vector].partitionEitherM(vector)(f.andThen(Option.apply)).map { @@ -91,7 +90,6 @@ abstract class FoldableSuite[F[_]: Foldable](name: String)(implicit ArbFInt: Arb } test("Foldable#partitionEitherM consistent with List#partition") { - import cats.syntax.foldable._ forAll { (fi: F[Int], f: Int => Either[String, String]) => val list = Foldable[F].toList(fi) val partitioned = Foldable[List].partitionEitherM(list)(f.andThen(Option.apply)) @@ -108,7 +106,6 @@ abstract class FoldableSuite[F[_]: Foldable](name: String)(implicit ArbFInt: Arb } test("Foldable#partitionEitherM to one side is identity") { - import cats.syntax.foldable._ forAll { (fi: F[Int], f: Int => String) => val list = Foldable[F].toList(fi) val g: Int => Option[Either[Double, String]] = f.andThen(Right.apply).andThen(Option.apply) @@ -123,7 +120,6 @@ abstract class FoldableSuite[F[_]: Foldable](name: String)(implicit ArbFInt: Arb } test("Foldable#partitionEitherM remains sorted") { - import cats.syntax.foldable._ forAll { (fi: F[Int], f: Int => Either[String, String]) => val list = Foldable[F].toList(fi)