|
|
1.1 root 1: (* Copyright 1989 by AT&T Bell Laboratories *)
2: (* stampset.sml *)
3:
4: structure Stampset: STAMPSET =
5: struct
6:
7: type stamp = int
8: type stampset = {base: int, limit : int ref}
9: (* represents a set of stamps *)
10: type stampsets = {strStamps: stampset, tycStamps: stampset}
11: type 'a stampmap = 'a array * int
12: (* represents a finite mapping over a stampset to type 'a *)
13:
14: val nextbase = ref 0
15:
16: fun newStampset() : stampset =
17: (* generate a new stampset, guaranteed to be disjoint from any
18: existing stampset (unless a stampset has more than 10000 members!) *)
19: let val base = !nextbase
20: in nextbase := !nextbase + 10000;
21: {base = base, limit = ref(base)}
22: end
23:
24: fun newStampsets() : stampsets =
25: {strStamps = newStampset(), tycStamps = newStampset()}
26:
27: fun member(s: stamp, {base,limit as ref lim}: stampset) : bool =
28: (* tests membership in a stampset *)
29: base <= s andalso s < lim
30:
31: fun newStamp({limit,...}: stampset) : stamp =
32: (* generate a new member of the given stampset *)
33: !limit before inc limit
34:
35: fun newMap({base,limit}: stampset, default: '1a) : '1a stampmap =
36: (* generate a new stampmap over a given stampset with given default value *)
37: (array(!limit-base,default),base)
38:
39: fun updateMap((a,b): 'a stampmap) (s: stamp, x: 'a) : unit =
40: (* add mapping to a stampmap *)
41: update(a,s-b,x)
42:
43: fun applyMap((a,b): 'a stampmap, s: stamp) : 'a =
44: (* apply stampmap to a stamp *)
45: a sub (s-b)
46:
47: fun join({base,limit} : stampset, {base=base',limit=limit'}: stampset)
48: : stamp -> stamp =
49: (* join(A,B) produces a translation function for elements of B and
50: adds translated version of B to A, side-effecting A *)
51: let val limit0 = !limit
52: in limit := limit0 + (!limit' - base');
53: (fn s => (s - base') + limit0)
54: end
55:
56: val fixedStrStamps : stampset = newStampset()
57: val fixedTycStamps : stampset = newStampset()
58: val globalStamps : stampsets =
59: {strStamps = fixedStrStamps,
60: tycStamps = fixedTycStamps}
61:
62: val sigStamps : stampset = newStampset()
63:
64: fun strFixed(s : stamp) : bool = member(s,fixedStrStamps)
65: fun tycFixed(s : stamp) : bool = member(s,fixedTycStamps)
66:
67: end (* STAMPSET *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.