@@ -87,83 +87,106 @@ dummyLet defs =
88instance (Pretty def, Pretty var, Var.ToString var) => Pretty (Expr' ann def var) where
88instance (Pretty def, Pretty var, Var.ToString var) => Pretty (Expr' ann def var) where
89 pretty expr =
89 pretty expr =
90− case expr of
90+ case expr of
91− Literal lit -> pretty lit
91+ Literal lit ->
98+ P.brackets (pretty e1 <> P.text ".." <> pretty e2)
101+ P.brackets (commaCat (map pretty es))
103+ Binop op (Annotation.A _ (Literal (Literal.IntNum 0))) e
104+ | Var.toString op == "-" ->
105+ P.text "-" <> prettyParens e
108+ P.hang (prettyParens e1) 2 (P.text op'' <+> prettyParens e2)
110+ op' = Var.toString op
111+ op'' = if Help.isOp op' then op' else "`" ++ op' ++ "`"
114+ P.text "\\" <> args <+> P.text "->" <+> pretty body
116+ (ps,body) = collectLambdas (Annotation.A undefined $ Lambda p e)
117+ args = P.sep (map Pattern.prettyParens ps)
120+ P.hang func 2 (P.sep args)
123+ map prettyParens (collectApps (Annotation.A undefined expr))
126+ P.text "if" $$ nest 3 (vcat $ map iff branches)
128+ iff (b,e) = P.text "|" <+> P.hang (pretty b <+> P.text "->") 2 (pretty e)
132+ [ P.hang (P.text "let") 4 (P.vcat (map pretty defs))
133+ , P.text "in" <+> pretty e
137+ P.hang pexpr 2 (P.vcat (map pretty' pats))
139+ pexpr = P.sep [ P.text "case" <+> pretty e, P.text "of" ]
140+ pretty' (p,b) = pretty p <+> P.text "->" <+> pretty b
142+ Data "::" [hd,tl] -> pretty hd <+> P.text "::" <+> pretty tl
143+ Data "[]" [] -> P.text "[]"
145+ | Help.isTuple name -> P.parens (commaCat (map pretty es))
146+ | otherwise -> P.hang (P.text name) 2 (P.sep (map prettyParens es))
149+ prettyParens e <> P.text "." <> variable x
152+ P.braces (pretty e <+> P.text "-" <+> variable x)
154+ Insert (Annotation.A _ (Remove e y)) x v ->
157+ [ pretty e, P.text "-", variable y, P.text "|"
158+ , variable x, P.equals, pretty v
162+ P.braces (pretty e <+> P.text "|" <+> variable x <+> P.equals <+> pretty v)
167+ (pretty e <+> P.text "|")
169+ (commaSep $ map field fs)
171+ field (k,v) = variable k <+> P.text "<-" <+> pretty v
175+ [ P.cat (zipWith (<+>) (P.lbrace : repeat P.comma) (map field fs))
179+ field (field, value) =
180+ variable field <+> P.equals <+> pretty value
182+ Markdown _ _ -> P.text "[markdown| ... |]"
184+ GLShader _ _ _ -> P.text "[glsl| ... |]"
186+ PortIn name _ -> P.text $ "<port:" ++ name ++ ">"
188+ PortOut _ _ signal -> pretty signal
95− Range e1 e2 -> P.brackets (pretty e1 <> P.text ".." <> pretty e2)
97− ExplicitList es -> P.brackets (commaCat (map pretty es))
99− Binop op (Annotation.A _ (Literal (Literal.IntNum 0))) e
100− | Var.toString op == "-" ->
101− P.text "-" <> prettyParens e
103− Binop op e1 e2 -> P.sep [ prettyParens e1 <+> P.text op'', prettyParens e2 ]
105− op' = Var.toString op
106− op'' = if Help.isOp op' then op' else "`" ++ op' ++ "`"
108− Lambda p e -> P.text "\\" <> args <+> P.text "->" <+> pretty body
110− (ps,body) = collectLambdas (Annotation.A undefined $ Lambda p e)
111− args = P.sep (map Pattern.prettyParens ps)
113− App _ _ -> P.hang func 2 (P.sep args)
115− func:args = map prettyParens (collectApps (Annotation.A undefined expr))
117− MultiIf branches -> P.text "if" $$ nest 3 (vcat $ map iff branches)
119− iff (b,e) = P.text "|" <+> P.hang (pretty b <+> P.text "->") 2 (pretty e)
122− P.sep [ P.hang (P.text "let") 4 (P.vcat (map pretty defs))
123− , P.text "in" <+> pretty e ]
126− P.hang pexpr 2 (P.vcat (map pretty' pats))
128− pexpr = P.sep [ P.text "case" <+> pretty e, P.text "of" ]
129− pretty' (p,b) = pretty p <+> P.text "->" <+> pretty b
131− Data "::" [hd,tl] -> pretty hd <+> P.text "::" <+> pretty tl
132− Data "[]" [] -> P.text "[]"
134− | Help.isTuple name -> P.parens (commaCat (map pretty es))
135− | otherwise -> P.hang (P.text name) 2 (P.sep (map prettyParens es))
137− Access e x -> prettyParens e <> P.text "." <> variable x
139− Remove e x -> P.braces (pretty e <+> P.text "-" <+> variable x)
141− Insert (Annotation.A _ (Remove e y)) x v ->
142− P.braces $ P.hsep [ pretty e, P.text "-", variable y, P.text "|"
143− , variable x, P.equals, pretty v ]
146− P.braces (pretty e <+> P.text "|" <+> variable x <+> P.equals <+> pretty v)
149− P.braces $ P.hang (pretty e <+> P.text "|")
151− (commaSep $ map field fs)
153− field (k,v) = variable k <+> P.text "<-" <+> pretty v
156− P.braces $ P.nest 2 (commaSep $ map field fs)
158− field (x,e) = variable x <+> P.equals <+> pretty e
160− Markdown _ _ -> P.text "[markdown| ... |]"
162− GLShader _ _ _ -> P.text "[glsl| ... |]"
164− PortIn name _ -> P.text $ "<port:" ++ name ++ ">"
166− PortOut _ _ signal -> pretty signal
168collectApps :: Expr ann def var -> [Expr ann def var]
191collectApps :: Expr ann def var -> [Expr ann def var]
169collectApps annExpr@(Annotation.A _ expr) =
192collectApps annExpr@(Annotation.A _ expr) =
@@ -171,6 +194,7 @@ collectApps annExpr@(Annotation.A _ expr) =
171 App a b -> collectApps a ++ [b]
194 App a b -> collectApps a ++ [b]
172 _ -> [annExpr]
195 _ -> [annExpr]
174collectLambdas :: Expr ann def var -> ([Pattern.Pattern var], Expr ann def var)
198collectLambdas :: Expr ann def var -> ([Pattern.Pattern var], Expr ann def var)
175collectLambdas lexpr@(Annotation.A _ expr) =
199collectLambdas lexpr@(Annotation.A _ expr) =
176 case expr of
200 case expr of
@@ -180,8 +204,10 @@ collectLambdas lexpr@(Annotation.A _ expr) =
181 _ -> ([], lexpr)
205 _ -> ([], lexpr)
183prettyParens :: (Pretty def, Pretty var, Var.ToString var) => Expr ann def var -> Doc
208prettyParens :: (Pretty def, Pretty var, Var.ToString var) => Expr ann def var -> Doc
184−prettyParens (Annotation.A _ expr) = parensIf needed (pretty expr)
209+prettyParens (Annotation.A _ expr) =
210+ parensIf needed (pretty expr)
187 case expr of
213 case expr of