Monomorphic array operations.
The MONO_ARRAY signature is a generic interface to monomorphic arrays, mutable sequences with constant-time access and update. Monomorphic arrays allow more compact representations than the analogous polymorphic arrays over the same element type. Arrays have a special equality property: two arrays are equal if they are the same array, i.e., created by the same call to a primitive array constructor such as array, fromList, etc.; otherwise they are not equal. This also holds for arrays of zero length.structure CharArray : MONO_ARRAY structure Word8Array : MONO_ARRAY
signature MONO_ARRAY =
sig
eqtype array
type elem
type vector
val maxLen : int
val array : int * elem -> array
val fromList : elem list -> array
val tabulate : int * (int -> elem) -> array
val length : array -> int
val sub : array * int -> elem
val update : array * int * elem -> unit
val vector : array -> vector
val copy : {src : array, dst : array, di : int} -> unit
val copyVec : {src : vector, dst : array, di : int} -> unit
val appi : (int * elem -> unit) -> array -> unit
val app : (elem -> unit) -> array -> unit
val modifyi : (int * elem -> elem) -> array -> unit
val modify : (elem -> elem) -> array -> unit
val foldli : (int * elem * 'b -> 'b) -> 'b -> array -> 'b
val foldri : (int * elem * 'b -> 'b) -> 'b -> array -> 'b
val foldl : (elem * 'b -> 'b) -> 'b -> array -> 'b
val foldr : (elem * 'b -> 'b) -> 'b -> array -> 'b
val findi : (int * elem -> bool) -> array -> (int * elem) option
val find : (elem -> bool) -> array -> elem option
val exists : (elem -> bool) -> array -> bool
val all : (elem -> bool) -> array -> bool
val collate : (elem * elem -> order) -> array * array -> order
end
fun foldli f init seq = let
val len = length seq
fun loop (i, b) =
if i = len then b
else loop(i+1,f(i,sub(seq,i),b))
in
loop(0,init)
fun foldri f init seq = let
val len = length seq
fun loop (i, b) =
if i = ~1 then b
else loop(i-1,f(i,sub(seq,i),b))
in
loop(len-1,init)
The expression foldl f init arr is equivalent to
foldli (fn (_, a, x) => f(a, x)) init arr
The analogous equivalences hold for foldri and foldr.