{-+ Type environments. For efficiency, a type environment is represented as a pair of an environment and the set of (nongeneric) type variables that occur free in the environment. The type checker needs this information when it generalizes a type, and traversing the whole environment every time is too costly. -} module TiTEnv(TEnv,extenv1,extenv,empty,TiTEnv.lookup,domain,range) where import HsIdent(HsIdentI) import TiTypes(Scheme,Types(..)) import TiNames(TypeVar) import qualified TiEnvFM as E import Set60204 #if __GLASGOW_HASKELL__ >= 604 import qualified Data.Set as S (Set) #else import qualified Sets as S (Set) #endif type TEnv' i = E.Env (HsIdentI i) (Scheme i) -- types of value identifiers data TEnv i = TEnv (TEnv' i) (S.Set i) extenv1 x t (TEnv env vs) = TEnv (E.extenv1 x t env) (vs `unionS` fromListS (tv t)) extenv bs1 (TEnv bs2 vs) = TEnv (E.extenv bs1 bs2) (vs `unionS` fromListS (tv (map snd bs1))) empty = TEnv E.empty emptyS lookup (TEnv env _) x = E.lookup env x domain (TEnv env _) = E.domain env range (TEnv env _) = E.range env --instance Functor TEnv where ... instance TypeVar i => Types i (TEnv i) where tv (TEnv env vs) = elemsS vs -- tmap -- of questionable use...