Skip to content

Commit

Permalink
Add comments, remove redundant syntax extension
Browse files Browse the repository at this point in the history
  • Loading branch information
catostrophe committed Aug 11, 2018
1 parent 2f71ee1 commit c790418
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 9 deletions.
1 change: 0 additions & 1 deletion core/src/main/scala/cats/syntax/all.scala
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,3 @@ trait AllSyntaxBinCompat1

trait AllSyntaxBinCompat2
extends ParallelTraverseSyntax
with FoldableExtensionSyntax
27 changes: 20 additions & 7 deletions core/src/main/scala/cats/syntax/foldable.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
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 @@ -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
Expand Down

0 comments on commit c790418

Please sign in to comment.