X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Data%2FHashTable.hs;h=9fbe7353c19ca0362e6bcee0b7f93fe8b1a72f19;hb=b8ac498face4c8b16c06d30fbc86666b7dc28173;hp=8c88f15b9a033e61374859845f7a59029bad7f32;hpb=e1399bdcde01f55824973b556f60eecbe4dc2250;p=ghc-base.git diff --git a/Data/HashTable.hs b/Data/HashTable.hs index 8c88f15..9fbe735 100644 --- a/Data/HashTable.hs +++ b/Data/HashTable.hs @@ -33,25 +33,42 @@ module Data.HashTable ( -- This module is imported by Data.Dynamic, which is pretty low down in the -- module hierarchy, so don't import "high-level" modules +#ifdef __GLASGOW_HASKELL__ import GHC.Base +#else +import Prelude hiding ( lookup ) +#endif import Data.Tuple ( fst ) import Data.Bits import Data.Maybe import Data.List ( maximumBy, filter, length, concat ) +import Data.Int ( Int32 ) +#if defined(__GLASGOW_HASKELL__) import GHC.Num -import GHC.Int ( Int32 ) import GHC.Real ( Integral(..), fromIntegral ) -import GHC.IOBase ( IO, IOArray, newIOArray, readIOArray, writeIOArray, unsafeReadIOArray, unsafeWriteIOArray, +import GHC.IOBase ( IO, IOArray, newIOArray, readIOArray, writeIOArray, + unsafeReadIOArray, unsafeWriteIOArray, IORef, newIORef, readIORef, writeIORef ) import GHC.Err ( undefined ) +#else +import Data.Char ( ord ) +import Data.IORef ( IORef, newIORef, readIORef, writeIORef ) +# if defined(__HUGS__) +import Hugs.IOArray ( IOArray, newIOArray, readIOArray, writeIOArray, + unsafeReadIOArray, unsafeWriteIOArray ) +# elif defined(__NHC__) +import NHC.IOExtras ( IOArray, newIOArray, readIOArray, writeIOArray) +# endif +#endif import Control.Monad ( when, mapM, sequence_ ) + ----------------------------------------------------------------------- myReadArray :: IOArray Int32 a -> Int32 -> IO a myWriteArray :: IOArray Int32 a -> Int32 -> a -> IO () -#ifdef DEBUG +#if defined(DEBUG) || defined(__NHC__) myReadArray = readIOArray myWriteArray = writeIOArray #else @@ -140,7 +157,8 @@ hashString = fromIntegral . foldr f 0 where f c m = ord c + (m * 128) `rem` fromIntegral prime -- | A prime larger than the maximum hash table size -prime = 1500007 :: Int32 +prime :: Int32 +prime = 1500007 -- ----------------------------------------------------------------------------- -- Parameters @@ -157,10 +175,14 @@ hLOAD = 4 :: Int32 -- Maximum average load of a single hash bucket -- ----------------------------------------------------------------------------- -- Creating a new hash table --- | Creates a new hash table +-- | Creates a new hash table. The following property should hold for the @eq@ +-- and @hash@ functions passed to 'new': +-- +-- > eq A B => hash A == hash B +-- new - :: (key -> key -> Bool) -- ^ An equality comparison on keys - -> (key -> Int32) -- ^ A hash function on keys + :: (key -> key -> Bool) -- ^ @eq@: An equality comparison on keys + -> (key -> Int32) -- ^ @hash@: A hash function on keys -> IO (HashTable key val) -- ^ Returns: an empty hash table new cmp hash_fn = do