Skip to content

Instantly share code, notes, and snippets.

@trygvis
Created September 27, 2011 10:26
Show Gist options
  • Save trygvis/1244778 to your computer and use it in GitHub Desktop.
Save trygvis/1244778 to your computer and use it in GitHub Desktop.
Monadic json parser descriptor
{
object Parser {
def apply(name: String): Parser = Parser(name, Nil)
}
case class Parser(name: String, items: List[Parser]) {
// println("parser constructor: " + this)
def flatMap(parser: Parser => Parser): Parser = {
println("flatMap: " + this)
val x = parser(this)
println("flatMap: " + this + ", parser(this)" + x)
val y = Parser(name, items ::: x.items)
println("flatMap: " + this + ", returns " + y)
y
}
def map(parser: Parser => Parser): Parser = {
println("map: " + this)
val x = parser(this)
println("map: " + this + ", parser(this)=" + x)
val y = Parser(name, items ::: x.items)
println("map: " + this + ", returns " + y)
y
}
}
case class Person(name: String, address: String)
val p = for {
name: Parser <- Parser("name")
age: Parser <- Parser("age")
address: Parser <- Parser("address")
} yield {
println("yield")
Parser("boo", List(name, age, address))
}
println("parser=" + p)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment