|
|
1.1 root 1: (* Copyright 1989 by AT&T Bell Laboratories *)
2: signature STATIC_ARRAY = sig type array
3: exception Subscript
4: type elem
5: val array : int * elem -> array
6: val sub : array * int -> elem
7: val update : (array * int * elem) -> unit
8: val length : array -> int
9: end
10:
11: signature DYNAMIC_ARRAY = sig type array
12: exception Subscript
13: type elem
14: val array : elem -> array
15: val sub : array * int -> elem
16: val update : (array * int * elem) -> unit
17: end
18:
19: functor Dynamic( A : STATIC_ARRAY ) : DYNAMIC_ARRAY =
20: struct
21: type array = {default: A.elem, arr: A.array ref}
22: type elem = A.elem
23: exception Subscript
24: fun array e = {default=e, arr= ref(A.array(0,e))};
25: fun {default, arr as ref a} sub i =
26: A.sub(a,i)
27: handle A.Subscript =>
28: if i < 0 then raise Subscript
29: else default
30: fun update ({default,arr as ref a}, i, e) =
31: A.update(a,i,e)
32: handle A.Subscript =>
33: if i<0 then raise Subscript
34: else
35: let val size = A.length a
36: val newsize = i + size + 1
37: val a2 = A.array(newsize, default)
38: fun copy j = (A.update(a2,j,A.sub(a,j)); copy(j-1))
39: in (copy (size - 1) handle A.Subscript => ());
40: arr := a2;
41: A.update(a2,i,e)
42: end
43:
44: end
45:
46:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.