type Fn[T] = fn (T)

type FnReturn[T, R] = fn (T) R

fn func_fn_concrete() Fn[string] {
	return fn (_s string) {}
}

fn func_fn_dynamic[T]() Fn[T] {
	return fn [T](_t T) {}
}

fn func_fn_return_dynamic[T, R]() FnReturn[T, R] {
	return fn [T, R](t T) R {
		return t.int()
	}
}

fn main() {
	func_fn_concrete()('V')
	func_fn_dynamic[string]()('V')

	assert func_fn_return_dynamic[string, int]()('100') == 100
}
