2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1994
4 \section[TVE]{Type variable environment}
6 This environment is not part of the big one that is carried around
10 #include "HsVersions.h"
15 mkTVE, nullTVE, unitTVE,
16 lookupTVE, lookupTVE_NoFail, plusTVE,
18 -- and to make the interface self-sufficient...
19 Maybe, Name, TyVarTemplate, UniType
21 IF_ATTACK_PRAGMAS(COMMA emptyUFM COMMA plusUFM)
22 IF_ATTACK_PRAGMAS(COMMA eltsUFM COMMA singletonDirectlyUFM)
23 IF_ATTACK_PRAGMAS(COMMA u2i)
26 import AbsUniType ( mkUserTyVarTemplate, mkTyVarTemplateTy,
27 getTyVar, TyVarTemplate, TyVar, Class,
28 ClassOp, Arity(..), TyCon,
30 IF_ATTACK_PRAGMAS(COMMA cmpTyCon COMMA cmpClass)
31 IF_ATTACK_PRAGMAS(COMMA cmpTyVar)
32 IF_ATTACK_PRAGMAS(COMMA cmpUniType)
34 import Maybes ( Maybe(..), MaybeErr(..) )
36 import Outputable -- def of ppr
37 import Pretty -- to pretty-print error messages
38 import UniqFM -- basic environment handling
39 import Unique ( Unique )
44 type TVE = UniqFM UniType
46 -- also: export non-abstractly
48 mkTVE :: [Name] -> (TVE, [TyVarTemplate], [TauType])
50 = case (unzip3 (map mk_tve_one names)) of { (env, tyvars, tys) ->
51 (MkTVE (listToUFM_Directly env), tyvars, tys) }
53 mk_tve_one (Short uniq short_name)
54 = case (mkUserTyVarTemplate uniq short_name) of { tyvar ->
55 case (mkTyVarTemplateTy tyvar) of { ty ->
56 ((uniq, ty), tyvar, ty) }}
59 nullTVE = MkTVE emptyUFM
61 unitTVE u ty = MkTVE (singletonDirectlyUFM u ty)
63 lookupTVE :: TVE -> Name -> UniType
64 lookupTVE (MkTVE tve) (Short uniq short_name)
65 = case (lookupDirectlyUFM tve uniq) of
67 Nothing -> panic "lookupTVE!"
69 lookupTVE_NoFail (MkTVE tve) (Short uniq short_name)
70 = lookupDirectlyUFM tve uniq
72 plusTVE :: TVE -> TVE -> TVE
73 plusTVE (MkTVE tve1) (MkTVE tve2) = MkTVE (plusUFM tve1 tve2)