A tagless final encoding for a result builder (ShowS, Doc, Html, etc).
Note that showerStringLit and showerCharLit take exact uninterpreted
strings to avoid losing information (e.g. "\n" vs. "\10").
Methods
showerRecord :: [ShowerComma (a, ShowerFieldSep, a)] -> aA record,
{ x = 24, y = 42 }or{ "a": null, "b": 13 }.showerList :: [ShowerComma a] -> aA list,
[1, 2, 3].showerTuple :: [ShowerComma a] -> aA tuple,
(1, 2, 3).showerStringLit :: String -> aA string literal,
"hello, (world)".showerCharLit :: String -> aA character literal,
'('.showerAtom :: String -> aVariable names, numeric literals, and so on.
showerSpace :: [a] -> aWhitespace-separated elements.