on master help sign in
Make sure the canonicalizing environment holds no duplicates
commitcf3a0bd0abaf499c90dffe67d43df30ed6bba830 authorEvan Czaplicki <info@elm-lang.org> dateThu 9 Apr 2015, 16:01 (12 years ago) parent1c485a0
3 files changed+15−16
src/AST/Type.hs+2−2 src/Transform/Canonicalize/Environment.hs+9−9 src/Transform/Canonicalize/Variable.hs+4−5
src/AST/Type.hs+2−2
@@ -28,13 +28,13 @@ data Type var
2828 | App (Type var) [Type var]
2929 | Record [(String, Type var)] (Maybe (Type var))
3030 | Aliased Var.Canonical [(String, Type var)] (AliasType var)
31− deriving (Eq,Show)
31+ deriving (Eq, Ord, Show)
3232
3333
3434data AliasType var
3535 = Holey (Type var)
3636 | Filled (Type var)
37− deriving (Eq,Show)
37+ deriving (Eq, Ord, Show)
3838
3939
4040type RawType =
src/Transform/Canonicalize/Environment.hs+9−9
@@ -48,7 +48,7 @@ addPattern ptrn env =
4848 env { _values = foldr put (_values env) (P.boundVarList ptrn) }
4949 where
5050 put x =
51− Map.insert x [Var.local x]
51+ Map.insert x (Set.singleton (Var.local x))
5252
5353
5454merge :: Environment -> Environment -> Environment
@@ -56,27 +56,27 @@ merge (Env n1 v1 t1 a1 p1) (Env n2 v2 t2 a2 p2)
5656 | n1 /= n2 = error "trying to merge incompatable environments"
5757 | otherwise =
5858 Env { _home = n1
59− , _values = Map.unionWith (++) v1 v2
60− , _adts = Map.unionWith (++) t1 t2
61− , _aliases = Map.unionWith (++) a1 a2
62− , _patterns = Map.unionWith (++) p1 p2
59+ , _values = Map.unionWith Set.union v1 v2
60+ , _adts = Map.unionWith Set.union t1 t2
61+ , _aliases = Map.unionWith Set.union a1 a2
62+ , _patterns = Map.unionWith Set.union p1 p2
6363 }
6464
6565
6666-- RAW NAMES to CANONICAL NAMES
6767
6868type Dict a =
69− Map.Map String [a]
69+ Map.Map String (Set.Set a)
7070
7171
7272dict :: [(String,a)] -> Dict a
7373dict pairs =
74− Map.fromList (map (second (:[])) pairs)
74+ Map.fromList (map (second Set.singleton) pairs)
7575
7676
77−insert :: String -> a -> Dict a -> Dict a
77+insert :: (Ord a) => String -> a -> Dict a -> Dict a
7878insert key value =
79− Map.insertWith (++) key [value]
79+ Map.insertWith Set.union key (Set.singleton value)
8080
8181
8282-- CANONICALIZATION MANAGER
src/Transform/Canonicalize/Variable.hs+4−5
@@ -6,7 +6,6 @@ import qualified Data.Either as Either
66import Data.Function (on)
77import qualified Data.List as List
88import qualified Data.Map as Map
9−import Data.Maybe (fromMaybe)
109import qualified Data.Set as Set
1110import qualified Text.EditDistance as Dist
1211
@@ -26,7 +25,7 @@ variable env var =
2625 Env.using (Var.Canonical (Var.Module name) varName)
2726
2827 _ ->
29− case Map.lookup var (_values env) of
28+ case Set.toList `fmap` Map.lookup var (_values env) of
3029 Just [v] -> Env.using v
3130 Just vs -> preferLocals env "variable" vs var
3231 Nothing -> notFound "variable" (Map.keys (_values env)) var
@@ -43,10 +42,10 @@ tvar env var =
4342 vs -> preferLocals' env extract "type" vs var
4443 where
4544 adts =
46− map Left (fromMaybe [] (Map.lookup var (_adts env)))
45+ map Left (maybe [] Set.toList (Map.lookup var (_adts env)))
4746
4847 aliases =
49− map Right (fromMaybe [] (Map.lookup var (_aliases env)))
48+ map Right (maybe [] Set.toList (Map.lookup var (_aliases env)))
5049
5150 extract value =
5251 case value of
@@ -56,7 +55,7 @@ tvar env var =
5655
5756pvar :: Environment -> String -> Canonicalizer String Var.Canonical
5857pvar env var =
59− case Map.lookup var (_patterns env) of
58+ case Set.toList `fmap` Map.lookup var (_patterns env) of
6059 Just [v] -> Env.using v
6160 Just vs -> preferLocals env "pattern" vs var
6261 Nothing -> notFound "pattern" (Map.keys (_patterns env)) var