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