{- Copyright(C) 1999 Erik Meijer and Arjan van Yzendoorn Determines wether an express/declaration is "simple". The pretty-printing strategy is to print a "complex" expression on a new line. -} module Utils where import Mondrian isSimpleExpr :: Expr -> Bool isSimpleExpr = \e -> case e of { Lit l -> True ; Var n -> True ; Case e as -> and [ isSimpleArms as, isSimpleExpr e ] ; Let ds e -> and [ isSimpleDecls ds, isSimpleExpr e ] ; Lambda n e -> isSimpleExpr e ; New n ds -> all isSimpleDecl ds ; App f a -> and [ isSimpleExpr f, isSimpleExpr a] ; Chain e oes -> and [ isSimpleExpr e, all isSimpleExpr [ e | (o,e) <- oes ] ] } isSimpleArms = \as -> and [ length as == 1, all isSimpleExpr [ e | (p,e) <- as ], all isSimplePattern [ p | (p,e) <- as ] ] isSimplePattern = \ p-> case p of { Pattern n ds -> isSimpleDecls ds ; Default -> True } isSimpleDecls = \ds -> and [ all isSimpleDecl ds ] isSimpleDecl = \d -> case d of { ClassDecl n ns ds -> False ; ImportDecl n -> True ; VarDecl n e -> isSimpleExpr e ; SigDecl n e -> True } groupLambdas :: Expr -> Expr groupLambdas = \e -> case e of { Lambda ns (Lambda ms e) -> groupLambdas (Lambda (ns++ms) e) ; otherwise -> e } isTopLevel :: [Name] -> Name -> Bool isTopLevel = \topLevel -> \n -> n `elem` topLevel topLevel :: CompilationUnit -> [Name] topLevel = \p -> case p of { Package n ds -> [ n | VarDecl n e <- ds ] }