------- Maps for the E functor. module HsExpMaps where import HsExpStruct import HsIdent import HsGuardsMaps(mapAlt, accAlt, seqAlt) import HsFieldsMaps import AccList(accList) import MUtils mapEI idf = mapEI2 idf idf mapEI2 :: (i1 -> i2) -> (i1 -> i2) -> (e1 -> e2) -> (p1 -> p2) -> (d1 -> d2) -> (t1 -> t2) -> (c1 -> c2) -> EI i1 e1 p1 d1 t1 c1 -> EI i2 e2 p2 d2 t2 c2 mapEI2 vf cf ef pf df tf ctxf exp = case exp of HsId n -> HsId (mapHsIdent2 vf cf n) HsLit s l -> HsLit s l HsInfixApp x op z -> HsInfixApp (ef x) (mapHsIdent2 vf cf op) (ef z) HsApp x y -> HsApp (ef x) (ef y) HsNegApp s x -> HsNegApp s (ef x) HsLambda ps e -> HsLambda (map pf ps) (ef e) HsLet ds e -> HsLet (df ds) (ef e) HsIf x y z -> HsIf (ef x) (ef y) (ef z) HsCase e alts -> HsCase (ef e) (map (mapAlt ef pf df) alts) HsDo stmts -> HsDo (mStmt stmts) HsTuple xs -> HsTuple (map ef xs) HsList xs -> HsList (map ef xs) HsParen x -> HsParen (ef x) HsLeftSection x op -> HsLeftSection (ef x) (mapHsIdent2 vf cf op) HsRightSection op y -> HsRightSection (mapHsIdent2 vf cf op) (ef y) HsRecConstr s n upds -> HsRecConstr s (cf n) (mapFieldsI vf ef upds) HsRecUpdate s e upds -> HsRecUpdate s (ef e) (mapFieldsI vf ef upds) HsEnumFrom x -> HsEnumFrom (ef x) HsEnumFromTo x y -> HsEnumFromTo (ef x) (ef y) HsEnumFromThen x y -> HsEnumFromThen (ef x) (ef y) HsEnumFromThenTo x y z -> HsEnumFromThenTo (ef x) (ef y) (ef z) HsListComp stmts -> HsListComp (mStmt stmts) HsExpTypeSig s e c t -> HsExpTypeSig s (ef e) (ctxf c) (tf t) HsAsPat n e -> HsAsPat (vf n) (ef e) -- pattern only HsWildCard -> HsWildCard -- ditto HsIrrPat e -> HsIrrPat (ef e) -- ditto where mStmt = mapStmt ef pf df mapStmt ef pf df stmt = case stmt of HsGenerator loc p e s -> HsGenerator loc (pf p) (ef e) (m s) HsQualifier e s -> HsQualifier (ef e) (m s) HsLetStmt ds s -> HsLetStmt (df ds) (m s) HsLast e -> HsLast (ef e) where m = mapStmt ef pf df -- Accumulator for the E functor. accEI ::(i -> b -> b) -> (e -> b -> b) -> (p -> b -> b) -> (d -> b -> b) -> (t -> b -> b) -> (c -> b -> b) -> EI i e p d t c -> b -> b accEI idf ef pf df tf cf exp = case exp of HsId n -> accHsIdent idf n HsLit s l -> id HsInfixApp x op z -> ef x . accHsIdent idf op . ef z HsApp x y -> ef x . ef y HsNegApp s x -> ef x HsLambda ps e -> ef e . accList pf ps HsLet ds e -> ef e . df ds HsIf x y z -> ef x . ef y . ef z HsCase e alts -> ef e . accList (accAlt ef pf df) alts HsDo stmts -> accStmt df ef pf stmts HsTuple xs -> accList ef xs HsList xs -> accList ef xs HsParen x -> ef x HsLeftSection x op -> ef x . accHsIdent idf op HsRightSection op y -> accHsIdent idf op . ef y HsRecConstr s n upds -> idf n . accFieldsI idf ef upds HsRecUpdate s e upds -> ef e . accFieldsI idf ef upds HsEnumFrom x -> ef x HsEnumFromTo x y -> ef x . ef y HsEnumFromThen x y -> ef x . ef y HsEnumFromThenTo x y z -> ef x . ef y . ef z HsListComp stmts -> accStmt df ef pf stmts HsExpTypeSig s e c t -> ef e . cf c . tf t HsAsPat n e -> idf n . ef e -- pattern only HsWildCard -> id -- ditto HsIrrPat e -> ef e -- ditto accStmt df ef pf (HsGenerator _ p e s) = pf p . ef e . accStmt df ef pf s accStmt df ef pf (HsQualifier e s) = ef e . accStmt df ef pf s accStmt df ef pf (HsLetStmt ds s) = df ds . accStmt df ef pf s accStmt df ef pf (HsLast e) = ef e --------- seqEI :: (Monad m,Functor m) => EI (m i) (m e) (m p) (m ds) (m t) (m c) -> m (EI i e p ds t c) seqEI exp = case exp of HsId n -> HsId # seqHsIdent n HsLit s l -> return $ HsLit s l HsInfixApp x op z -> HsInfixApp # x <# seqHsIdent op <# z HsApp x y -> HsApp # x <# y HsNegApp s x -> HsNegApp s # x HsLambda ps e -> HsLambda # sequence ps <# e HsLet ds e -> HsLet # ds <# e HsIf x y z -> HsIf # x <# y <# z HsCase e alts -> HsCase # e <# mapM seqAlt alts HsDo stmts -> HsDo # seqStmt stmts HsTuple xs -> HsTuple # sequence xs HsList xs -> HsList # sequence xs HsParen x -> HsParen # x HsLeftSection x op -> HsLeftSection # x <# seqHsIdent op HsRightSection op y -> HsRightSection # seqHsIdent op <# y HsRecConstr s n upds -> HsRecConstr s # n <# seqFieldsI upds HsRecUpdate s e upds -> HsRecUpdate s # e <# seqFieldsI upds HsEnumFrom x -> HsEnumFrom # x HsEnumFromTo x y -> HsEnumFromTo # x <# y HsEnumFromThen x y -> HsEnumFromThen # x <# y HsEnumFromThenTo x y z -> HsEnumFromThenTo # x <# y <# z HsListComp stmts -> HsListComp # seqStmt stmts HsExpTypeSig s e c t -> HsExpTypeSig s # e <# c <# t HsAsPat n e -> HsAsPat # n <# e -- pattern only HsWildCard -> return HsWildCard -- ditto HsIrrPat e -> HsIrrPat # e -- ditto seqStmt (HsGenerator loc p e s) = HsGenerator loc # p <# e <# seqStmt s seqStmt (HsQualifier e s) = HsQualifier # e <# seqStmt s seqStmt (HsLetStmt ds s) = HsLetStmt # ds <# seqStmt s seqStmt (HsLast e) = HsLast # e