2 #include "HsVersions.h"
5 GenTyVar(..), TyVar(..),
7 getTyVarKind, -- TyVar -> Kind
9 alphaTyVars, alphaTyVar, betaTyVar, gammaTyVar, deltaTyVar,
11 -- We also export "environments" keyed off of
12 -- TyVars and "sets" containing TyVars:
14 nullTyVarEnv, mkTyVarEnv, addOneToTyVarEnv,
15 growTyVarEnvList, isNullTyVarEnv, lookupTyVarEnv,
17 GenTyVarSet(..), TyVarSet(..),
18 emptyTyVarSet, singletonTyVarSet, unionTyVarSets, tyVarListToSet,
19 tyVarSetToList, elementOfTyVarSet, minusTyVarSet, isEmptyTyVarSet
22 CHK_Ubiq() -- debugging consistency check
23 import IdLoop -- for paranoia checking
26 import Usage ( GenUsage, Usage(..), usageOmega )
27 import Kind ( Kind, mkBoxedTypeKind )
30 import UniqSet ( uniqSetToList, emptyUniqSet, singletonUniqSet, minusUniqSet,
31 unionUniqSets, elementOfUniqSet, isEmptyUniqSet, mkUniqSet,
33 import UniqFM ( emptyUFM, listToUFM, addToUFM, lookupUFM,
34 plusUFM, sizeUFM, UniqFM )
35 import Maybes ( Maybe(..) )
36 import NameTypes ( ShortName )
37 import Pretty ( Pretty(..), PrettyRep, ppBeside, ppPStr )
38 import PprStyle ( PprStyle )
39 import Outputable ( Outputable(..), NamedThing(..), ExportFlag(..) )
40 import SrcLoc ( mkUnknownSrcLoc, SrcLoc )
41 import Unique ( showUnique, mkAlphaTyVarUnique, Unique )
42 import Util ( panic, Ord3(..) )
46 data GenTyVar flexi_slot
50 (Maybe ShortName) -- User name (if any)
51 flexi_slot -- Extra slot used during type and usage
52 -- inference, and to contain usages.
54 type TyVar = GenTyVar Usage -- Usage slot makes sense only if Kind = Type
58 Simple construction and analysis functions
59 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
61 mkTyVar :: ShortName -> Unique -> Kind -> TyVar
62 mkTyVar name uniq kind = TyVar uniq
67 getTyVarKind :: GenTyVar flexi -> Kind
68 getTyVarKind (TyVar _ kind _ _) = kind
72 Fixed collection of type variables
73 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75 alphaTyVars = [ TyVar u mkBoxedTypeKind Nothing usageOmega
76 | u <- map mkAlphaTyVarUnique [1..] ]
78 (alphaTyVar:betaTyVar:gammaTyVar:deltaTyVar:_) = alphaTyVars
85 type TyVarEnv elt = UniqFM elt
87 nullTyVarEnv :: TyVarEnv a
88 mkTyVarEnv :: [(GenTyVar flexi, a)] -> TyVarEnv a
89 addOneToTyVarEnv :: TyVarEnv a -> GenTyVar flexi -> a -> TyVarEnv a
90 growTyVarEnvList :: TyVarEnv a -> [(GenTyVar flexi, a)] -> TyVarEnv a
91 isNullTyVarEnv :: TyVarEnv a -> Bool
92 lookupTyVarEnv :: TyVarEnv a -> GenTyVar flexi -> Maybe a
94 nullTyVarEnv = emptyUFM
95 mkTyVarEnv = listToUFM
96 addOneToTyVarEnv = addToUFM
97 lookupTyVarEnv = lookupUFM
99 growTyVarEnvList env pairs = plusUFM env (listToUFM pairs)
100 isNullTyVarEnv env = sizeUFM env == 0
106 type GenTyVarSet flexi = UniqSet (GenTyVar flexi)
107 type TyVarSet = UniqSet TyVar
109 emptyTyVarSet :: GenTyVarSet flexi
110 unionTyVarSets :: GenTyVarSet flexi -> GenTyVarSet flexi -> GenTyVarSet flexi
111 tyVarSetToList :: GenTyVarSet flexi -> [GenTyVar flexi]
112 singletonTyVarSet :: GenTyVar flexi -> GenTyVarSet flexi
113 elementOfTyVarSet :: GenTyVar flexi -> GenTyVarSet flexi -> Bool
114 minusTyVarSet :: GenTyVarSet flexi -> GenTyVarSet flexi -> GenTyVarSet flexi
115 isEmptyTyVarSet :: GenTyVarSet flexi -> Bool
116 tyVarListToSet :: [GenTyVar flexi] -> GenTyVarSet flexi
118 emptyTyVarSet = emptyUniqSet
119 singletonTyVarSet = singletonUniqSet
120 unionTyVarSets = unionUniqSets
121 tyVarSetToList = uniqSetToList
122 elementOfTyVarSet = elementOfUniqSet
123 minusTyVarSet = minusUniqSet
124 isEmptyTyVarSet = isEmptyUniqSet
125 tyVarListToSet = mkUniqSet
131 instance Eq (GenTyVar a) where
132 (TyVar u1 _ _ _) == (TyVar u2 _ _ _) = u1 == u2
134 instance Ord3 (GenTyVar a) where
135 cmp (TyVar u1 _ _ _) (TyVar u2 _ _ _) = u1 `cmp` u2
137 instance NamedThing (GenTyVar a) where
138 getExportFlag (TyVar _ _ _ _) = NotExported
139 isLocallyDefined (TyVar _ _ _ _) = True
141 getOrigName (TyVar _ _ (Just n) _) = getOrigName n
142 getOrigName (TyVar u _ _ _) = (panic "getOrigName:TyVar",
144 getOccurrenceName (TyVar _ _ (Just n) _) = getOccurrenceName n
145 getOccurrenceName (TyVar u _ _ _) = showUnique u
147 getSrcLoc (TyVar _ _ (Just n) _) = getSrcLoc n
148 getSrcLoc (TyVar _ _ _ _) = mkUnknownSrcLoc
149 fromPreludeCore (TyVar _ _ _ _) = False
151 getItsUnique (TyVar u _ _ _) = u