%
\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 OccName (
-- * The NameSpace type; abstact
NameSpace, tcName, clsName, tcClsName, dataName, varName,
mkSpecOcc, mkForeignExportOcc, mkGenOcc1, mkGenOcc2,
mkDataTOcc, mkDataCOcc, mkDataConWorkerOcc,
mkSuperDictSelOcc, mkLocalOcc, mkMethodOcc, mkInstTyTcOcc,
- mkInstTyCoOcc,
+ mkInstTyCoOcc, mkEqPredCoOcc,
+ mkVectOcc, mkVectTyConOcc, mkVectDataConOcc, mkVectIsoOcc,
+ mkPArrayTyConOcc, mkPArrayDataConOcc,
+ mkPReprTyConOcc,
+ mkPADFunOcc,
-- ** Deconstruction
occNameFS, occNameString, occNameSpace,
-- The OccEnv type
OccEnv, emptyOccEnv, unitOccEnv, extendOccEnv, mapOccEnv,
- lookupOccEnv, mkOccEnv, extendOccEnvList, elemOccEnv,
+ lookupOccEnv, mkOccEnv, mkOccEnv_C, extendOccEnvList, elemOccEnv,
occEnvElts, foldOccEnv, plusOccEnv, plusOccEnv_C, extendOccEnv_C,
-- The OccSet type
-- Unicode TODO: put isSymbol in libcompat
#if __GLASGOW_HASKELL__ > 604
-import Data.Char ( isSymbol )
#else
isSymbol = const False
#endif
%************************************************************************
\begin{code}
-data NameSpace = VarName -- Variables, including "source" data constructors
- | DataName -- "Real" data constructors
+data NameSpace = VarName -- Variables, including "real" data constructors
+ | DataName -- "Source" data constructors
| TvName -- Type variables
| TcClsName -- Type constructors and classes; Haskell has them
-- in the same name space for now.
(OccName sp1 s1) == (OccName sp2 s2) = s1 == s2 && sp1 == sp2
instance Ord OccName where
- compare (OccName sp1 s1) (OccName sp2 s2) = (s1 `compare` s2) `thenCmp`
- (sp1 `compare` sp2)
+ -- Compares lexicographically, *not* by Unique of the string
+ compare (OccName sp1 s1) (OccName sp2 s2)
+ = (s1 `compare` s2) `thenCmp` (sp1 `compare` sp2)
\end{code}
extendOccEnvList :: OccEnv a -> [(OccName, a)] -> OccEnv a
lookupOccEnv :: OccEnv a -> OccName -> Maybe a
mkOccEnv :: [(OccName,a)] -> OccEnv a
+mkOccEnv_C :: (a -> a -> a) -> [(OccName,a)] -> OccEnv a
elemOccEnv :: OccName -> OccEnv a -> Bool
foldOccEnv :: (a -> b -> b) -> b -> OccEnv a -> b
occEnvElts :: OccEnv a -> [a]
extendOccEnv_C = addToUFM_C
mapOccEnv = mapUFM
+mkOccEnv_C comb l = addListToUFM_C comb emptyOccEnv l
+
type OccSet = UniqFM OccName
emptyOccSet :: OccSet
$w... workers
:T... compiler-generated tycons for dictionaries
:D... ...ditto data cons
+ :Co... ...ditto coercions
$sf.. specialised version of f
in encoded form these appear as Zdfxxx etc
mkSpecOcc = mk_simple_deriv varName "$s"
mkForeignExportOcc = mk_simple_deriv varName "$f"
mkNewTyCoOcc = mk_simple_deriv tcName ":Co"
-mkInstTyCoOcc = mk_simple_deriv tcName ":Co" -- derived from rep ty
+mkInstTyCoOcc = mk_simple_deriv tcName ":CoF" -- derived from rep ty
+mkEqPredCoOcc = mk_simple_deriv tcName "$co"
-- Generic derivable classes
mkGenOcc1 = mk_simple_deriv varName "$gfrom"
mkDataTOcc = mk_simple_deriv varName "$t"
mkDataCOcc = mk_simple_deriv varName "$c"
+-- Vectorisation
+mkVectOcc = mk_simple_deriv varName "$v_"
+mkVectTyConOcc = mk_simple_deriv tcName ":V_"
+mkVectDataConOcc = mk_simple_deriv dataName ":VD_"
+mkVectIsoOcc = mk_simple_deriv varName "$VI_"
+mkPArrayTyConOcc = mk_simple_deriv tcName ":VP_"
+mkPArrayDataConOcc = mk_simple_deriv dataName ":VPD_"
+mkPReprTyConOcc = mk_simple_deriv tcName ":VR_"
+mkPADFunOcc = mk_simple_deriv varName "$PA_"
+
mk_simple_deriv sp px occ = mk_deriv sp px (occNameString occ)
-- Data constructor workers are made by setting the name space