v2 / vlib / v / tests / generics / generic_selector_test.v
70 lines · 63 sloc · 1.21 KB · e86b526947718221093690cd05af88d230cacea5
Raw
1pub struct List[T] {
2mut:
3 head ?&Node[T]
4 size int
5}
6
7pub fn (mut l List[T]) prepend(mut node Node[T]) {
8 if head := l.head {
9 node.next = head
10 l.head = &node
11 l.size = l.size + 1
12 } else {
13 l.size = 1
14 l.head = &node
15 }
16}
17
18pub fn (mut l List[T]) append(mut node Node[T]) ?int {
19 if h := l.head {
20 _ := h
21 } else {
22 l.head = &node
23 l.size = 0
24 return l.size
25 }
26
27 mut curr_node := l.head
28 for {
29 if mut curr_node != none {
30 if next_node := curr_node.next {
31 curr_node = next_node
32 } else {
33 curr_node.next = &node
34 l.size = l.size + 1
35 break
36 }
37 }
38 }
39 return l.size
40}
41
42pub fn (mut l List[T]) find_last(node ?&Node[T]) ?&Node[T] {
43 if next := node?.next {
44 return l.find_last(next)
45 } else {
46 return node
47 }
48}
49
50@[heap]
51pub struct Node[T] {
52mut:
53 data T
54 next ?&Node[T]
55}
56
57fn test_main() {
58 mut list := List[string]{}
59 list.prepend(mut Node{ data: 'zero' })
60 list.prepend(mut Node{ data: 'first' })
61 list.append(mut Node{ data: 'last' }) or { panic('unable to append linked list') }
62 list.append(mut Node{ data: 'very last' }) or { panic('unable to append linked list') }
63
64 assert list.find_last(list.head)? == Node{
65 data: 'very last'
66 }
67 assert list.head?.next?.next?.next? == Node{
68 data: 'very last'
69 }
70}
71