<> <> <> <> <<>> DIRECTORY PS; PSArrayImpl: CEDAR PROGRAM IMPORTS PS ~ BEGIN OPEN PS; <> ArrayCreate: PUBLIC PROC [size: INT] RETURNS [Array] ~ { IF size<0 THEN ERROR Error[rangecheck]; IF size IN ArrayIndex THEN { ref: ArrayRef ~ NEW[ArrayRep[size]]; <> RETURN[[ val: [executable: FALSE, variant: array[access: unlimited, start: 0, length: size]], ref: ref ]]; } ELSE ERROR Error[limitcheck]; }; <> <> <<};>> <<>> <> <> <<};>> <<>> ArraySetAccess: PUBLIC PROC [array: Array, access: Access] RETURNS [Array] ~ { IF array.val.access> ArrayPutInterval: PUBLIC PROC [array: Array, index: INT, interval: Array] ~ { subarray: Array ~ ArrayGetInterval[array, index, ArrayLength[interval]]; FOR i: INT IN[0..ArrayLength[subarray]) DO ArrayPut[subarray, i, ArrayGet[interval, i]]; ENDLOOP; }; ArrayCopy: PUBLIC PROC [array1, array2: Array] RETURNS [Array] ~ { subarray2: Array ~ ArrayGetInterval[array2, 0, ArrayLength[array1]]; ArrayPutInterval[subarray2, 0, array1]; RETURN [subarray2]; }; ArrayForAll: PUBLIC PROC [array: Array, action: PROC [Any]] ~ { FOR index: INT IN [0..ArrayLength[array]) DO action[ArrayGet[array, index]]; ENDLOOP; }; END.