ajhc-0.8.0.1: lib/haskell-extras/Data/Unique.hs
{-# OPTIONS_JHC -fffi #-}
module Data.Unique (
-- * Unique objects
Unique(), -- instance (Eq, Ord)
newUnique, -- :: IO Unique
hashUnique -- :: Unique -> Int
) where
import Foreign.Storable
import Foreign.Ptr
-- | An abstract unique object. Objects of type 'Unique' may be
-- compared for equality and ordering and hashed into 'Int'.
newtype Unique = Unique Int deriving (Eq,Ord)
-- | Creates a new object of type 'Unique'. The value returned will
-- not compare equal to any other value of type 'Unique' returned by
-- previous calls to 'newUnique'. There is no limit on the number of
-- times 'newUnique' may be called.
newUnique :: IO Unique
newUnique = do
n <- peek c_data_unique
poke c_data_unique (n + 1)
return $ Unique n
-- | Hashes a 'Unique' into an 'Int'. Two 'Unique's may hash to the
-- same value, although in practice this is unlikely. The 'Int'
-- returned makes a good hash key.
hashUnique :: Unique -> Int
hashUnique (Unique u) = u
instance Show Unique where
showsPrec p (Unique n) = showsPrec p n
foreign import ccall "&jhc_data_unique" c_data_unique :: Ptr Int