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, FieldLabel (loop Type.Type) then Var (loop Const.Con, loop IdInfo.IdInfo, loop Type.GenType, loop Type.Kind) then VarEnv, VarSet, ThinAir then Class (loop TyCon.TyCon, loop Type.Type, loop InstEnv.InstEnv) then TyCon (loop Type.Type, loop Type.Kind, loop DataCon.DataCon) then Type (loop DataCon.DataCon, loop Subst.substTy) then DataCon, TysPrim, Unify, PprType then InstEnv (Unify) then IdInfo (loop CoreRules.CoreRules) TysWiredIn (DataCon.mkDataCon, loop MkId.mkDataConId) then PrimOp (PprType, TysWiredIn, IdInfo.StrictnessInfo) then Const (PrimOp.PrimOp, TysWiredIn.stringTy) then Id (Const.Con(..)), CoreSyn then CoreUtils (loop PprCore.pprCoreExpr), CoreFVs then OccurAnal (ThinAir.noRepStrs -- an awkward dependency) then CoreUnfold (loop OccurAnal.globalOccurAnalyse) then Rules (Unfolding), Subst (Unfolding, CoreFVs), CoreTidy (noUnfolding) then MkId (CoreUnfold.mkUnfolding, Subst)