#import "modules/std.sx"; main :: () { n1 : s32 = 1; n2 : s32 = 2; n3 : s32 = 3; f1 := closure((x: s32) -> s32 => x + n1); f2 := closure((x: s32) -> s32 => x + n2); f3 := closure((x: s32) -> s32 => x + n3); print("f1: {}\n", f1(10)); print("f2: {}\n", f2(10)); print("f3: {}\n", f3(10)); // closure struct field Button :: struct { label: string; on_press: Closure(s32) -> void; } btn_val := 99; btn_cb := closure((id: s32) { print("btn: {} {}\n", id, btn_val); }); btn := Button.{ label = "OK", on_press = btn_cb }; btn.on_press(1); // optional closure f_none : ?Closure(s64) -> s64 = null; if f_none != null { print("should not print\n"); } else { print("opt-closure: none\n"); } // closure factory make_adder :: (n: s32) -> Closure(s32) -> s32 { closure((x: s32) -> s32 => x + n); } add5 := make_adder(5); add10 := make_adder(10); print("factory: {} {}\n", add5(100), add10(100)); // HOF compose compose :: (f: Closure(s32) -> s32, g: Closure(s32) -> s32) -> Closure(s32) -> s32 { closure((x: s32) -> s32 => f(g(x))); } double :: (x: s32) -> s32 { return x * 2; } cf := compose(add5, double); print("compose: {}\n", cf(10)); // closure with array sort_bubble :: (arr: [*]s32, cnt: s64, less: Closure(s32, s32) -> bool) { i : s64 = 0; while i < cnt { j : s64 = 0; while j < cnt - 1 { if less(arr[j + 1], arr[j]) { tmp := arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } j += 1; } i += 1; } } sort_arr : [5]s32 = .[5, 3, 1, 4, 2]; sort_bubble(xx @sort_arr, 5, closure((a: s32, b: s32) -> bool { return a < b; })); print("sort: {} {} {} {} {}\n", sort_arr[0], sort_arr[1], sort_arr[2], sort_arr[3], sort_arr[4]); // Many closures with string captures tag1 := "hello"; tag2 := "world"; sf1 := closure((x: s32) { print("sf1: {} {}\n", tag1, x); }); sf2 := closure((x: s32) { print("sf2: {} {}\n", tag2, x); }); sf1(1); sf2(2); print("=== DONE ===\n"); }