@@ -16,41 +16,47 @@ import qualified AST.Variable as Var
16import Text.PrettyPrint (Doc)
16import Text.PrettyPrint (Doc)
19−type Dict a = Map.Map String [a]
20+ Map.Map String [a]
21dict :: [(String,a)] -> Dict a
23dict :: [(String,a)] -> Dict a
22dict pairs =
24dict pairs =
23− Map.fromList $ map (second (:[])) pairs
25+ Map.fromList $ map (second (:[])) pairs
25insert :: String -> a -> Dict a -> Dict a
28insert :: String -> a -> Dict a -> Dict a
26insert key value =
29insert key value =
27− Map.insertWith (++) key [value]
30+ Map.insertWith (++) key [value]
30type Canonicalizer err a =
33type Canonicalizer err a =
31 Error.ErrorT err (State.State (Set.Set Module.Name)) a
34 Error.ErrorT err (State.State (Set.Set Module.Name)) a
33uses :: (Error.Error e) => Module.Name -> Canonicalizer e ()
37uses :: (Error.Error e) => Module.Name -> Canonicalizer e ()
34uses home =
38uses home =
35− Error.lift (State.modify (Set.insert home))
39+ Error.lift (State.modify (Set.insert home))
37using :: Var.Canonical -> Canonicalizer String Var.Canonical
42using :: Var.Canonical -> Canonicalizer String Var.Canonical
38using var@(Var.Canonical home _) =
43using var@(Var.Canonical home _) =
39− do case home of
44+ do case home of
40− Var.BuiltIn -> return ()
45+ Var.BuiltIn -> return ()
41− Var.Module path -> uses path
46+ Var.Module path -> uses path
42− Var.Local -> return ()
47+ Var.Local -> return ()
43− return var
48+ return var
45onError :: (String -> Doc) -> Canonicalizer String a -> Canonicalizer [Doc] a
51onError :: (String -> Doc) -> Canonicalizer String a -> Canonicalizer [Doc] a
46onError handler canonicalizer =
52onError handler canonicalizer =
47− do usedModules <- Error.lift State.get
53+ do usedModules <- Error.lift State.get
48− let (result, usedModules') =
54+ let (result, usedModules') =
49− State.runState (Error.runErrorT canonicalizer) usedModules
55+ State.runState (Error.runErrorT canonicalizer) usedModules
50− Error.lift (State.put usedModules')
56+ Error.lift (State.put usedModules')
51− case result of
57+ case result of
52− Left err -> Error.throwError [handler err]
58+ Left err -> Error.throwError [handler err]
53− Right x -> return x
59+ Right x -> return x
56data Environment = Env
62data Environment = Env
@@ -61,6 +67,7 @@ data Environment = Env
61 , _patterns :: Dict Var.Canonical
67 , _patterns :: Dict Var.Canonical
64builtIns :: Module.Name -> Environment
71builtIns :: Module.Name -> Environment
65builtIns home =
72builtIns home =
66 Env { _home = home
73 Env { _home = home
@@ -70,22 +77,27 @@ builtIns home =
70 , _patterns = builtIn (tuples ++ ["::","[]"])
77 , _patterns = builtIn (tuples ++ ["::","[]"])
73− builtIn xs = dict $ map (\x -> (x, Var.Canonical Var.BuiltIn x)) xs
81+ dict $ map (\x -> (x, Var.Canonical Var.BuiltIn x)) xs
74− tuples = map (\n -> "_Tuple" ++ show (n :: Int)) [0..9]
84+ map (\n -> "_Tuple" ++ show (n :: Int)) [0..9]
76update :: P.Pattern var -> Environment -> Environment
87update :: P.Pattern var -> Environment -> Environment
77update ptrn env =
88update ptrn env =
78 env { _values = foldr put (_values env) (P.boundVarList ptrn) }
89 env { _values = foldr put (_values env) (P.boundVarList ptrn) }
80− put x = Map.insert x [Var.local x]
91+ put x = Map.insert x [Var.local x]
82merge :: Environment -> Environment -> Environment
94merge :: Environment -> Environment -> Environment
83merge (Env n1 v1 t1 a1 p1) (Env n2 v2 t2 a2 p2)
95merge (Env n1 v1 t1 a1 p1) (Env n2 v2 t2 a2 p2)
84− | n1 /= n2 = error "trying to merge incompatable environments"
96+ | n1 /= n2 = error "trying to merge incompatable environments"
85− | otherwise =
97+ | otherwise =
86− Env { _home = n1
98+ Env { _home = n1
87− , _values = Map.unionWith (++) v1 v2
99+ , _values = Map.unionWith (++) v1 v2
88− , _adts = Map.unionWith (++) t1 t2
100+ , _adts = Map.unionWith (++) t1 t2
89− , _aliases = Map.unionWith (++) a1 a2
101+ , _aliases = Map.unionWith (++) a1 a2
90− , _patterns = Map.unionWith (++) p1 p2
102+ , _patterns = Map.unionWith (++) p1 p2