fn get_int() int {
	return 42
}

fn dub_int(i int) int {
	return i * 2
}

struct Fun[F] {
mut:
	call F
}

type FunZero = fn () int

fn main() {
	fun0 := Fun[FunZero]{
		call: get_int
	}
	println(fun0.call())
	println(fun0.call(1234))
	println(fun0.call(1234, 5678))

	fun1 := Fun[fn (int) int]{
		call: dub_int
	}

	println(fun1.call(42))
	println(fun1.call())
	println(fun1.call(42, 43))

	println(fun1.call(true))
	println(fun1.call('text'))
	println(fun1.call(22.2))
}
