#import "modules/std.sx";

Point :: struct {
    x: i32;
    y: i32;
}

// Print all arguments — accepts any type, dispatches via type-switch
print_any :: (..args: []Any) {
    for args (it) {
        type := type_of(it);
        if type == {
            case int: out(int_to_string(cast(i32) it));
            case string: out(cast(string) it);
            case bool: out(bool_to_string(cast(bool) it));
            case float: out(float_to_string(cast(f64) it));
            case Point: {
                p := cast(Point) it;
                out("(");
                out(int_to_string(p.x));
                out(",");
                out(int_to_string(p.y));
                out(")");
            }
        }
        out(" ");
    }
    out("\n");
}

count :: (..args: []Any) -> i32 {
    args.len
}

main :: () -> i32 {
    print_any(42, "hello", true, 3.14);

    // Test with struct
    p := Point.{ x=10, y=20 };
    print_any("point:", p, 99);

    // Test count
    out(int_to_string(count(1, 2, 3)));
    out("\n");

    0
}
