v2 / vlib / v / tests / generics / generics_with_anon_generics_fn_test.v
57 lines · 48 sloc · 896 bytes · 6488041a749df9762348d019c4223908c476f2e2
Raw
1struct MyStruct[T] {
2 arr []T
3}
4
5fn (mut s MyStruct[T]) get_data(pos int) T {
6 return s.arr[pos]
7}
8
9fn (mut s MyStruct[T]) iterate(handler fn (T) int) int {
10 mut sum := 0
11 mut i := 0
12 for {
13 k := s.get_data[T](i)
14 sum += handler(k)
15 i++
16 if i > 4 {
17 break
18 }
19 }
20 return sum
21}
22
23pub fn consume(data int) int {
24 return data
25}
26
27pub fn consume_str(data string) string {
28 return data
29}
30
31fn call[T](f fn (T) T, v T) T {
32 return f(v)
33}
34
35struct Pair[T, U] {
36 a T
37 b U
38}
39
40fn test_generics_with_anon_generics_fn() {
41 mut s := MyStruct[int]{
42 arr: [1, 2, 3, 4, 5]
43 }
44 y := s.iterate[int](consume)
45 println(y)
46 assert y == 15
47
48 assert call[int](consume, 1) == 1
49 assert call[string](consume_str, '1') == '1'
50 assert call(consume, 1) == 1
51 assert call(consume_str, '1') == '1'
52
53 pair := Pair[int, string]{1, 's'}
54 assert call(fn (v Pair[int, string]) Pair[int, string] {
55 return v
56 }, pair) == pair
57}
58