Above, except that if the last line of the first argument stops at least one position before the first line of the second begins, these two lines are overlapped. For example:
> text "hi" $$ nest 5 (text "there")
lays out as
> hi there
$$ is associative, with identity empty, and also satisfies
* (x $$ y) <> z = x $$ (y <> z), if y non-empty.
Above; if there is no overlap it "dovetails" the two
The expression f <$$> p creates a fresh permutation parser consisting of parser p. The the final result of the permutation parser is the function f applied to the return value of p. The parser p is not allowed to accept empty input - use the optional combinator (<$?>) instead.
If the function f takes more than one parameter, the type variable b is instantiated to a functional type which combines nicely with the adds parser p to the (<||>) combinator. This results in stylized code permutation parser starts with a combining function f followed by the parsers. The function f gets its parameters in the order in which the parsers are specified, but actual input can be in any order.