module RemoveIrrefPats ( module RemoveIrrefPats , module StateM , module OutputMT , module EnvMT , module MT )where import MT (MT(..)) import StateM import OutputMT import EnvMT import SrcLoc(SrcLoc) import HasBaseStruct(base) import Recursive(struct) import MUtils (( # )) -- Monads: -- *) the state is used as a source of new names -- *) the environment is used for structures, that do not have a source -- location (e.g. expressions). They inherit the source location -- of the closest enclosing them structure with a location -- *) output is to generate pattern bindings, which delay the matching -- *) output is also used when processing (lists of) declarations, -- to output additional declarations generated -- NOTE: the base monad can be generalized to be anything with state type M i = StateM [i] type EM i = WithEnv SrcLoc (M i) type OM i ds = WithOutput ds (M i) type OEM i d = WithOutput d (EM i) -- type OEM i d = WithOutput d (WithEnv SrcLoc (StateM [i])) class Monad m => RemIrrefPats t m | t -> m where remIrrefPats :: t -> m t -- a generic instance for lists instance RemIrrefPats a m => RemIrrefPats [a] m where remIrrefPats = mapM remIrrefPats remIrrefPatsRec p = base # remIrrefPats (struct p) removeIrrefPats xs = withSt xs . remIrrefPats