From 857126a104809a2bcb695f36dc9351a3dd17b65f Mon Sep 17 00:00:00 2001 From: Patrick Oscar Boykin Date: Fri, 5 Nov 2021 19:27:35 -1000 Subject: [PATCH] Make sure void is idempotent --- core/shared/src/main/scala/cats/parse/Parser.scala | 10 ++++++++-- .../src/test/scala/cats/parse/ParserTest.scala | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/core/shared/src/main/scala/cats/parse/Parser.scala b/core/shared/src/main/scala/cats/parse/Parser.scala index 6b5fe3a3..af0c041c 100644 --- a/core/shared/src/main/scala/cats/parse/Parser.scala +++ b/core/shared/src/main/scala/cats/parse/Parser.scala @@ -1968,7 +1968,10 @@ object Parser { else SoftProd0(u1, u2) } case Defer0(fn) => - Defer0(UnmapDefer0(fn)) + fn match { + case UnmapDefer0(_) => pa // already unmapped + case _ => Defer0(UnmapDefer0(fn)) + } case Rep0(p, max, _) => Rep0(unmap(p), max, Accumulator0.unitAccumulator0) case WithContextP0(ctx, p0) => WithContextP0(ctx, unmap0(p0)) case StartParser | EndParser | TailRecM0(_, _) | FlatMap0(_, _) => @@ -2049,7 +2052,10 @@ object Parser { else SoftProd(u1, u2) } case Defer(fn) => - Defer(UnmapDefer(fn)) + fn match { + case UnmapDefer(_) => pa // already unmapped + case _ => Defer(UnmapDefer(fn)) + } case Rep(p, min, max, _) => Rep(unmap(p), min, max, Accumulator0.unitAccumulator0) case WithContextP(ctx, p) => WithContextP(ctx, unmap(p)) diff --git a/core/shared/src/test/scala/cats/parse/ParserTest.scala b/core/shared/src/test/scala/cats/parse/ParserTest.scala index 779b67bf..d0e8b5d7 100644 --- a/core/shared/src/test/scala/cats/parse/ParserTest.scala +++ b/core/shared/src/test/scala/cats/parse/ParserTest.scala @@ -2446,4 +2446,18 @@ class ParserTest extends munit.ScalaCheckSuite { assertEquals(Parser.charWhere(chars).parse(input), Parser.charIn(chars).parse(input)) } } + + property("P0.void is idempotent") { + forAll(ParserGen.gen0) { p => + val v1 = p.fa.void + assertEquals(v1.void, v1) + } + } + + property("P.void is idempotent") { + forAll(ParserGen.gen) { p => + val v1 = p.fa.void + assertEquals(v1.void, v1) + } + } }