#import "modules/std.sx";

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

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

main :: () {
    // Store function in variable
    fp : (s32, s32) -> s32 = 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
