/* Test various permutations of the => operator */
class converter {
    var v;
    public proc create(x) { v = x; }
    operator => (rhs) {
        var str = "cvt " ## (rhs => String);
        return new converter(str);
    }
    operator \=> (lhs) {
        var str = "cvt " ## (lhs => String);
        return new converter(str);
    }
    operator () (a) {
        return a => self;
    }
    public proc print() {
        say("v = ", v, "\n");
    }
}

proc main()
{
    var a = 1.5;
    var b;

    b = Int(a);
    say("b = ", b, "\n");

    a = converter(5); a.print();
    a = Float(a); a.print();
    a = converter(10); a.print();
    a = a(3); a.print();

    a = {1.2, 2.3, 3.4, 4.5};
    a = Int(a);
    say("a = ", a[0], " ", a[1], " ", a[2], " ", a[3], "\n");

    a = converter(15); a.print();
    a = a => {1,2,3}; // This is a case that call syntax can't handle
    a.print();
}