v2 / vlib / v / tests / generics / generic_recursive_fn_test.v
46 lines · 42 sloc · 940 bytes · 6488041a749df9762348d019c4223908c476f2e2
Raw
1import strings
2
3fn myprintln[T](data T, mut str strings.Builder) T {
4 $if T is $array {
5 str.write_string('array: [')
6 for i, elem in data {
7 myprintln(elem, mut str)
8 if i < data.len - 1 {
9 str.write_string(', ')
10 }
11 }
12 str.write_string(']')
13 } $else $if T is $map {
14 str.write_string('map: {')
15 for key, val in data {
16 str.write_string('(key) ')
17 myprintln(key, mut str)
18 str.write_string(' -> (value) ')
19 myprintln(val, mut str)
20 }
21 str.write_string('}')
22 } $else {
23 str.write_string(data.str())
24 }
25 return data
26}
27
28struct Test {
29mut:
30 s strings.Builder
31}
32
33fn test_recursive_array() {
34 mut t := Test{}
35 myprintln([[1], [2], [3]], mut t.s)
36 assert t.s.str() == 'array: [array: [1], array: [2], array: [3]]'
37}
38
39fn test_recursive_map() {
40 mut t2 := Test{}
41 myprintln({
42 'a': [1, 2, 3]
43 'b': [1000]
44 }, mut t2.s)
45 assert t2.s.str() == 'map: {(key) a -> (value) array: [1, 2, 3](key) b -> (value) array: [1000]}'
46}
47