Annotation of researchv10no/cmd/sml/src/util/dynamic.sml, revision 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.