/* Test vector indexing based on overloading [] and [=] */
class vector {
    var arr;
    public proc create(n) {
        arr = new Array(n);
    }
    public operator [] (idx) {
        var res;
        if (idx.isarray()) {
            res = new Array(idx.length());
            forall (idx[i]) {
                res[i] = arr[idx[i]];
            }
            return res;
        }
        else {
            return arr[idx];
        }
    }
    public operator [=] (idx,val) {
        if (idx.isarray()) {
            if (val.isarray()) {
                if (val.length() != idx.length()) {
                    throw oadl::RangeCheck;
                }
                forall (idx[i]) {
                    arr[idx[i]] = val[i];
                }
            }
            else {
                forall (idx[i]) {
                    arr[idx[i]] = val;
                }
            }
        }
        else {
            arr[idx] = val;
        }
    }
}

proc main()
{
    var a, b;
    a = new vector(10);
    a[{1,2,3,4,5}] = 4;
    a[{4,5}] = {4,5};
    b = a[{2,3,4,5}];
    say("length(b) = ", b.length(), "\n");
    say("b[0] = ", b[0], "\n");
    say("b[1] = ", b[1], "\n");
    say("b[2] = ", b[2], "\n");
    say("b[3] = ", b[3], "\n");
}