@@ -1,5 +1,12 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2−module Canonicalize.Environment where
2+module Canonicalize.Environment
5+ , Patch(..), fromPatches, addPattern
4import qualified Data.List as List
11import qualified Data.List as List
5import qualified Data.Map as Map
12import qualified Data.Map as Map
@@ -14,14 +21,17 @@ import qualified AST.Variable as Var
14import Elm.Utils ((|>))
21import Elm.Utils ((|>))
17-- ENVIRONMENT
25-- ENVIRONMENT
19data Environment = Env
28data Environment = Env
20 { _home :: ModuleName.Canonical
29 { _home :: ModuleName.Canonical
21 , _values :: Dict Var.Canonical
30 , _values :: Dict Var.Canonical
22 , _unions :: Dict Var.Canonical
31 , _unions :: Dict Var.Canonical
23 , _aliases :: Dict (Var.Canonical, [String], Type.Canonical)
32 , _aliases :: Dict (Var.Canonical, [String], Type.Canonical)
24 , _patterns :: Dict (Var.Canonical, Int)
33 , _patterns :: Dict (Var.Canonical, Int)
34+ , _effects :: Map.Map String ModuleName.Canonical
@@ -29,23 +39,30 @@ type Dict a =
29 Map.Map String (Set.Set a)
39 Map.Map String (Set.Set a)
32−fromPatches :: ModuleName.Canonical -> [Patch] -> Environment
43+ :: ModuleName.Canonical
44+ -> Map.Map String ModuleName.Canonical
33−fromPatches moduleName patches =
47+fromPatches moduleName moduleNames patches =
34 addPatches
48 addPatches
36− (Env moduleName Map.empty Map.empty Map.empty Map.empty)
50+ (Env moduleName Map.empty Map.empty Map.empty Map.empty moduleNames)
39addPattern :: P.Pattern ann var -> Environment -> Environment
53addPattern :: P.Pattern ann var -> Environment -> Environment
40addPattern pattern env =
54addPattern pattern env =
41− let patches =
56+ patches =
42− map (\x -> Value x (Var.local x)) (P.boundVarList pattern)
57+ map (\x -> Value x (Var.local x)) (P.boundVarList pattern)
44− addPatches patches env
59+ addPatches patches env
50 = Value String Var.Canonical
67 = Value String Var.Canonical
51 | Union String Var.Canonical
68 | Union String Var.Canonical
@@ -53,8 +70,10 @@ data Patch
53 | Pattern String (Var.Canonical, Int)
70 | Pattern String (Var.Canonical, Int)
56-- ADD PATCH TO ENVIRONMENT
74-- ADD PATCH TO ENVIRONMENT
58addPatches :: [Patch] -> Environment -> Environment
77addPatches :: [Patch] -> Environment -> Environment
59addPatches patches env =
78addPatches patches env =
60 List.foldl' (flip addPatch) env patches
79 List.foldl' (flip addPatch) env patches
@@ -81,8 +100,10 @@ insert key value =
81 Map.insertWith Set.union key (Set.singleton value)
100 Map.insertWith Set.union key (Set.singleton value)
84-- PATCH HELPERS
104-- PATCH HELPERS
86builtinPatches :: [Patch]
107builtinPatches :: [Patch]
87builtinPatches =
108builtinPatches =
@@ -108,10 +129,12 @@ builtinPatches =
108 ("_Tuple" ++ show n, n)
129 ("_Tuple" ++ show n, n)
111-- TO TYPE DEALIASER
133-- TO TYPE DEALIASER
113toDealiaser :: Environment -> Map.Map String String
136toDealiaser :: Environment -> Map.Map String String
114−toDealiaser (Env _ _ unions aliases _) =
137+toDealiaser (Env _ _ unions aliases _ _) =
116 dealiasUnion (localName, canonicalSet) =
139 dealiasUnion (localName, canonicalSet) =
117 case Set.toList canonicalSet of
140 case Set.toList canonicalSet of