($$) :: Doc -> Doc -> Doc
pretty Text.PrettyPrint.HughesPJ, pretty Text.PrettyPrint
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 rather than > hi > there $$ is associative, with identity empty, and also satisfies * (x $$ y) <> z = x $$ (y <> z), if y non-empty.
($$) :: Doc -> Doc -> Doc
template-haskell Language.Haskell.TH.PprLib
Above; if there is no overlap it "dovetails" the two
(<$$>) :: Stream s Identity tok => (a -> b) -> Parsec s st a -> StreamPermParser s st b
parsec Text.Parsec.Perm, parsec Text.ParserCombinators.Parsec.Perm
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.