diff --git a/core/src/main/scala/cats/syntax/monadError.scala b/core/src/main/scala/cats/syntax/monadError.scala index 9cac8d513c..1cae06f2ea 100644 --- a/core/src/main/scala/cats/syntax/monadError.scala +++ b/core/src/main/scala/cats/syntax/monadError.scala @@ -24,7 +24,7 @@ final class MonadErrorOps[F[_], E, A](private val fa: F[A]) extends AnyVal { */ def reject(pf: PartialFunction[A, E])(implicit F: MonadError[F, E]): F[A] = F.flatMap(fa) { a => - pf.andThen(F.raiseError[A] _).applyOrElse(a, (_: A) => fa) + pf.andThen(F.raiseError[A] _).applyOrElse(a, F.pure) } def adaptError(pf: PartialFunction[E, E])(implicit F: MonadError[F, E]): F[A] = diff --git a/tests/src/test/scala/cats/tests/RegressionSuite.scala b/tests/src/test/scala/cats/tests/RegressionSuite.scala index 261b1f5139..a04d5f08c4 100644 --- a/tests/src/test/scala/cats/tests/RegressionSuite.scala +++ b/tests/src/test/scala/cats/tests/RegressionSuite.scala @@ -1,7 +1,7 @@ package cats package tests -import cats.data.{Const, NonEmptyList} +import cats.data.{Const, NonEmptyList, StateT} import scala.collection.mutable import scala.collection.immutable.SortedMap class RegressionSuite extends CatsSuite { @@ -157,4 +157,8 @@ class RegressionSuite extends CatsSuite { } + test("#2809 MonadErrorOps.reject runs effects only once") { + val program = StateT.modify[Either[Throwable, ?], Int](_ + 1).reject { case _ if false => new Throwable } + program.runS(0).right.get should ===(1) + } }