Skip to content

Commit

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

trait AllSyntaxBinCompat2
extends ParallelTraverseSyntax
with FoldableExtensionSyntax
14 changes: 14 additions & 0 deletions core/src/main/scala/cats/syntax/foldable.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package cats
package syntax

import cats.data.OptionT

trait FoldableSyntax extends Foldable.ToFoldableOps with UnorderedFoldable.ToUnorderedFoldableOps {
implicit final def catsSyntaxNestedFoldable[F[_]: Foldable, G[_], A](fga: F[G[A]]): NestedFoldableOps[F, G, A] =
new NestedFoldableOps[F, G, A](fga)
Expand Down Expand Up @@ -93,3 +95,15 @@ final class FoldableOps[F[_], A](val fa: F[A]) extends AnyVal {
} + 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 {
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))
).value.value
}
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
object foldable extends FoldableSyntax with FoldableExtensionSyntax
object functor extends FunctorSyntax
object group extends GroupSyntax
object invariant extends InvariantSyntax
Expand Down
10 changes: 9 additions & 1 deletion tests/src/test/scala/cats/tests/FoldableSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -140,12 +140,20 @@ abstract class FoldableSuite[F[_]: Foldable](name: String)(
fa.toList should === (iterator(fa).toList)
}
}

test(s"Foldable[$name] mkString_") {
forAll { (fa: F[Int]) =>
fa.mkString_("L[", ";", "]") should === (fa.toList.mkString("L[", ";", "]"))
}
}

test(s"Foldable[$name].collectFirstSomeM") {
forAll { (fa: F[Int], n: Int) =>
fa.collectFirstSomeM(x => (x > n).guard[Option].as(x).asRight[String]) should === (fa.toList.collectFirst {
case x if x > n => x
}.asRight[String])
}
}
}

class FoldableSuiteAdditional extends CatsSuite {
Expand Down

0 comments on commit 2f71ee1

Please sign in to comment.