aboutsummaryrefslogtreecommitdiff
path: root/html-test/src/Hash.hs
diff options
context:
space:
mode:
authorSimon Hengel <sol@typeful.net>2012-10-15 20:32:03 +0200
committerSimon Hengel <sol@typeful.net>2012-10-15 20:49:39 +0200
commit7e1fed4da8bb913d25f447afd1f1e485d428e37f (patch)
tree179a79201d11df7b27583f083d884753b1ee82e4 /html-test/src/Hash.hs
parenta4fb9cb0a44101d858d69281a3ee0aa0dbf7ddda (diff)
Move source files for HTML tests to html-test/src
Diffstat (limited to 'html-test/src/Hash.hs')
-rw-r--r--html-test/src/Hash.hs51
1 files changed, 51 insertions, 0 deletions
diff --git a/html-test/src/Hash.hs b/html-test/src/Hash.hs
new file mode 100644
index 00000000..343b69e9
--- /dev/null
+++ b/html-test/src/Hash.hs
@@ -0,0 +1,51 @@
+{- |
+ Implementation of fixed-size hash tables, with a type
+ class for constructing hash values for structured types.
+-}
+module Hash (
+ -- * The @HashTable@ type
+ HashTable,
+
+ -- ** Operations on @HashTable@s
+ new, insert, lookup,
+
+ -- * The @Hash@ class
+ Hash(..),
+ ) where
+
+import Data.Array
+import Prelude hiding (lookup)
+
+-- | A hash table with keys of type @key@ and values of type @val@.
+-- The type @key@ should be an instance of 'Eq'.
+data HashTable key val = HashTable Int (Array Int [(key,val)])
+
+-- | Builds a new hash table with a given size
+new :: (Eq key, Hash key) => Int -> IO (HashTable key val)
+new = undefined
+
+-- | Inserts a new element into the hash table
+insert :: (Eq key, Hash key) => key -> val -> IO ()
+insert = undefined
+
+-- | Looks up a key in the hash table, returns @'Just' val@ if the key
+-- was found, or 'Nothing' otherwise.
+lookup :: Hash key => key -> IO (Maybe val)
+lookup = undefined
+
+-- | A class of types which can be hashed.
+class Hash a where
+ -- | hashes the value of type @a@ into an 'Int'
+ hash :: a -> Int
+
+instance Hash Int where
+ hash = id
+
+instance Hash Float where
+ hash = trunc
+
+instance (Hash a, Hash b) => Hash (a,b) where
+ hash (a,b) = hash a `xor` hash b
+
+trunc = undefined
+xor = undefined