{-# 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