// Show the reason for the universal array type, Array[*]
proc main()
{
using oadl::typecheck;
// Start with three arrays
var aList = {"one", "two", "three"}; // A List
var aArr = aList.reshape(2,3); // An Array
var aPak = [2,3].iterate(); // A PackInt array
// aList is, in fact, a List
if (typecheck(List, aList)) { "No error - OK #1\n"; }
// aList is *not* a multidimensional Array
try { typecheck(Array, aList); } catch (e) { "", e, " OK #2\n"; }
// aArr is not a List
try { typecheck(List, aArr); } catch (e) { "", e, " OK #3\n"; }
// aArr is a multidimensional Array
if (typecheck(Array, aArr)) { "No error - OK #4\n"; }
// aPak *is* a PackInt
if (typecheck(PackInt, aPak)) { "No error - OK #5\n"; }
// However, aPak is not a heterogeneous Array
try { typecheck(Array, aPak); } catch (e) { "", e, " OK #6\n"; }
// There is, therefore, a type difference, between a heterogeneous
// multidimensional Array and a heterogeneous single-dimensional
// List. There is also a type deference between a heterogeneous
// multidimensional Array and a homogeneous multi-dimensionsal
// packed PackInt array. The universal array type, Array[*],
// encompasses all of these types, as shown below.
// aPak is also a generic, universal Array
if (typecheck(Array[*], aPak)) { "No error - OK #7\n"; }
// So is aList
if (typecheck(Array[*], aList)) { "No error - OK #8\n"; }
// And so is aArr
if (typecheck(Array[*], aArr)) { "No error - OK #9\n"; }
}