@@ -10,6 +10,7 @@ module Canonicalize.Environment.Foreign
1010import Control.Monad (foldM)
1111import qualified Data.List as List
1212import qualified Data.Map.Strict as Map
13+import Data.Map.Strict ((!))
1314import qualified Data.Name as Name
1415
1516import qualified AST.Canonical as Can
@@ -30,26 +31,12 @@ type Result i w a =
3031 Result.Result i w Error.Error a
3132
3233
33−
34−-- CREATE ENVIRONMENT
35−
36−
37−type ImportDict =
38− Map.Map Name.Name ModuleName.Canonical
39−
40−
41−createInitialEnv :: ModuleName.Canonical -> ImportDict -> I.Interfaces -> [Src.Import] -> Result i w Env.Env
42−createInitialEnv home importDict interfaces sourceImports =
43− do imports <- traverse (verifyImport importDict interfaces) (filter isNotKernel sourceImports)
44− (State vs ts cs bs qvs qts qcs) <- foldM addImport emptyState imports
34+createInitialEnv :: ModuleName.Canonical -> Map.Map ModuleName.Raw I.Interface -> [Src.Import] -> Result i w Env.Env
35+createInitialEnv home ifaces imports =
36+ do (State vs ts cs bs qvs qts qcs) <- foldM (addImport ifaces) emptyState imports
4537 Result.ok (Env.Env home (Map.map Env.Foreign vs) ts cs bs qvs qts qcs)
4638
4739
48−isNotKernel :: Src.Import -> Bool
49−isNotKernel (Src.Import (A.At _ name) _ _) =
50− not (Name.isKernel name)
51−
52−
5340
5441-- STATE
5542
@@ -80,9 +67,13 @@ emptyTypes =
8067-- ADD IMPORTS
8168
8269
83−addImport :: State -> Import -> Result i w State
84−addImport (State vs ts cs bs qvs qts qcs) (Import home (I.Interface defs unions aliases binops) prefix exposing) =
70+addImport :: Map.Map ModuleName.Raw I.Interface -> State -> Src.Import -> Result i w State
71+addImport ifaces (State vs ts cs bs qvs qts qcs) (Src.Import (A.At _ name) maybeAlias exposing) =
8572 let
73+ (I.Interface pkg defs unions aliases binops) = ifaces ! name
74+ !prefix = maybe name id maybeAlias
75+ !home = ModuleName.Canonical pkg name
76+
8677 !rawTypeInfo =
8778 Map.union
8879 (Map.mapMaybeWithKey (unionToType home) unions)
@@ -276,31 +267,3 @@ toCtors types =
276267
277268 _ ->
278269 dict
279−
280−
281−
282−-- VERIFY IMPORT
283−
284−
285−data Import =
286− Import
287− { _name :: ModuleName.Canonical
288− , _interface :: I.Interface
289− , _prefix :: Name.Name
290− , _exposing :: Src.Exposing
291− }
292−
293−
294−verifyImport :: ImportDict -> I.Interfaces -> Src.Import -> Result i w Import
295−verifyImport importDict interfaces (Src.Import (A.At region name) alias exposing) =
296− case Map.lookup name importDict of
297− Just canonicalName ->
298− case Map.lookup canonicalName interfaces of
299− Just interface ->
300− Result.ok (Import canonicalName interface (maybe name id alias) exposing)
301−
302− Nothing ->
303− Result.throw $ Error.ImportNotFound region name (Map.keys interfaces)
304−
305− Nothing ->
306− Result.throw $ Error.ImportNotFound region name (Map.elems importDict)