Pattern Matching
Pattern matching is written using tree MATCH(CASE(...), ...):
import treehugger.forest._, definitions._, treehuggerDSL._
val tree = (DEF("maxList", "A")
withTypeParams(TYPEVAR("T") VIEWBOUNDS TYPE_ORDERED("A"))
withParams(PARAM("elements", TYPE_LIST("A")))) :=
REF("elements") MATCH (
CASE(ListClass UNAPPLY()) ==>
THROW(IllegalArgumentExceptionClass, "empty list!"),
CASE(ListClass UNAPPLY(ID("x"))) ==> REF("x"),
CASE(ID("x") UNLIST_:: ID("rest")) ==> BLOCK(
VAL("maxRest") := REF("maxList") APPLY(REF("rest")),
IF(REF("x") INT_> REF("maxRest")) THEN REF("x")
ELSE REF("maxRest")
)
)
treeToString(tree)
// res0: String = """def maxList[T <% Ordered[A]](elements: List[A]): A =
// elements match {
// case List() => throw new IllegalArgumentException("empty list!")
// case List(x) => x
// case x :: rest => {
// val maxRest = maxList(rest)
// if (x > maxRest) x
// else maxRest
// }
// }"""