Skip to content

Commit

Permalink
Add soft.with1.between and surroundedBy (#290)
Browse files Browse the repository at this point in the history
  • Loading branch information
johnynek authored Nov 1, 2021
1 parent d494798 commit 31df9e8
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 5 deletions.
6 changes: 6 additions & 0 deletions core/shared/src/main/scala/cats/parse/Parser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -933,6 +933,12 @@ object Parser {

def <*[B](that: Parser[B]): Parser[A] =
softProduct01(parser, void(that)).map(_._1)

def between(b: Parser[Any], c: Parser[Any]): Parser[A] =
(b.void.soft ~ (parser.soft ~ c.void)).map { case (_, (a, _)) => a }

def surroundedBy(b: Parser[Any]): Parser[A] =
between(b, b)
}

/** Don't advance in the parsed string, just return a This is used by the Applicative typeclass.
Expand Down
29 changes: 24 additions & 5 deletions core/shared/src/test/scala/cats/parse/ParserTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1527,7 +1527,7 @@ class ParserTest extends munit.ScalaCheckSuite {
}
}

property("parse between open and close with Parser args") {
property("parse with1.between open and close with Parser args") {
forAll(ParserGen.gen0, ParserGen.gen, ParserGen.gen, Arbitrary.arbitrary[String]) {
(genP1, genP, genQ, str) =>
val pa = genP1.fa.with1.between(genP.fa, genQ.fa)
Expand All @@ -1537,10 +1537,29 @@ class ParserTest extends munit.ScalaCheckSuite {
}
}

property("surroundedBy consistent with between with Parser this") {
forAll(ParserGen.gen, ParserGen.gen0, Arbitrary.arbitrary[String]) { (genP1, genP, str) =>
val pa = genP1.fa.between(genP.fa, genP.fa)
val pb = genP1.fa.surroundedBy(genP.fa)
property("with1.surroundedBy consistent with between with Parser this") {
forAll(ParserGen.gen0, ParserGen.gen, Arbitrary.arbitrary[String]) { (genP1, genP, str) =>
val pa = genP1.fa.with1.between(genP.fa, genP.fa)
val pb = genP1.fa.with1.surroundedBy(genP.fa)

assertEquals(pa.parse(str), pb.parse(str))
}
}

property("parse soft.with1.between open and close with Parser args") {
forAll(ParserGen.gen0, ParserGen.gen, ParserGen.gen, Arbitrary.arbitrary[String]) {
(genP1, genP, genQ, str) =>
val pa = genP1.fa.soft.with1.between(genP.fa, genQ.fa)
val pb = genP.fa.soft *> (genP1.fa.soft <* genQ.fa)

assertEquals(pa.parse(str), pb.parse(str))
}
}

property("soft.with1.surroundedBy consistent with between with Parser this") {
forAll(ParserGen.gen0, ParserGen.gen, Arbitrary.arbitrary[String]) { (genP1, genP, str) =>
val pa = genP1.fa.soft.with1.between(genP.fa, genP.fa)
val pb = genP1.fa.soft.with1.surroundedBy(genP.fa)

assertEquals(pa.parse(str), pb.parse(str))
}
Expand Down

0 comments on commit 31df9e8

Please sign in to comment.