on master help sign in
style: improve indentation
a0c0bc5Evan Czaplicki
src/Transform/Canonicalize/Environment.hs+40−28
@@ -16,41 +16,47 @@ import qualified AST.Variable as Var
16import Text.PrettyPrint (Doc)
16import Text.PrettyPrint (Doc)
17
17
18
18
19+type Dict a =
19−type Dict a = Map.Map String [a]
20+ Map.Map String [a]
21+
20
22
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
26+
24
27
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]
28
31
29
32
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
32
35
36+
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))
40+
36
41
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
49+
44
50
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
54
60
55
61
56data Environment = Env
62data Environment = Env
@@ -61,6 +67,7 @@ data Environment = Env
61 , _patterns :: Dict Var.Canonical
67 , _patterns :: Dict Var.Canonical
62 }
68 }
63
69
70+
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 ++ ["::","[]"])
71 }
78 }
72 where
79 where
80+ builtIn xs =
73− builtIn xs = dict $ map (\x -> (x, Var.Canonical Var.BuiltIn x)) xs
81+ dict $ map (\x -> (x, Var.Canonical Var.BuiltIn x)) xs
82+
83+ tuples =
74− tuples = map (\n -> "_Tuple" ++ show (n :: Int)) [0..9]
84+ map (\n -> "_Tuple" ++ show (n :: Int)) [0..9]
85+
75
86
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) }
79− where
90+ where
80− put x = Map.insert x [Var.local x]
91+ put x = Map.insert x [Var.local x]
92+
81
93
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
91− }
103+ }