@@ -1,5 +1,12 @@
11{-# OPTIONS_GHC -Wall #-}
2−module Canonicalize.Environment where
2+module Canonicalize.Environment
3+ ( Environment(..)
4+ , insert
5+ , Patch(..), fromPatches, addPattern
6+ , builtinPatches
7+ , toDealiaser
8+ )
9+ where
310
411import qualified Data.List as List
512import qualified Data.Map as Map
@@ -14,14 +21,17 @@ import qualified AST.Variable as Var
1421import Elm.Utils ((|>))
1522
1623
24+
1725-- ENVIRONMENT
1826
27+
1928data Environment = Env
2029 { _home :: ModuleName.Canonical
2130 , _values :: Dict Var.Canonical
2231 , _unions :: Dict Var.Canonical
2332 , _aliases :: Dict (Var.Canonical, [String], Type.Canonical)
2433 , _patterns :: Dict (Var.Canonical, Int)
34+ , _effects :: Map.Map String ModuleName.Canonical
2535 }
2636
2737
@@ -29,23 +39,30 @@ type Dict a =
2939 Map.Map String (Set.Set a)
3040
3141
32−fromPatches :: ModuleName.Canonical -> [Patch] -> Environment
33−fromPatches moduleName patches =
42+fromPatches
43+ :: ModuleName.Canonical
44+ -> Map.Map String ModuleName.Canonical
45+ -> [Patch]
46+ -> Environment
47+fromPatches moduleName moduleNames patches =
3448 addPatches
35− patches
36− (Env moduleName Map.empty Map.empty Map.empty Map.empty)
49+ patches
50+ (Env moduleName Map.empty Map.empty Map.empty Map.empty moduleNames)
3751
3852
3953addPattern :: P.Pattern ann var -> Environment -> Environment
4054addPattern pattern env =
41− let patches =
42− map (\x -> Value x (Var.local x)) (P.boundVarList pattern)
55+ let
56+ patches =
57+ map (\x -> Value x (Var.local x)) (P.boundVarList pattern)
4358 in
44− addPatches patches env
59+ addPatches patches env
60+
4561
4662
4763-- PATCHES
4864
65+
4966data Patch
5067 = Value String Var.Canonical
5168 | Union String Var.Canonical
@@ -53,8 +70,10 @@ data Patch
5370 | Pattern String (Var.Canonical, Int)
5471
5572
73+
5674-- ADD PATCH TO ENVIRONMENT
5775
76+
5877addPatches :: [Patch] -> Environment -> Environment
5978addPatches patches env =
6079 List.foldl' (flip addPatch) env patches
@@ -81,8 +100,10 @@ insert key value =
81100 Map.insertWith Set.union key (Set.singleton value)
82101
83102
103+
84104-- PATCH HELPERS
85105
106+
86107builtinPatches :: [Patch]
87108builtinPatches =
88109 concat
@@ -108,10 +129,12 @@ builtinPatches =
108129 ("_Tuple" ++ show n, n)
109130
110131
132+
111133-- TO TYPE DEALIASER
112134
135+
113136toDealiaser :: Environment -> Map.Map String String
114−toDealiaser (Env _ _ unions aliases _) =
137+toDealiaser (Env _ _ unions aliases _ _) =
115138 let
116139 dealiasUnion (localName, canonicalSet) =
117140 case Set.toList canonicalSet of