[project @ 2003-01-13 17:01:22 by simonpj]
[ghc-hetmet.git] / ghc / compiler / basicTypes / NameSet.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1998
3 %
4 \section[NameSet]{@NameSets@} 
5
6 \begin{code}
7 module NameSet (
8         -- Sets of Names
9         NameSet,
10         emptyNameSet, unitNameSet, mkNameSet, unionNameSets, unionManyNameSets,
11         minusNameSet, elemNameSet, nameSetToList, addOneToNameSet, addListToNameSet, 
12         delFromNameSet, delListFromNameSet, isEmptyNameSet, foldNameSet, filterNameSet,
13         intersectsNameSet, intersectNameSet,
14         
15         -- Free variables
16         FreeVars, isEmptyFVs, emptyFVs, plusFVs, plusFV, 
17         mkFVs, addOneFV, unitFV, delFV, delFVs
18     ) where
19
20 #include "HsVersions.h"
21
22 import Name
23 import UniqSet
24 \end{code}
25
26
27 %************************************************************************
28 %*                                                                      *
29 \subsection[Sets of names}
30 %*                                                                      *
31 %************************************************************************
32
33 \begin{code}
34 type NameSet = UniqSet Name
35 emptyNameSet       :: NameSet
36 unitNameSet        :: Name -> NameSet
37 addListToNameSet   :: NameSet -> [Name] -> NameSet
38 addOneToNameSet    :: NameSet -> Name -> NameSet
39 mkNameSet          :: [Name] -> NameSet
40 unionNameSets      :: NameSet -> NameSet -> NameSet
41 unionManyNameSets  :: [NameSet] -> NameSet
42 minusNameSet       :: NameSet -> NameSet -> NameSet
43 elemNameSet        :: Name -> NameSet -> Bool
44 nameSetToList      :: NameSet -> [Name]
45 isEmptyNameSet     :: NameSet -> Bool
46 delFromNameSet     :: NameSet -> Name -> NameSet
47 delListFromNameSet :: NameSet -> [Name] -> NameSet
48 foldNameSet        :: (Name -> b -> b) -> b -> NameSet -> b
49 filterNameSet      :: (Name -> Bool) -> NameSet -> NameSet
50 intersectNameSet   :: NameSet -> NameSet -> NameSet
51 intersectsNameSet  :: NameSet -> NameSet -> Bool        -- True if non-empty intersection
52         -- (s1 `intersectsVarSet` s2) doesn't compute s2 if s1 is empty
53
54 isEmptyNameSet    = isEmptyUniqSet
55 emptyNameSet      = emptyUniqSet
56 unitNameSet       = unitUniqSet
57 mkNameSet         = mkUniqSet
58 addListToNameSet  = addListToUniqSet
59 addOneToNameSet   = addOneToUniqSet
60 unionNameSets     = unionUniqSets
61 unionManyNameSets = unionManyUniqSets
62 minusNameSet      = minusUniqSet
63 elemNameSet       = elementOfUniqSet
64 nameSetToList     = uniqSetToList
65 delFromNameSet    = delOneFromUniqSet
66 foldNameSet       = foldUniqSet
67 filterNameSet     = filterUniqSet
68 intersectNameSet  = intersectUniqSets
69
70 delListFromNameSet set ns = foldl delFromNameSet set ns
71
72 intersectsNameSet s1 s2 = not (isEmptyNameSet (s1 `intersectNameSet` s2))
73 \end{code}
74
75
76 %************************************************************************
77 %*                                                                      *
78 \subsection{Free variables}
79 %*                                                                      *
80 %************************************************************************
81
82 These synonyms are useful when we are thinking of free variables
83
84 \begin{code}
85 type FreeVars   = NameSet
86
87 plusFV   :: FreeVars -> FreeVars -> FreeVars
88 addOneFV :: FreeVars -> Name -> FreeVars
89 unitFV   :: Name -> FreeVars
90 emptyFVs :: FreeVars
91 plusFVs  :: [FreeVars] -> FreeVars
92 mkFVs    :: [Name] -> FreeVars
93 delFV    :: Name -> FreeVars -> FreeVars
94 delFVs   :: [Name] -> FreeVars -> FreeVars
95
96 isEmptyFVs  = isEmptyNameSet
97 emptyFVs    = emptyNameSet
98 plusFVs     = unionManyNameSets
99 plusFV      = unionNameSets
100 mkFVs       = mkNameSet
101 addOneFV    = addOneToNameSet
102 unitFV      = unitNameSet
103 delFV n s   = delFromNameSet s n
104 delFVs ns s = delListFromNameSet s ns
105 \end{code}
106