@@ -16,48 +16,7 @@ import qualified AST.Variable as Var
1616import Text.PrettyPrint (Doc)
1717
1818
19−type Dict a =
20− Map.Map String [a]
21−
22−
23−dict :: [(String,a)] -> Dict a
24−dict pairs =
25− Map.fromList $ map (second (:[])) pairs
26−
27−
28−insert :: String -> a -> Dict a -> Dict a
29−insert key value =
30− Map.insertWith (++) key [value]
31−
32−
33−type Canonicalizer err a =
34− Error.ErrorT err (State.State (Set.Set Module.Name)) a
35−
36−
37−uses :: (Error.Error e) => Module.Name -> Canonicalizer e ()
38−uses home =
39− Error.lift (State.modify (Set.insert home))
40−
41−
42−using :: Var.Canonical -> Canonicalizer String Var.Canonical
43−using var@(Var.Canonical home _) =
44− do case home of
45− Var.BuiltIn -> return ()
46− Var.Module path -> uses path
47− Var.Local -> return ()
48− return var
49−
50−
51−onError :: (String -> Doc) -> Canonicalizer String a -> Canonicalizer [Doc] a
52−onError handler canonicalizer =
53− do usedModules <- Error.lift State.get
54− let (result, usedModules') =
55− State.runState (Error.runErrorT canonicalizer) usedModules
56− Error.lift (State.put usedModules')
57− case result of
58− Left err -> Error.throwError [handler err]
59− Right x -> return x
60−
19+-- ENVIRONMENT
6120
6221data Environment = Env
6322 { _home :: Module.Name
@@ -101,3 +60,50 @@ merge (Env n1 v1 t1 a1 p1) (Env n2 v2 t2 a2 p2)
10160 , _aliases = Map.unionWith (++) a1 a2
10261 , _patterns = Map.unionWith (++) p1 p2
10362 }
63+
64+
65+-- RAW NAMES to CANONICAL NAMES
66+
67+type Dict a =
68+ Map.Map String [a]
69+
70+
71+dict :: [(String,a)] -> Dict a
72+dict pairs =
73+ Map.fromList $ map (second (:[])) pairs
74+
75+
76+insert :: String -> a -> Dict a -> Dict a
77+insert key value =
78+ Map.insertWith (++) key [value]
79+
80+
81+-- CANONICALIZATION MANAGER
82+
83+type Canonicalizer err a =
84+ Error.ErrorT err (State.State (Set.Set Module.Name)) a
85+
86+
87+uses :: (Error.Error e) => Module.Name -> Canonicalizer e ()
88+uses home =
89+ Error.lift (State.modify (Set.insert home))
90+
91+
92+using :: Var.Canonical -> Canonicalizer String Var.Canonical
93+using var@(Var.Canonical home _) =
94+ do case home of
95+ Var.BuiltIn -> return ()
96+ Var.Module path -> uses path
97+ Var.Local -> return ()
98+ return var
99+
100+
101+onError :: (String -> Doc) -> Canonicalizer String a -> Canonicalizer [Doc] a
102+onError handler canonicalizer =
103+ do usedModules <- Error.lift State.get
104+ let (result, usedModules') =
105+ State.runState (Error.runErrorT canonicalizer) usedModules
106+ Error.lift (State.put usedModules')
107+ case result of
108+ Left err -> Error.throwError [handler err]
109+ Right x -> return x