module HsModuleMaps where
import HsModule
import MUtils
import HsIdent(seqHsIdent)
instance Functor (HsImportDeclI m) where
fmap f (HsImportDecl s m q as optspec) =
HsImportDecl s m q as (fmap (apSnd (map (fmap f))) optspec)
instance Functor (HsExportSpecI m) where
fmap f e =
case e of
EntE espec -> EntE (fmap f espec)
ModuleE mn -> ModuleE mn
instance Functor EntSpec where
fmap f e =
case e of
Var i -> Var (f i)
Abs i -> Abs (f i)
AllSubs i -> AllSubs (f i)
ListSubs i is -> ListSubs (f i) (map (fmap f) is)
--------------------------------------------------------------------------------
mapDecls f (HsModule loc name exps imps ds) = HsModule loc name exps imps (f ds)
seqDecls (HsModule loc name exps imps ds) = HsModule loc name exps imps # ds
seqImportDecl (HsImportDecl s m q as optspec) =
HsImportDecl s m q as # seqMaybe (fmap (apSndM (mapM seqEntSpec)) optspec)
seqExportSpec e =
case e of
EntE espec -> EntE # seqEntSpec espec
ModuleE mn -> return (ModuleE mn)
seqEntSpec e =
case e of
Var i -> Var # i
Abs i -> Abs # i
AllSubs i -> AllSubs # i
ListSubs i is -> ListSubs # i <# mapM seqHsIdent is
--------------------------------------------------------------------------------
mapModMN f (HsModule loc name exps imps ds) =
HsModule loc (f name) (mapExpsMN f exps) (mapImpsMN f imps) ds
mapExpsMN f = fmap . map . mapExpMN $ f
mapExpMN f (EntE e) = EntE e
mapExpMN f (ModuleE m) = ModuleE (f m)
mapImpsMN f = map . mapImpMN $ f
mapImpMN f (HsImportDecl loc m q as spec) =
HsImportDecl loc (f m) q (fmap f as) spec