module MapDeclM where import Recursive import IdM {-+ A class to apply a monadic function to all declarations in a structure. The type of the structure is #s#, the type of the declarations is #d#. The functional dependency ensures that we can determine the type of declarations from the type of the structure. -} class MapDeclM s d | s -> d where mapDeclM :: (Functor m, Monad m) => (d -> m d) -> s -> m s instance MapDeclM s ds => MapDeclM [s] ds where mapDeclM = mapM . mapDeclM {- A convinient function, when the definition is in terms of the underlying structure. -} std_mapDeclM f = fmap r . mapDeclM f . struct mapDecls f m = removeId $ mapDeclM (return.map f) m