--<mkdependHS:friends> UniqSupply
module Unique (
- Unique,
+ Unique, Uniquable(..),
u2i, -- hack: used in UniqFM
pprUnique, pprUnique10, showUnique,
mkUniqueGrimily, -- Used in UniqSupply only!
incrUnique, -- Used for renumbering
- initRenumberingUniques,
+ initTyVarUnique, mkTyVarUnique,
+ initTidyUniques,
-- now all the built-in Uniques (and functions to make them)
-- [the Oh-So-Wonderful Haskell module system wins again...]
#else
import GlaExts
import ST
-#if __GLASGOW_HASKELL__ == 202
-import PrelBase ( Char(..) )
-#endif
+import PrelBase ( Char(..), chr, ord )
#endif
IMP_Ubiq(){-uitous-}
-#if __GLASGOW_HASKELL__ >= 202
-import {-# SOURCE #-} UniqFM ( Uniquable(..) )
-#endif
-
import Outputable
import Pretty
import Util
Fast comparison is everything on @Uniques@:
\begin{code}
-u2i :: Unique -> FAST_INT
-
data Unique = MkUnique Int#
+
+class Uniquable a where
+ uniqueOf :: a -> Unique
+\end{code}
+
+\begin{code}
+u2i :: Unique -> FAST_INT
u2i (MkUnique i) = i
\end{code}
= case unpkUnique uniq of
(tag, u) -> finish_ppr tag u (int u)
-finish_ppr tag u pp_u
- = if tag /= 't' -- this is just to make v common tyvars, t1, t2, ...
- -- come out as a, b, ... (shorter, easier to read)
- then pp_all
- else case u of
- 1 -> char 'a'
- 2 -> char 'b'
- 3 -> char 'c'
- 4 -> char 'd'
- 5 -> char 'e'
- _ -> pp_all
- where
- pp_all = (<>) (char tag) pp_u
+finish_ppr 't' u pp_u | u < 26
+ = -- Special case to make v common tyvars, t1, t2, ...
+ -- come out as a, b, ... (shorter, easier to read)
+ char (chr (ord 'a' + u))
+finish_ppr tag u pp_u = char tag <> pp_u
-showUnique :: Unique -> FAST_STRING
-showUnique uniq = _PK_ (show (pprUnique uniq))
+showUnique :: Unique -> String
+showUnique uniq = show (pprUnique uniq)
instance Outputable Unique where
ppr sty u = pprUnique u
instance Text Unique where
- showsPrec p uniq rest = _UNPK_ (showUnique uniq)
+ showsPrec p uniq rest = showUnique uniq
\end{code}
%************************************************************************
mkPrimOpIdUnique op = mkUnique '7' op
mkPreludeMiscIdUnique i = mkUnique '8' i
-initRenumberingUniques = (mkUnique 'v' 1, mkUnique 't' 1, mkUnique 'u' 1)
+-- The "tyvar uniques" print specially nicely: a, b, c, etc.
+-- See pprUnique for details
+
+initTyVarUnique :: Unique
+initTyVarUnique = mkUnique 't' 0
+
+mkTyVarUnique :: Int -> Unique
+mkTyVarUnique n = mkUnique 't' n
+
+initTidyUniques :: (Unique, Unique) -- Global and local
+initTidyUniques = (mkUnique 'g' 0, mkUnique 'x' 0)
mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3,
mkBuiltinUnique :: Int -> Unique