// Demonstrate array/object precedence in arithmetic expressions.
// Prints "hello, world"

class str {
    var sVal;

    public proc create(a) {
        sVal = a;
    }

    public proc set(a) {
        sVal = a;
    }

    public proc get() {
        return sVal;
    }

    operator + (rhs) {
        var rightStr;

        switch (?? rhs) {
        case String :
            rightStr = rhs;
        case Object :
            if (!(rhs ?= str)) throw oadl::TypeCheck;
            rightStr = rhs.get();
        default :
            throw oadl::TypeCheck;
        }

        return new str(sVal ## rightStr);
    }
    operator \+ (lhs) {
        var leftStr;

        switch (?? lhs) {
        case String :
            leftStr = lhs;
        case Object :
            if (!(lhs ?= str)) throw oadl::TypeCheck;
            leftStr = lhs.get();
        default :
            throw oadl::TypeCheck;
        }

        return new str(leftStr ## sVal);
    }
}

proc main()
{
    var a;
    var b;

    a = new str("hello ") {};
    b = a + "world";
    "", b.get(), "\n";
}