0 | module Compiler.ES.Doc
24 | public export %inline
25 | shown : Show a => a -> Doc
26 | shown a = Text (show a)
29 | comment : Doc -> Doc
33 | FromString Doc where
37 | isMultiline : Doc -> Bool
38 | isMultiline [] = False
39 | isMultiline LineBreak = True
40 | isMultiline SoftSpace = False
41 | isMultiline (Text x) = False
42 | isMultiline (Comment x) = isMultiline x
43 | isMultiline (Nest k x) = isMultiline x
44 | isMultiline (Seq x y) = isMultiline x || isMultiline y
47 | (<++>) : Doc -> Doc -> Doc
48 | (<++>) a b = a <+> " " <+> b
51 | vcat : List Doc -> Doc
52 | vcat = concat . intersperse LineBreak
55 | hcat : List Doc -> Doc
59 | hsep : List Doc -> Doc
60 | hsep = concat . intersperse " "
64 | block b = concat ["{", Nest 1 (LineBreak <+> b), LineBreak, "}"]
68 | paren d = "(" <+> d <+> ")"
72 | lambdaArrow = SoftSpace <+> "=>" <+> SoftSpace
76 | softComma = "," <+> SoftSpace
80 | softColon = ":" <+> SoftSpace
84 | softEq = SoftSpace <+> "=" <+> SoftSpace
87 | compact : Doc -> String
88 | compact = fastConcat . go
89 | where go : Doc -> List String
95 | go (Nest _ y) = go y
96 | go (Seq x y) = go x ++ go y
99 | pretty : Doc -> String
100 | pretty = fastConcat . go ""
101 | where nSpaces : Nat -> String
102 | nSpaces n = fastPack $
replicate n ' '
104 | go : (spaces : String) -> Doc -> List String
106 | go s LineBreak = ["\n",s]
107 | go _ SoftSpace = [" "]
108 | go s (Comment x) = "/* " :: go s x ++ [" */"]
109 | go _ (Text x) = [x]
110 | go s (Nest x y) = go (s ++ nSpaces x) y
111 | go s (Seq x y) = go s x ++ go s y