Skip to content

Commit 188d45d

Browse files
authored
Merge pull request #4207 from armanbilge/issue/3687
Make `whenA`/`unlessA` syntax by-name lazy
2 parents f2c78d9 + 9dbef75 commit 188d45d

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

core/src/main/scala/cats/syntax/applicative.scala

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,31 @@ package syntax
2525
trait ApplicativeSyntax {
2626
implicit final def catsSyntaxApplicativeId[A](a: A): ApplicativeIdOps[A] =
2727
new ApplicativeIdOps[A](a)
28-
implicit final def catsSyntaxApplicative[F[_], A](fa: F[A]): ApplicativeOps[F, A] =
28+
implicit final def catsSyntaxApplicativeByName[F[_], A](fa: => F[A]): ApplicativeByNameOps[F, A] =
29+
new ApplicativeByNameOps[F, A](() => fa)
30+
implicit final def catsSyntaxApplicativeByValue[F[_], A](fa: F[A]): ApplicativeByValueOps[F, A] =
31+
new ApplicativeByValueOps[F, A](fa)
32+
@deprecated("Use by-value or by-name version", "2.8.0")
33+
final def catsSyntaxApplicative[F[_], A](fa: F[A]): ApplicativeOps[F, A] =
2934
new ApplicativeOps[F, A](fa)
3035
}
3136

3237
final class ApplicativeIdOps[A](private val a: A) extends AnyVal {
3338
def pure[F[_]](implicit F: Applicative[F]): F[A] = F.pure(a)
3439
}
3540

41+
@deprecated("Use by-value or by-name version", "2.8.0")
3642
final class ApplicativeOps[F[_], A](private val fa: F[A]) extends AnyVal {
3743
def replicateA(n: Int)(implicit F: Applicative[F]): F[List[A]] = F.replicateA(n, fa)
3844
def unlessA(cond: Boolean)(implicit F: Applicative[F]): F[Unit] = F.unlessA(cond)(fa)
3945
def whenA(cond: Boolean)(implicit F: Applicative[F]): F[Unit] = F.whenA(cond)(fa)
4046
}
47+
48+
final class ApplicativeByValueOps[F[_], A](private val fa: F[A]) extends AnyVal {
49+
def replicateA(n: Int)(implicit F: Applicative[F]): F[List[A]] = F.replicateA(n, fa)
50+
}
51+
52+
final class ApplicativeByNameOps[F[_], A](private val fa: () => F[A]) extends AnyVal {
53+
def unlessA(cond: Boolean)(implicit F: Applicative[F]): F[Unit] = F.unlessA(cond)(fa())
54+
def whenA(cond: Boolean)(implicit F: Applicative[F]): F[Unit] = F.whenA(cond)(fa())
55+
}

tests/shared/src/test/scala/cats/tests/ApplicativeSuite.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,16 @@ class ApplicativeSuite extends CatsSuite {
6363
}
6464
}
6565

66+
test("by-name ops are lazy") {
67+
var i = 0
68+
Option(i += 1).whenA(false)
69+
assertEquals(i, 0)
70+
71+
var j = 0
72+
Option(j += 1).unlessA(true)
73+
assertEquals(j, 0)
74+
}
75+
6676
{
6777
implicit val optionMonoid: Monoid[Option[Int]] = Applicative.monoid[Option, Int]
6878
checkAll("Applicative[Option].monoid", MonoidTests[Option[Int]](optionMonoid).monoid)

0 commit comments

Comments
 (0)