// Function pointer types: func(T) -> U
import Std::Io::{PrintLine, PrintInt};
import Std::Test::{Test_AssertEqInt, Test_Pass};

func Apply(f: func(int) -> int, x: int) -> int {
    return f(x);
}

func Double(n: int) -> int {
    return n * 2;
}

func Inc(n: int) -> int {
    return n + 1;
}

func Main() -> int {
    let g: func(int) -> int = Double;
    Test_AssertEqInt(Apply(g, 21), 42);
    Test_AssertEqInt(Apply(Double, 7), 14);
    Test_AssertEqInt(Apply(Inc, 99), 100);

    PrintInt(Apply(Double, 5));
    PrintLine("");
    Test_Pass("func_ptr");
    return 0;
}
