#import "modules/std.sx";

add :: (a: i32, b: i32) -> i32 { a + b }
mul :: (a: i32, b: i32) -> i32 { a * b }

apply :: (f: (i32, i32) -> i32, x: i32, y: i32) -> i32 {
    f(x, y)
}

main :: () {
    // Store function in variable
    fp : (i32, i32) -> i32 = add;
    print("fp(3,4) = {}\n", fp(3, 4));

    // Reassign to different function
    fp = mul;
    print("fp(3,4) = {}\n", fp(3, 4));

    // Pass function pointer as argument
    print("apply(add,5,6) = {}\n", apply(add, 5, 6));
    print("apply(mul,5,6) = {}\n", apply(mul, 5, 6));
}

// ** stdout **
//fp(3,4) = 7
//fp(3,4) = 12
//apply(add,5,6) = 11
//apply(mul,5,6) = 30
