Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions core/shared/src/main/scala/cats/parse/Parser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -981,6 +981,22 @@ object Parser {
if (str.length == 0) unit
else ignoreCase(str)

/** Convert a Map[Char, A] to Parser[A] first match a character, then map it to a value A
*/
def fromCharMap[A](charMap: Map[Char, A]): Parser[A] =
charIn(charMap.keySet).map(charMap)

/** Convert a Map[String, A] to Parser[A] first match a character, then map it to a value A This
* throws if any of the keys are the empty string
*/
def fromStringMap[A](stringMap: Map[String, A]): Parser[A] =
stringIn(stringMap.keySet).map(stringMap)

/** Convert a Map[String, A] to Parser[A] first match a character, then map it to a value A
*/
def fromStringMap0[A](stringMap: Map[String, A]): Parser0[A] =
stringIn0(stringMap.keySet).map(stringMap)

/** go through the list of parsers trying each as long as they are epsilon failures (don't
* advance) see @backtrack if you want to do backtracking.
*
Expand Down
25 changes: 25 additions & 0 deletions core/shared/src/test/scala/cats/parse/ParserTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2513,6 +2513,31 @@ class ParserTest extends munit.ScalaCheckSuite {
}
}

property("fromCharMap works as expected") {
forAll { (cm: Map[Char, Int], str: String) =>
val p = Parser.fromCharMap(cm)

assertEquals(p.parseAll(str), Parser.charIn(cm.keySet).parseAll(str).map(cm(_)))
}
}

property("fromStringMap works as expected") {
forAll { (cm0: Map[String, Int], str: String) =>
val cm = cm0.filterNot(_._1.isEmpty)
val p = Parser.fromStringMap(cm)

assertEquals(p.parseAll(str), Parser.stringIn(cm.keySet).parseAll(str).map(cm(_)))
}
}

property("fromStringMap0 works as expected") {
forAll { (cm: Map[String, Int], str: String) =>
val p = Parser.fromStringMap0(cm)

assertEquals(p.parseAll(str), Parser.stringIn0(cm.keySet).parseAll(str).map(cm(_)))
}
}

property("a context0 added is always at the top") {
forAll(ParserGen.gen0, Arbitrary.arbitrary[List[String]], Arbitrary.arbitrary[String]) {
(genP, ctx, str) =>
Expand Down