View patterns, record wildcards, and record puns
[ghc-hetmet.git] / compiler / basicTypes / NameEnv.lhs
index 561aeb6..b6a7ec8 100644 (file)
@@ -1,12 +1,20 @@
 %
+% (c) The University of Glasgow 2006
 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
 %
 \section[NameEnv]{@NameEnv@: name environments}
 
 \begin{code}
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
 module NameEnv (
        NameEnv, mkNameEnv,
-       emptyNameEnv, unitNameEnv, nameEnvElts, 
+       emptyNameEnv, unitNameEnv, nameEnvElts, nameEnvUniqueElts,
        extendNameEnv_C, extendNameEnv_Acc, extendNameEnv,
         extendNameEnvList, extendNameEnvList_C,
        foldNameEnv, filterNameEnv,
@@ -17,9 +25,11 @@ module NameEnv (
 
 #include "HsVersions.h"
 
-import Name    ( Name )
+import Name
+import Unique(Unique)
 import UniqFM
-import Maybes  ( expectJust )
+import Maybes
+import Outputable
 \end{code}
 
 %************************************************************************
@@ -29,11 +39,12 @@ import Maybes       ( expectJust )
 %************************************************************************
 
 \begin{code}
-type NameEnv a = UniqFM a      -- Domain is Name
+newtype NameEnv a = A (UniqFM a)       -- Domain is Name
 
 emptyNameEnv              :: NameEnv a
 mkNameEnv         :: [(Name,a)] -> NameEnv a
 nameEnvElts               :: NameEnv a -> [a]
+nameEnvUniqueElts  :: NameEnv a -> [(Unique, a)]
 extendNameEnv_C    :: (a->a->a) -> NameEnv a -> Name -> a -> NameEnv a
 extendNameEnv_Acc  :: (a->b->b) -> (a->b) -> NameEnv b -> Name -> a -> NameEnv b
 extendNameEnv             :: NameEnv a -> Name -> a -> NameEnv a
@@ -51,25 +62,31 @@ foldNameEnv    :: (a -> b -> b) -> b -> NameEnv a -> b
 filterNameEnv     :: (elt -> Bool) -> NameEnv elt -> NameEnv elt
 mapNameEnv        :: (elt1 -> elt2) -> NameEnv elt1 -> NameEnv elt2
 
-emptyNameEnv               = emptyUFM
-foldNameEnv        = foldUFM
-mkNameEnv          = listToUFM
-nameEnvElts                = eltsUFM
-extendNameEnv_C     = addToUFM_C
-extendNameEnv_Acc   = addToUFM_Acc
-extendNameEnv              = addToUFM
-plusNameEnv                = plusUFM
-plusNameEnv_C              = plusUFM_C
-extendNameEnvList   = addListToUFM
-extendNameEnvList_C = addListToUFM_C
-delFromNameEnv             = delFromUFM
-delListFromNameEnv  = delListFromUFM
-elemNameEnv                = elemUFM
-unitNameEnv                = unitUFM
-filterNameEnv      = filterUFM
-mapNameEnv         = mapUFM
+nameEnvElts (A x) = eltsUFM x
+emptyNameEnv    = A emptyUFM
+unitNameEnv x y = A $ unitUFM x y 
+extendNameEnv (A x) y z = A $ addToUFM x y z
+extendNameEnvList (A x) l = A $ addListToUFM x l
+lookupNameEnv (A x) y = lookupUFM x y
+mkNameEnv     l    = A $ listToUFM l
+elemNameEnv x (A y)     = elemUFM x y
+foldNameEnv a b (A c)   = foldUFM a b c 
+occEnvElts (A x)        = eltsUFM x
+plusNameEnv (A x) (A y)         = A $ plusUFM x y 
+plusNameEnv_C f (A x) (A y)     = A $ plusUFM_C f x y 
+extendNameEnv_C f (A x) y z   = A $ addToUFM_C f x y z
+mapNameEnv f (A x)      = A $ mapUFM f x
+mkNameEnv_C comb l = A $ addListToUFM_C comb emptyUFM l
+nameEnvUniqueElts (A x)  = ufmToList x
+extendNameEnv_Acc x y (A z) a b  = A $ addToUFM_Acc x y z a b
+extendNameEnvList_C x (A y) z = A $ addListToUFM_C x y z
+delFromNameEnv (A x) y    = A $ delFromUFM x y
+delListFromNameEnv (A x) y  = A $ delListFromUFM x y
+filterNameEnv x (A y)       = A $ filterUFM x y
+
+lookupNameEnv_NF env n = expectJust "lookupNameEnv_NF" (lookupNameEnv env n)
 
-lookupNameEnv                 = lookupUFM
-lookupNameEnv_NF env n = expectJust "lookupNameEnv_NF" (lookupUFM env n)
+instance Outputable a => Outputable (NameEnv a) where
+    ppr (A x) = ppr x
 \end{code}