@@ -47,8 +47,9 @@ genConstraints
4747 :: Module.Interfaces
4848 -> Module.Canonical
4949 -> IO (Map.Map Text T.Type, T.Constraint)
50−genConstraints interfaces modul@(Module.Module _ info) =
51− do let env = Env.initialize (canonicalizeUnions interfaces modul)
50+genConstraints allInterfaces modul@(Module.Module _ info) =
51+ do let directDeps = toDirectDeps (Set.fromList (Module.imports info)) allInterfaces
52+ let env = Env.initialize (canonicalizeUnions directDeps modul)
5253
5354 ctors <-
5455 {-# SCC elm_compiler_mk_ctor_types #-}
@@ -56,10 +57,7 @@ genConstraints interfaces modul@(Module.Module _ info) =
5657 do (_, vars, args, result) <- Env.freshDataScheme env name
5758 return (name, (vars, foldr T.FunN result args))
5859
59− importedVars <-
60− {-# SCC elm_compiler_mk_value_types #-}
61− forM (Map.toList interfaces) $
62− canonicalizeValues env (Set.fromList (Module.imports info))
60+ importedVars <- mapM (canonicalizeValues env) directDeps
6361
6462 let allTypes = concat (ctors : importedVars)
6563 let vars = concatMap (fst . snd) allTypes
@@ -75,27 +73,35 @@ genConstraints interfaces modul@(Module.Module _ info) =
7573 return (header, environ constraint)
7674
7775
76+toDirectDeps :: Set.Set ModuleName.Raw -> Module.Interfaces -> [(ModuleName.Canonical, Module.Interface)]
77+toDirectDeps imports interfaces =
78+ let
79+ isDirect (ModuleName.Canonical _ name, _) =
80+ Set.member name imports
81+ in
82+ filter isDirect (Map.toList interfaces)
83+
84+
7885canonicalizeValues
7986 :: Env.Env
80− -> Set.Set ModuleName.Raw
8187 -> (ModuleName.Canonical, Module.Interface)
8288 -> IO [(Text, ([T.Variable], T.Type))]
83−canonicalizeValues env imports (moduleName@(ModuleName.Canonical _ rawName), iface) =
84− if Set.notMember rawName imports then
85− return []
86− else
87− forM (Map.toList (Module.iTypes iface)) $ \(name, tipe) ->
88− do (flexType, flexVars) <- Env.instantiateFlex env tipe
89− return
90− ( ModuleName.canonicalToText moduleName <> "." <> name
91− , ( Map.elems flexVars
92− , flexType
93− )
89+canonicalizeValues env (moduleName, iface) =
90+ forM (Map.toList (Module.iTypes iface)) $ \(name, tipe) ->
91+ do (flexType, flexVars) <- Env.instantiateFlex env tipe
92+ return
93+ ( ModuleName.canonicalToText moduleName <> "." <> name
94+ , ( Map.elems flexVars
95+ , flexType
9496 )
97+ )
9598
9699
97−canonicalizeUnions :: Module.Interfaces -> Module.Canonical -> [Module.CanonicalUnion]
98−canonicalizeUnions interfaces (Module.Module name info) =
100+canonicalizeUnions
101+ :: [(ModuleName.Canonical, Module.Interface)]
102+ -> Module.Canonical
103+ -> [Module.CanonicalUnion]
104+canonicalizeUnions directDeps (Module.Module name info) =
99105 localUnions ++ importedUnions
100106 where
101107 localUnions :: [Module.CanonicalUnion]
@@ -104,7 +110,7 @@ canonicalizeUnions interfaces (Module.Module name info) =
104110
105111 importedUnions :: [Module.CanonicalUnion]
106112 importedUnions =
107− concatMap (format . second Module.iUnions) (Map.toList interfaces)
113+ concatMap (format . second Module.iUnions) directDeps
108114
109115
110116format :: (ModuleName.Canonical, Module.Unions) -> [Module.CanonicalUnion]