/* Test various multidimensional array features */
using namespace oadl;

proc arrsay(a)
{
    var shp, rnk, idx;
    var ia;
    var i, j, sz;
    
    shp = a.shape();
    rnk = a.rank();
    idx = new PackInt(rnk);

    sz = 1;
    forall(shp[ii]) {
        sz *= shp[ii];
    }
    forall(idx[ii]) {
        idx[ii] = 0;
    }

    for (i = 0; i < sz; i++) {
        ia = a;
        for (j = 0; j < rnk; j++) {
            ia = ia[idx[j]];
        }

        if (idx[rnk-1] > 0) " ";
        say(ia);

        // Increment the array
        for (j = rnk-1; j >= 0; j--) {
            idx[j]++;
            if (idx[j] < shp[j]) break;
            if (i < (sz-1)) "\n";
            idx[j] = 0;
        }
    }
    "\n";
}

proc main()
{
    var a;

    a = [2,3,5].iterate();

    "a = iterate(2,3,5):\n";
    arrsay(a);

    "\na[0:1,1:2,2:3]:\n";
    arrsay(a.subr(0,1,1,2,2,3));

    "\nreshape(a,3,3,4):\n";
    arrsay(a.reshape(3,3,4));
}