(* Array2 -- SML Basis Library *) eqtype 'a array datatype traversal = RowMajor | ColMajor val array : int * int * '_a -> '_a array val fromList : '_a list list -> '_a array val tabulate : traversal -> int * int * (int * int -> '_a) -> '_a array val dimensions : 'a array -> int * int val nCols : 'a array -> int val nRows : 'a array -> int val sub : 'a array * int * int -> 'a val update : 'a array * int * int * 'a -> unit val row : 'a array * int -> 'a Vector.vector val column : 'a array * int -> 'a Vector.vector type 'a region = { base : 'a array, row : int, col : int, nrows : int option, ncols : int option} val copy : { src : 'a region, dst : 'a array, dst_row : int, dst_col : int } -> unit val app : traversal -> ('a -> unit) -> 'a array -> unit val modify : traversal -> ('a -> 'a) -> 'a array -> unit val fold : traversal -> ('a * 'b -> 'b) -> 'b -> 'a array -> 'b val appi : traversal -> (int * int * 'a -> unit) -> 'a region -> unit val modifyi : traversal -> (int * int * 'a -> 'a) -> 'a region -> unit val foldi : traversal -> (int * int * 'a * 'b -> 'b) -> 'b -> 'a region -> 'b (* ['ty array] is the type of two-dimensional, mutable, zero-based constant-time-access arrays with elements of type 'ty. Type 'ty array admits equality even if 'ty does not. Arrays a1 and a2 are equal if both were created by the same call to one of the primitives array, fromList, and tabulate. [traversal] is the type of traversal orders: row major or column major. [RowMajor] specifies that an operation must be done in row-major order, that is, one row at a time, from top to bottom, and from left to right within each row. Row-major traversal visits the elements of an (m,n)-array with m rows and n columns in this order: (0,0), (0,1), (0,2), ..., (0,n-1), (1,0), (1,1), (1,2), ..., (1,n-1), ... that is, in order of lexicographically increasing (i, j). In Moscow ML, row-major traversal is usually faster than column-major traversal. [ColMajor] specifies that an operation must be done in column-major order, that is, one column at a time, from left to right, and from top to bottom within each column. Column-major traversal visits the elements of an (m,n)-array with m rows and n columns in this order: (0,0), (1,0), (2,0), ..., (m-1,0), (0,1), (1,1), (2,1), ..., (m-1,1), ... that is, in order of lexicographically increasing (j, i). [array(m, n, x)] returns a new m * n matrix whose elements are all x. Raises Size if n<0 or m<0. [fromList xss] returns a new array whose first row has elements xs1, second row has elements xs2, ..., where xss = [xs1,xs2,...,xsm]. Raises Size if the lists in xss do not all have the same length. [tabulate RowMajor (m, n, f)] returns a new m-by-n array whose elements are f(0,0), f(0,1), ..., f(0, n-1), f(1,0), f(1,1), ..., f(1, n-1), ... f(m-1,0), ..., f(m-1, n-1) created in row-major order: f(0,0), f(0,1), ..., f(1,0), f(1,1), ... Raises Size if n<0 or m<0. [tabulate ColMajor (m, n, f)] returns a new m-by-n array whose elements are as above, but created in the column-major order: f(0,0), f(1,0), ..., f(0, 1), f(1, 1), ... Raises Size if n<0 or m<0. [dimensions a] returns the dimensions (m, n) of a, where m is the number of rows and n the number of columns. [nCols a] returns the number of n of columns of a. [nRows a] returns the number of m of rows of a. [sub(a, i, j)] returns the i'th row's j'th element, counting from 0. Raises Subscript if i<0 or j<0 or i>=m or j>=n where (m,n) = dimensions a. [update(a, i, j, x)] destructively replaces the (i,j)'th element of a by x. Raises Subscript if i<0 or j<0 or i>=m or j>=n where (m,n) = dimensions a. [row (a, i)] returns a vector containing the elements of the ith row of a. Raises Subscript if i < 0 or i >= height a. [column (a, j)] returns a vector containing the elements of the jth column of a. Raises Subscript if j < 0 or j >= width a. [app RowMajor f a] applies f to the elements a[0,0], a[0,1], ..., a[0,n-1], a[1,0], ..., a[m-1, n-1] of a, where (m, n) = dimensions a. [app ColMajor f a] applies f to the elements a[0,0], a[1,0], ..., a[n-1,0], a[0,1], a[1,1], ..., a[m-1, n-1] of a, where (m, n) = dimensions a. [modify RowMajor f a] applies f to the elements a[0,0], a[0,1], ..., a[0,n-1], a[1,0], ..., a[m-1, n-1] of a, updating each element with the result of the application, where (m, n) = dimensions a. [modify ColMajor f a] applies f to the elements a[0,0], a[1,0], ..., a[n-1,0], a[0,1], a[1,1], ..., a[m-1, n-1] of a, updating each element with the result of the application, where (m, n) = dimensions a. [fold RowMajor f b a] folds f left-right and top-down over the elements of a in row-major order. That is, computes f(a[m-1, n-1], f(a[m-1, n-2], ..., f(a[0,1], f(a[0,0], b)) ...)) where (m, n) = dimensions a. [fold ColMajor f b a] folds f left-right and top-down over the elements of a in column-major order. That is, computes f(a[m-1, n-1], f(a[m-2, n-1], ..., f(a[1,0], f(a[0,0], b)) ...)) where (m, n) = dimensions a. The following iterators generalize the above ones in two ways: * the indexes i and j are also being passed to the function; * the iterators work on a region (submatrix) of a matrix. [region] is the type of records { base, row, col, nrows, ncols } determining the region or submatrix of array base whose upper left corner has index (row, col). If nrows = SOME r, then the region has r rows: row, row+1, ..., row+r-1. If nrows = NONE, then the region extends to the bottom of the matrix. The field ncols similarly determines the number of columns. A region is valid for an array with dimensions (m, n) if (1) either nrows = NONE and 0 <= row <= m or nrows = SOME r and 0 <= row <= row + r <= m and (2) either ncols = NONE and 0 <= col <= n or ncols = SOME c and 0 <= col <= col + c <= n. [appi RowMajor f reg] applies f to (i, j, a[i, j]) in order of lexicographically increasing (i, j) within the region reg. Raises Subscript if reg is not valid. Note that app tr f a is equivalent to appi tr (f o #3) {base=a, row=0, col=0, nrows=NONE, ncols=NONE} [appi ColMajor f reg] applies f to (i, j, a[i, j]) in order of lexicographically increasing (j, i) within the region reg. Raises Subscript if reg is not valid. [modifyi RowMajor f reg)] applies f to (i, j, a[i, j]) in order of lexicographically increasing (i, j) within the region reg. Raises Subscript if reg is not valid. Note that modify tr f a is equivalent to modifyi (f o #3) {base=a, row=0, col=0, nrows=NONE, ncols=NONE}). [modifyi ColMajor f reg)] applies f to (i, j, a[i, j]) in order of lexicographically increasing (j, i) within the region reg. Raises Subscript if reg is not valid. [foldi RowMajor f b a] folds f over (i, j, a[i, j]) in row-major order within the region reg, that is, for lexicographically increasing (i, j) in the region. Raises Subscript if reg is not valid. [foldi ColMajor f b a] folds f over (i, j, a[i, j]) in column-major order within the region reg, that is, for lexicographically increasing (j, i) in the region. Raises Subscript if reg is not valid. [copy { src, dst, dst_row, dst_col }] copies the region determined by src to array dst such that the upper leftmost corner of src is copied to dst[dst_row, dst_col]. Works correctly even when src and dst are the same and the source and destination regions overlap. Raises Subscript if the src region is invalid, or if src translated to (dst_row, dst_col) is invalid for dst. *)