|
|
1.1 root 1: (* stringmap.sml *)
2:
3: signature STRINGMAP =
4: sig type 'a stringmap
5: exception Stringmap
6: val new : unit -> '1a stringmap
7: val add : 'a stringmap -> string * 'a -> unit
8: val rem : 'a stringmap -> string -> unit
9: val map : 'a stringmap -> string -> 'a
10: val app : (string * 'a -> unit) -> 'a stringmap -> unit
11: end
12:
13: structure Stringmap : STRINGMAP =
14: struct
15: type 'a stringmap = (string * 'a) list array
16: exception Stringmap
17: val hashFactor = 5
18: and tableSize = 211
19:
20: (* a string hashing function
21: returns a number between 0 and tableSize-1 *)
22: fun hash(str: string) : int =
23: let val i = ref 0
24: and n = ref 0
25: and nchars = String.length str
26: in while !i < nchars do
27: (n := (hashFactor * !n + ordof(str, !i)) mod tableSize;
28: i := !i + 1);
29: !n
30: end
31:
32: (* create a new stringmap *)
33: fun new (): '1a stringmap = array(tableSize,nil)
34:
35: (* add a mapping pair s +-> x to the stringmap a *)
36: fun add a (s,x) =
37: let val index = hash s
38: in update(a,index,(s,x)::(a sub index))
39: end
40:
41: (* apply the stringmap a to the index string s *)
42: fun map a s =
43: let fun find ((s',x)::r) = if s=s' then x else find r
44: | find nil = raise Stringmap
45: in find (a sub (hash s))
46: end
47:
48: (* remove all pairs mapping string s from stringmap a *)
49: fun rem a s = let fun f ((b as (s',j))::r) =
50: if s=s' then f r else b :: f r
51: | f nil = nil
52: val index = hash s
53: in update(a,index, f(a sub index))
54: end
55:
56: (* apply a function f to all mapping pairs in stringmap a *)
57: fun app (f: string * 'a -> unit) a =
58: let fun zap 0 = ()
59: | zap n = let val m = n-1 in List.app f (a sub m); zap m end
60: in zap tableSize
61: end
62:
63: end (* Stringmap *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.