Bunch of declarations
listPrinters =
[(''[]
,\(typeVariable:_) _automaticPrinter ->
(let presentVar = varE (presentVarName typeVariable)
in lamE [varP (presentVarName typeVariable)]
[|(let typeString = "[" ++ fst $(presentVar) ++ "]"
in (typeString
,\xs ->
case fst $(presentVar) of
"GHC.Types.Char" ->
ChoicePresentation
"String"
[("String",undefined)
,("List of characters",undefined)]
_ ->
ListPresentation typeString
(map (snd $(presentVar)) xs)))|]))]
printComments loc' ast = do
let correctLocation comment = comInfoLocation comment == Just loc'
commentsWithLocation = filter correctLocation (nodeInfoComments info)
comments <- return $ map comInfoComment commentsWithLocation
forM_ comments $ \comment -> do
-- Preceeding comments must have a newline before them.
hasNewline <- gets psNewline
when (not hasNewline && loc' == Before) newline
printComment (Just $ srcInfoSpan $ nodeInfoSpan info) comment
where info = ann ast
exp' (App _ op a) =
do (fits,st) <-
fitsOnOneLine (spaced (map pretty (f : args)))
if fits
then put st
else do pretty f
newline
spaces <- getIndentSpaces
indented spaces (lined (map pretty args))
where (f,args) = flatten op [a]
flatten :: Exp NodeInfo
-> [Exp NodeInfo]
-> (Exp NodeInfo,[Exp NodeInfo])
flatten (App _ f' a') b =
flatten f' (a' : b)
flatten f' as = (f',as)
infixApp :: Exp NodeInfo
-> Exp NodeInfo
-> QOp NodeInfo
-> Exp NodeInfo
-> Maybe Int64
-> Printer ()
Quasi-quotes with nested lets and operators
quasiQuotes =
[(''[]
,\(typeVariable:_) _automaticPrinter ->
(let presentVar = varE (presentVarName typeVariable)
in lamE [varP (presentVarName typeVariable)]
[|(let typeString = "[" ++ fst $(presentVar) ++ "]"
in (typeString
,\xs ->
case fst $(presentVar) of
"GHC.Types.Char" ->
ChoicePresentation
"String"
[("String"
,StringPresentation "String"
(concatMap getCh (map (snd $(presentVar)) xs)))
,("List of characters"
,ListPresentation typeString
(map (snd $(presentVar)) xs))]
where getCh (CharPresentation "GHC.Types.Char" ch) =
ch
getCh (ChoicePresentation _ ((_,CharPresentation _ ch):_)) =
ch
getCh _ = ""
_ ->
ListPresentation typeString
(map (snd $(presentVar)) xs)))|]))]