// concat.oad - test concatentation operator
using namespace oadl;

proc main()
{
    var a, b;

    "Scalar ## scalar\n";
    a = 1.0;
    b = 2.0;
    "", a ## b, '\n';

    "Array ## array\n";
    a = [3,4,5].iterate();
    b = [4,5].iterate() + 3*4*5;
    "", a ## b, '\n';

    "Array ## scalar (same type)\n";
    a = [1,2,3];
    b = 4;
    "", a ## b, '\n';

    "Scalar ## array (same type)\n";
    a = 1;
    b = [2,3,4];
    "", a ## b, '\n';

    "Array ## scalar (with promote)\n";
    a = [1,2,3];
    b = 4.0;
    "", a ## b, '\n';

    "Scalar ## array (with promote)\n";
    a = 1.0;
    b = [2,3,4];
    "", a ## b, '\n';

    "Array ## scalar (with convert-to-list)\n";
    a = [1,2,3];
    b = `+;
    "", a ## b, '\n';

    "Scalar ## array (with convert-to-list)\n";
    a = `+;
    b = [2,3,4];
    "", a ## b, '\n';

    "Array ## list\n";
    a = [1,2,3];
    b = {true, 5.0, 6};
    "", a ## b, '\n';

    "2d array + 1d array\n";
    a = [3,4].iterate();
    b = 4->iterate();
    "", a ## b, "\n\n";
    "", b ## a, '\n';
}