Notes on module dependencies ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The Name/Var/Type group is a bit complicated. Here's the deal Things in brackets are what the module *uses*. A 'loop' indicates a use from a module compiled later Name, PrimRep then PrelNames then Var (Name, loop IdInfo.IdInfo, loop Type.Type, loop Type.Kind) then VarEnv, VarSet, ThinAir then Class (loop TyCon.TyCon, loop Type.Type) then TyCon (loop Type.Type, loop Type.Kind, loop DataCon.DataCon, loop Generics.GenInfo) then Type (loop DataCon.DataCon, loop Subst.substTy) then FieldLabel( Type), TysPrim (Type), PprEnv (loop DataCon.DataCon, Type) then Unify, PprType (PprEnv) then Literal (TysPrim, PprType), DataCon (PprType) then TysWiredIn (DataCon.mkDataCon, loop MkId.mkDataConId, loop Generics.mkGenInfo) then PrimOp (PprType, TysWiredIn) then CoreSyn then IdInfo (CoreSyn.Unfolding, CoreSyn.CoreRules) then Id (lots from IdInfo) then CoreFVs, PprCore then CoreUtils (PprCore.pprCoreExpr, CoreFVs.exprFreeVars, CoreSyn.isEvaldUnfolding CoreSyn.maybeUnfoldingTemplate) then OccurAnal (CoreUtils.exprIsTrivial) then CoreUnfold (OccurAnal.occurAnalyseGlobalExpr) then Rules (Unfolding), Subst (Unfolding, CoreFVs), CoreTidy (noUnfolding), Generics (mkTopUnfolding) then MkId (CoreUnfold.mkUnfolding, Subst) then PrelInfo (MkId)