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
//     }
//   }"""