mulang-3.5.2: src/Language/Mulang/Builder.hs
module Language.Mulang.Builder (compact, compactMap, compactConcatMap, normalize) where
import Language.Mulang.Ast
compactConcatMap :: (a -> [Expression]) -> [a] -> Expression
compactConcatMap f = compact . concat . map f
compactMap :: (a -> Expression) -> [a] -> Expression
compactMap f = compact . map f
compact :: [Expression] -> Expression
compact [] = MuNull
compact [e] = e
compact es = Sequence es
normalize :: Expression -> Expression
normalize (Variable n (MuObject e)) = Object n (normalizeInObject e)
normalize (Variable n (Lambda vars e)) = SimpleFunction n vars (normalize e)
normalize (Variable n e) = Variable n (normalize e)
normalize (Function n equations) = Function n (map normalizeEquation equations)
normalize (Procedure n equations) = Procedure n (map normalizeEquation equations)
normalize (Fact n args) = Fact n args
normalize (Rule n args es) = Rule n args (map normalize es)
normalize (Method n equations) = Method n (map normalizeEquation equations)
normalize (Attribute n e) = Attribute n (normalize e)
normalize (Object n e) = Object n (normalizeInObject e)
normalize (Application (Send r m []) args) = Send (normalize r) (normalize m) (map normalize args)
normalize (Application e es) = Application (normalize e) (map normalize es)
normalize (Send r e es) = Send (normalize r) (normalize e) (map normalize es)
normalize (Lambda ps e2) = Lambda ps (normalize e2)
normalize (If e1 e2 e3) = If (normalize e1) (normalize e2) (normalize e3)
normalize (While e1 e2) = While (normalize e1) (normalize e2)
normalize (Match e1 equations) = Match (normalize e1) (map normalizeEquation equations)
normalize (Comprehension e1 stms) = Comprehension (normalize e1) stms
normalize (Return e) = Return (normalize e)
normalize (Not e) = Not (normalize e)
normalize (Forall e1 e2) = Forall (normalize e1) (normalize e2)
normalize (Sequence es) = Sequence (map normalize es)
normalize (MuObject e) = MuObject (normalize e)
normalize (MuTuple es) = MuTuple (map normalize es)
normalize (MuList es) = MuList (map normalize es)
normalize e = e
normalizeInObject (Function n eqs) = Method n (map normalizeEquation eqs)
normalizeInObject (Variable n (Lambda vars e)) = SimpleMethod n vars (normalize e)
normalizeInObject (Variable n e) = Attribute n (normalize e)
normalizeInObject (Sequence es) = Sequence (map normalizeInObject es)
normalizeInObject e = normalize e
normalizeEquation :: Equation -> Equation
normalizeEquation (Equation ps (UnguardedBody e)) = Equation ps (UnguardedBody (normalize e))
normalizeEquation (Equation ps (GuardedBody b)) = Equation ps (GuardedBody (map (\(c, e) -> (normalize c, normalize e)) b))