diff --git a/core/src/main/scala/cats/syntax/all.scala b/core/src/main/scala/cats/syntax/all.scala index 4c55d233a08..ebee850312e 100644 --- a/core/src/main/scala/cats/syntax/all.scala +++ b/core/src/main/scala/cats/syntax/all.scala @@ -72,4 +72,3 @@ trait AllSyntaxBinCompat1 trait AllSyntaxBinCompat2 extends ParallelTraverseSyntax - with FoldableExtensionSyntax diff --git a/core/src/main/scala/cats/syntax/foldable.scala b/core/src/main/scala/cats/syntax/foldable.scala index 0c309b928f4..3a7f21646b2 100644 --- a/core/src/main/scala/cats/syntax/foldable.scala +++ b/core/src/main/scala/cats/syntax/foldable.scala @@ -94,14 +94,27 @@ final class FoldableOps[F[_], A](val fa: F[A]) extends AnyVal { b.toString.dropRight(delim.length) } + suffix } -} - -trait FoldableExtensionSyntax { - implicit final def catsSyntaxFoldableExtension[F[_], A](fa: F[A]): FoldableExtension[F, A] = - new FoldableExtension(fa) -} -final class FoldableExtension[F[_], A](val fa: F[A]) extends AnyVal { + /** + * Monadic version of `collectFirstSome`. + * {{{ + * scala> import cats.implicits._ + * scala> def parseInt(s: String): Either[String, Int] = Either.catchOnly[NumberFormatException](s.toInt).leftMap(_.getMessage) + * scala> val keys1 = List("1", "2", "4", "5") + * scala> val map1 = Map(4 -> "Four", 5 -> "Five") + * scala> keys1.collectFirstSomeM(parseInt(_) map map1.get) + * res1: scala.util.Either[String,Option[String]] = Right(Some(Four)) + * scala> val map2 = Map(6 -> "Six", 7 -> "Seven") + * scala> keys1.collectFirstSomeM(parseInt(_) map map2.get) + * res2: scala.util.Either[String,Option[String]] = Right(None) + * scala> val keys2 = List("1", "x", "4", "5") + * scala> keys2.collectFirstSomeM(parseInt(_) map map1.get) + * res3: scala.util.Either[String,Option[String]] = Left(For input string: "x") + * scala> val keys3 = List("1", "2", "4", "x") + * scala> keys3.collectFirstSomeM(parseInt(_) map map1.get) + * res4: scala.util.Either[String,Option[String]] = Right(Some(Four)) + * }}} + */ def collectFirstSomeM[G[_], B](f: A => G[Option[B]])(implicit F: Foldable[F], G: Monad[G]): G[Option[B]] = F.foldRight(fa, Eval.now(OptionT.none[G, B]))((a, lb) => Eval.now(OptionT(f(a)).orElse(lb.value)) diff --git a/core/src/main/scala/cats/syntax/package.scala b/core/src/main/scala/cats/syntax/package.scala index c47d988cd3e..cf16200fff7 100644 --- a/core/src/main/scala/cats/syntax/package.scala +++ b/core/src/main/scala/cats/syntax/package.scala @@ -26,7 +26,7 @@ package object syntax { object either extends EitherSyntax object eq extends EqSyntax object flatMap extends FlatMapSyntax - object foldable extends FoldableSyntax with FoldableExtensionSyntax + object foldable extends FoldableSyntax object functor extends FunctorSyntax object group extends GroupSyntax object invariant extends InvariantSyntax