on master help sign in
Make sure the canonicalizing environment holds no duplicates
cf3a0bdEvan Czaplicki
src/AST/Type.hs+2−2
@@ -28,13 +28,13 @@ data Type var
28 | App (Type var) [Type var]
28 | App (Type var) [Type var]
29 | Record [(String, Type var)] (Maybe (Type var))
29 | Record [(String, Type var)] (Maybe (Type var))
30 | Aliased Var.Canonical [(String, Type var)] (AliasType var)
30 | Aliased Var.Canonical [(String, Type var)] (AliasType var)
31− deriving (Eq,Show)
31+ deriving (Eq, Ord, Show)
32
32
33
33
34data AliasType var
34data AliasType var
35 = Holey (Type var)
35 = Holey (Type var)
36 | Filled (Type var)
36 | Filled (Type var)
37− deriving (Eq,Show)
37+ deriving (Eq, Ord, Show)
38
38
39
39
40type RawType =
40type RawType =
src/Transform/Canonicalize/Environment.hs+9−9
@@ -48,7 +48,7 @@ addPattern ptrn env =
48 env { _values = foldr put (_values env) (P.boundVarList ptrn) }
48 env { _values = foldr put (_values env) (P.boundVarList ptrn) }
49 where
49 where
50 put x =
50 put x =
51− Map.insert x [Var.local x]
51+ Map.insert x (Set.singleton (Var.local x))
52
52
53
53
54merge :: Environment -> Environment -> Environment
54merge :: Environment -> Environment -> Environment
@@ -56,27 +56,27 @@ merge (Env n1 v1 t1 a1 p1) (Env n2 v2 t2 a2 p2)
56 | n1 /= n2 = error "trying to merge incompatable environments"
56 | n1 /= n2 = error "trying to merge incompatable environments"
57 | otherwise =
57 | otherwise =
58 Env { _home = n1
58 Env { _home = n1
59− , _values = Map.unionWith (++) v1 v2
59+ , _values = Map.unionWith Set.union v1 v2
60− , _adts = Map.unionWith (++) t1 t2
60+ , _adts = Map.unionWith Set.union t1 t2
61− , _aliases = Map.unionWith (++) a1 a2
61+ , _aliases = Map.unionWith Set.union a1 a2
62− , _patterns = Map.unionWith (++) p1 p2
62+ , _patterns = Map.unionWith Set.union p1 p2
63 }
63 }
64
64
65
65
66-- RAW NAMES to CANONICAL NAMES
66-- RAW NAMES to CANONICAL NAMES
67
67
68type Dict a =
68type Dict a =
69− Map.Map String [a]
69+ Map.Map String (Set.Set a)
70
70
71
71
72dict :: [(String,a)] -> Dict a
72dict :: [(String,a)] -> Dict a
73dict pairs =
73dict pairs =
74− Map.fromList (map (second (:[])) pairs)
74+ Map.fromList (map (second Set.singleton) pairs)
75
75
76
76
77−insert :: String -> a -> Dict a -> Dict a
77+insert :: (Ord a) => String -> a -> Dict a -> Dict a
78insert key value =
78insert key value =
79− Map.insertWith (++) key [value]
79+ Map.insertWith Set.union key (Set.singleton value)
80
80
81
81
82-- CANONICALIZATION MANAGER
82-- CANONICALIZATION MANAGER
src/Transform/Canonicalize/Variable.hs+4−5
@@ -6,7 +6,6 @@ import qualified Data.Either as Either
6import Data.Function (on)
6import Data.Function (on)
7import qualified Data.List as List
7import qualified Data.List as List
8import qualified Data.Map as Map
8import qualified Data.Map as Map
9−import Data.Maybe (fromMaybe)
10import qualified Data.Set as Set
9import qualified Data.Set as Set
11import qualified Text.EditDistance as Dist
10import qualified Text.EditDistance as Dist
12
11
@@ -26,7 +25,7 @@ variable env var =
26 Env.using (Var.Canonical (Var.Module name) varName)
25 Env.using (Var.Canonical (Var.Module name) varName)
27
26
28 _ ->
27 _ ->
29− case Map.lookup var (_values env) of
28+ case Set.toList `fmap` Map.lookup var (_values env) of
30 Just [v] -> Env.using v
29 Just [v] -> Env.using v
31 Just vs -> preferLocals env "variable" vs var
30 Just vs -> preferLocals env "variable" vs var
32 Nothing -> notFound "variable" (Map.keys (_values env)) var
31 Nothing -> notFound "variable" (Map.keys (_values env)) var
@@ -43,10 +42,10 @@ tvar env var =
43 vs -> preferLocals' env extract "type" vs var
42 vs -> preferLocals' env extract "type" vs var
44 where
43 where
45 adts =
44 adts =
46− map Left (fromMaybe [] (Map.lookup var (_adts env)))
45+ map Left (maybe [] Set.toList (Map.lookup var (_adts env)))
47
46
48 aliases =
47 aliases =
49− map Right (fromMaybe [] (Map.lookup var (_aliases env)))
48+ map Right (maybe [] Set.toList (Map.lookup var (_aliases env)))
50
49
51 extract value =
50 extract value =
52 case value of
51 case value of
@@ -56,7 +55,7 @@ tvar env var =
56
55
57pvar :: Environment -> String -> Canonicalizer String Var.Canonical
56pvar :: Environment -> String -> Canonicalizer String Var.Canonical
58pvar env var =
57pvar env var =
59− case Map.lookup var (_patterns env) of
58+ case Set.toList `fmap` Map.lookup var (_patterns env) of
60 Just [v] -> Env.using v
59 Just [v] -> Env.using v
61 Just vs -> preferLocals env "pattern" vs var
60 Just vs -> preferLocals env "pattern" vs var
62 Nothing -> notFound "pattern" (Map.keys (_patterns env)) var
61 Nothing -> notFound "pattern" (Map.keys (_patterns env)) var