1{-# OPTIONS_GHC -Wall #-}
2module Canonicalize.Environment where
4import qualified Data.List as List
5import qualified Data.Map as Map
6import qualified Data.Set as Set
8import AST.Expression.General (saveEnvName)
9import qualified AST.Module as Module
10import qualified AST.Pattern as P
11import qualified AST.Type as Type
12import qualified AST.Variable as Var
18 { _home :: Module.Name
19 , _values :: Dict Var.Canonical
20 , _adts :: Dict Var.Canonical
21 , _aliases :: Dict (Var.Canonical, [String], Type.Canonical)
22 , _patterns :: Dict (Var.Canonical, Int)
27 Map.Map String (Set.Set a)
30fromPatches :: Module.Name -> [Patch] -> Environment
31fromPatches moduleName patches =
34 (Env moduleName Map.empty Map.empty Map.empty Map.empty)
37addPattern :: P.Pattern ann var -> Environment -> Environment
38addPattern pattern env =
40 map (\x -> Value x (Var.local x)) (P.boundVarList pattern)
42 addPatches patches env
48 = Value String Var.Canonical
49 | Union String Var.Canonical
50 | Alias String (Var.Canonical, [String], Type.Canonical)
51 | Pattern String (Var.Canonical, Int)
54-- ADD PATCH TO ENVIRONMENT
56addPatches :: [Patch] -> Environment -> Environment
57addPatches patches env =
58 List.foldl' (flip addPatch) env patches
61addPatch :: Patch -> Environment -> Environment
65 env { _values = insert name var (_values env) }
68 env { _adts = insert name var (_adts env) }
71 env { _aliases = insert name var (_aliases env) }
74 env { _patterns = insert name var (_patterns env) }
77insert :: (Ord a) => String -> a -> Dict a -> Dict a
79 Map.insertWith Set.union key (Set.singleton value)
84builtinPatches :: [Patch]
87 [ map (patch Value) (tupleNames ++ [saveEnvName])
88 , map (patch Union) (tupleNames ++ ["List","Int","Float","Char","Bool","String"])
89 , map (patternPatch) (tuples ++ [ ("::", 2), ("[]", 0) ])
93 mkPatch name (Var.builtin name)
95 patternPatch (name, args) =
96 Pattern name (Var.builtin name, args)
104 toTuple :: Int -> (String, Int)
106 ("_Tuple" ++ show n, n)
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