tyVarName, tyVarKind,
setTyVarName, setTyVarUnique,
mkTyVar, mkSysTyVar,
- newMutTyVar, readMutTyVar, writeMutTyVar, makeTyVarImmutable,
+ mkMutTyVar, mutTyVarRef, makeTyVarImmutable,
-- Ids
Id, DictId,
import FastTypes
import Outputable
-import DATA_IOREF ( IORef, newIORef, readIORef, writeIORef )
+import DATA_IOREF ( IORef )
\end{code}
| TyVar
| MutTyVar (IORef (Maybe Type)) -- Used during unification;
TyVarDetails
+ -- TODO: the IORef should be unboxed here, but we don't want to unbox
+ -- the Name above.
- -- For a long time I tried to keep mutable Vars statically type-distinct
- -- from immutable Vars, but I've finally given up. It's just too painful.
- -- After type checking there are no MutTyVars left, but there's no static check
- -- of that fact.
+ -- For a long time I tried to keep mutable Vars statically
+ -- type-distinct from immutable Vars, but I've finally given
+ -- up. It's just too painful. After type checking there are
+ -- no MutTyVars left, but there's no static check of that
+ -- fact.
data LocalIdDetails
= NotExported -- Not exported
where
name = mkSystemTvNameEncoded uniq FSLIT("t")
-newMutTyVar :: Name -> Kind -> TyVarDetails -> IO TyVar
-newMutTyVar name kind details
- = do loc <- newIORef Nothing
- return (Var { varName = name
- , realUnique = getKey (nameUnique name)
- , varType = kind
- , varDetails = MutTyVar loc details
- , varInfo = pprPanic "newMutTyVar" (ppr name)
- })
-
-readMutTyVar :: TyVar -> IO (Maybe Type)
-readMutTyVar (Var {varDetails = MutTyVar loc _}) = readIORef loc
-
-writeMutTyVar :: TyVar -> Maybe Type -> IO ()
-writeMutTyVar (Var {varDetails = MutTyVar loc _}) val = writeIORef loc val
+mkMutTyVar :: Name -> Kind -> TyVarDetails -> IORef (Maybe Type) -> TyVar
+mkMutTyVar name kind details ref
+ = Var { varName = name
+ , realUnique = getKey (nameUnique name)
+ , varType = kind
+ , varDetails = MutTyVar ref details
+ , varInfo = pprPanic "newMutTyVar" (ppr name)
+ }
+
+mutTyVarRef :: TyVar -> IORef (Maybe Type)
+mutTyVarRef (Var {varDetails = MutTyVar loc _}) = loc
makeTyVarImmutable :: TyVar -> TyVar
makeTyVarImmutable tyvar = tyvar { varDetails = TyVar}