The reason for this is that the sequential composition combinator (~) combines its constituents
into a ~. When several ~s are combined, this results in nested ~s (to the left).
The flatten* coercions makes it easy to apply an n-argument function to a nested ~ of
depth n-1
The headOptionTailToFunList converts a function that takes a List[A] to a function that
accepts a ~[A, Option[List[A]]] (this happens when parsing something of the following
shape: p ~ opt("." ~ repsep(p, ".")) -- where p is a parser that yields an A).
This object contains implicit conversions that come in handy when using the
^^combinator.Refer to scala.util.parsing.combinator.Parsers to construct an AST from the concrete syntax.
The reason for this is that the sequential composition combinator (
~) combines its constituents into a ~. When several~s are combined, this results in nested~s (to the left). Theflatten*coercions makes it easy to apply ann-argument function to a nested~of depthn-1The
headOptionTailToFunListconverts a function that takes aList[A]to a function that accepts a~[A, Option[List[A]]](this happens when parsing something of the following shape:p ~ opt("." ~ repsep(p, "."))-- wherepis a parser that yields anA).