Annotation of researchv10no/cmd/sml/src/util/dynamic.sml, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.