aboutsummaryrefslogtreecommitdiff
path: root/html-test/tests/Hash.hs
diff options
context:
space:
mode:
authorSimon Hengel <sol@typeful.net>2012-10-15 10:34:28 +0200
committerSimon Hengel <sol@typeful.net>2012-10-15 15:46:18 +0200
commit958d64d77572c47d249965d7146ac17a23de806d (patch)
treeb3cf49a9c6202b50d618df9270e24d28f5ecae50 /html-test/tests/Hash.hs
parent943c5b7880cbfa8c90a0776dd539ae1e89f46d35 (diff)
Move HTML tests to directory /html-test/
Diffstat (limited to 'html-test/tests/Hash.hs')
-rw-r--r--html-test/tests/Hash.hs51
1 files changed, 51 insertions, 0 deletions
diff --git a/html-test/tests/Hash.hs b/html-test/tests/Hash.hs
new file mode 100644
index 00000000..343b69e9
--- /dev/null
+++ b/html-test/tests/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