1 | module Libraries.Data.ANameMap
5 | import Libraries.Data.NameMap
6 | import Libraries.Data.UserNameMap
11 | record ANameMap a where
12 | constructor MkANameMap
14 | exactNames : NameMap a
17 | hierarchy : UserNameMap (List (Name, a))
21 | empty = MkANameMap empty empty
25 | lookupExact : Name -> ANameMap a -> Maybe a
26 | lookupExact n dict = lookup n (exactNames dict)
29 | lookupName : Name -> ANameMap a -> List (Name, a)
31 | = case userNameRoot n of
32 | Nothing => case lookupExact n dict of
34 | Just res => [(n, res)]
35 | Just r => case lookup r (hierarchy dict) of
37 | Just ns => filter (matches n . fst) ns
39 | addToHier : Name -> a ->
40 | UserNameMap (List (Name, a)) -> UserNameMap (List (Name, a))
41 | addToHier n val hier
44 | = case userNameRoot n of
47 | case lookup root hier of
48 | Nothing => insert root [(n, val)] hier
49 | Just ns => insert root (update val ns) hier
51 | update : a -> List (Name, a) -> List (Name, a)
52 | update val [] = [(n, val)]
53 | update val (old :: xs)
56 | else old :: update val xs
59 | addName : Name -> a -> ANameMap a -> ANameMap a
60 | addName n val (MkANameMap dict hier)
61 | = let dict' = insert n val dict
62 | hier' = addToHier n val hier in
63 | MkANameMap dict' hier'
67 | removeExact : Show a => Name -> ANameMap a -> ANameMap a
68 | removeExact n (MkANameMap dict hier)
69 | = let dict' = delete n dict
72 | (\foundName => deleteFromList foundName hier) n'
73 | in MkANameMap dict' hier'
79 | deleteFromList : (un : UserName) -> (um : UserNameMap (List (Name, a))) -> UserNameMap (List (Name, a))
80 | deleteFromList un = adjust un (filter (\(key, _) => not $
key `matches` n))
83 | toList : ANameMap a -> List (Name, a)
84 | toList dict = toList (exactNames dict)
88 | toAmbiguousList : ANameMap a -> List (UserName, List a)
89 | toAmbiguousList dict = map (mapSnd (map snd)) (toList dict.hierarchy)
92 | fromList : List (Name, a) -> ANameMap a
93 | fromList = fromList' empty
95 | fromList' : ANameMap a -> List (Name, a) -> ANameMap a
96 | fromList' acc [] = acc
97 | fromList' acc ((k, v) :: ns) = fromList' (addName k v acc) ns
102 | merge : ANameMap a -> ANameMap a -> ANameMap a
103 | merge (MkANameMap exact hier) ctxt
104 | = insertFrom (toList exact) ctxt
106 | insertFrom : List (Name, a) -> ANameMap a -> ANameMap a
107 | insertFrom [] ctxt = ctxt
108 | insertFrom ((n, val) :: cs) ctxt
109 | = insertFrom cs (addName n val ctxt)