1{-# OPTIONS_GHC -Wall #-}
2module Transform.Canonicalize.Environment where
4import Control.Arrow (second)
5import qualified Control.Monad.Error as Error
6import qualified Control.Monad.State as State
7import qualified Data.Map as Map
8import qualified Data.Set as Set
10import AST.Expression.General (saveEnvName)
11import qualified AST.Module as Module
12import qualified AST.Pattern as P
13import qualified AST.Type as Type
14import qualified AST.Variable as Var
16import Text.PrettyPrint (Doc)
22 { _home :: Module.Name
23 , _values :: Dict Var.Canonical
24 , _adts :: Dict Var.Canonical
25 , _aliases :: Dict (Var.Canonical, [String], Type.CanonicalType)
26 , _patterns :: Dict Var.Canonical
30builtIns :: Module.Name -> Environment
33 , _values = builtIn (tuples ++ [saveEnvName])
34 , _adts = builtIn (tuples ++ ["List","Int","Float","Char","Bool","String"])
36 , _patterns = builtIn (tuples ++ ["::","[]"])
40 dict $ map (\x -> (x, Var.Canonical Var.BuiltIn x)) xs
43 map (\n -> "_Tuple" ++ show n) [0 .. 9 :: Int]
46addPattern :: P.Pattern var -> Environment -> Environment
48 env { _values = foldr put (_values env) (P.boundVarList ptrn) }
51 Map.insert x [Var.local x]
54merge :: Environment -> Environment -> Environment
55merge (Env n1 v1 t1 a1 p1) (Env n2 v2 t2 a2 p2)
56 | n1 /= n2 = error "trying to merge incompatable environments"
59 , _values = Map.unionWith (++) v1 v2
60 , _adts = Map.unionWith (++) t1 t2
61 , _aliases = Map.unionWith (++) a1 a2
62 , _patterns = Map.unionWith (++) p1 p2
66-- RAW NAMES to CANONICAL NAMES
72dict :: [(String,a)] -> Dict a
74 Map.fromList (map (second (:[])) pairs)
77insert :: String -> a -> Dict a -> Dict a
79 Map.insertWith (++) key [value]
82-- CANONICALIZATION MANAGER
84type Canonicalizer err a =
85 Error.ErrorT err (State.State (Set.Set Module.Name)) a
88uses :: (Error.Error e) => Module.Name -> Canonicalizer e ()
90 Error.lift (State.modify (Set.insert home))
93using :: Var.Canonical -> Canonicalizer String Var.Canonical
94using var@(Var.Canonical home _) =
96 Var.BuiltIn -> return ()
97 Var.Module path -> uses path
98 Var.Local -> return ()
102onError :: (String -> Doc) -> Canonicalizer String a -> Canonicalizer [Doc] a
103onError handler canonicalizer =
104 do usedModules <- Error.lift State.get
105 let (result, usedModules') =
106 State.runState (Error.runErrorT canonicalizer) usedModules
107 Error.lift (State.put usedModules')
109 Left err -> Error.throwError [handler err]
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list