AddressEnv(..), \r
DataConEnv,\r
extendAddressEnvList, \r
- extendAddressEnvList', \r
elemAddressEnv, \r
delFromAddressEnv, \r
emptyAddressEnv, \r
\r
import DataCon \r
import Type \r
-import TcRnMonad\r
+import TcRnMonad ( TcM, initTcPrintErrors, ioToTcRn, recoverM, writeMutVar )\r
import TcType\r
import TcMType\r
import TcUnify\r
import TcGadt\r
-import DriverPhases\r
import TyCon \r
import Var\r
import Name \r
+import VarEnv\r
+import OccName\r
+import VarSet\r
import Unique\r
-import UniqSupply\r
-import Var ( setVarUnique, mkTyVar, tyVarKind, setTyVarKind )\r
-import VarEnv ( mkVarEnv )\r
-import OccName ( emptyTidyOccEnv )\r
-import VarSet ( VarSet, mkVarSet, varSetElems, unionVarSets )\r
-import Unique ( getUnique, incrUnique )\r
import {-#SOURCE#-} TcRnDriver ( tcRnRecoverDataCon )\r
\r
import TysPrim \r
import TysWiredIn\r
\r
import Constants ( wORD_SIZE )\r
-import FastString ( mkFastString )\r
import Outputable\r
+import Maybes\r
import Panic\r
+import FiniteMap\r
\r
import GHC.Arr ( Array(..) )\r
import GHC.Ptr ( Ptr(..), castPtr )\r
import GHC.Int ( Int32(..), Int64(..) )\r
import GHC.Word ( Word32(..), Word64(..) )\r
\r
-import Control.Monad ( liftM, liftM2, msum )\r
+import Control.Monad\r
import Data.Maybe\r
-import Data.List\r
-import Data.Traversable ( mapM )\r
import Data.Array.Base\r
+import Data.List ( partition )\r
import Foreign.Storable\r
-import Foreign ( unsafePerformIO )\r
-\r
-import Prelude hiding ( mapM )\r
\r
---------------------------------------------\r
-- * A representation of semi evaluated Terms\r
fTerm = \ty dc v tt -> sequence tt >>= \tt ->\r
zonkTcType ty >>= \ty' ->\r
return (Term ty' dc v tt)\r
- ,fSuspension = \ct ty v b -> mapM zonkTcType ty >>= \ty ->\r
+ ,fSuspension = \ct ty v b -> fmapMMaybe zonkTcType ty >>= \ty ->\r
return (Suspension ct ty v b)} \r
\r
{-\r
type DataConEnv = AddressEnv StgInfoTable\r
\r
-- Note that this AddressEnv and DataConEnv I wrote trying to follow \r
--- conventions in ghc, but probably they make no sense. Should \r
--- probably be replaced by a plain Data.Map\r
+-- conventions in ghc, but probably they make not much sense.\r
\r
-newtype AddressEnv a = AE {outAE::[(Ptr a, Name)]}\r
+newtype AddressEnv a = AE {aenv:: FiniteMap (Ptr a) Name}\r
+ deriving (Outputable)\r
\r
-emptyAddressEnv = AE []\r
+emptyAddressEnv = AE emptyFM\r
\r
extendAddressEnvList :: AddressEnv a -> [(Ptr a, Name)] -> AddressEnv a\r
-extendAddressEnvList' :: AddressEnv a -> [(Ptr a, Name)] -> AddressEnv a\r
elemAddressEnv :: Ptr a -> AddressEnv a -> Bool\r
delFromAddressEnv :: AddressEnv a -> Ptr a -> AddressEnv a\r
nullAddressEnv :: AddressEnv a -> Bool\r
lookupAddressEnv :: AddressEnv a -> Ptr a -> Maybe Name\r
\r
-extendAddressEnvList (AE env) = AE . nub . (++ env) \r
-extendAddressEnvList' (AE env) = AE . (++ env)\r
-elemAddressEnv ptr (AE env) = ptr `elem` fst (unzip env) \r
-delFromAddressEnv (AE env) ptr = AE [(ptr', n) | (ptr', n) <- env, ptr' /= ptr]\r
-nullAddressEnv = null . outAE\r
-lookupAddressEnv (AE env) = flip lookup env\r
-\r
-instance Outputable (AddressEnv a) where\r
- ppr (AE ae) = vcat [text (show ptr) <> comma <> ppr a | (ptr,a) <- ae] \r
+extendAddressEnvList (AE env) = AE . addListToFM env \r
+elemAddressEnv ptr (AE env) = ptr `elemFM` env\r
+delFromAddressEnv (AE env) = AE . delFromFM env\r
+nullAddressEnv = isEmptyFM . aenv\r
+lookupAddressEnv (AE env) = lookupFM env\r
\r
\r
+instance Outputable (Ptr a) where\r
+ ppr = text . show
\ No newline at end of file