v2 / vlib / v / tests / structs / struct_array_generic_field_test.v
62 lines · 47 sloc · 830 bytes · e14bc6077ba0fc082dc2f37475baafd7999c49c2
Raw
1// callback types
2type CBnoret[T] = fn (val T)
3
4type CBnoret2[T] = fn (val T, prev T)
5
6type CBvret[T] = fn (val T) T
7
8type CBvret2[T] = fn (val T, prev T) T
9
10type Callback[T] = CBnoret[T] | CBnoret2[T] | CBvret[T] | CBvret2[T]
11
12interface IObv[T] {
13 v T
14 prev T
15 cb []Callback[T]
16}
17
18struct Obv[T] {
19mut:
20 v T
21 prev T
22 cb []Callback[T]
23}
24
25fn (o Obv[T]) get() T {
26 return o.v
27}
28
29fn (o Obv[T]) do_callbacks() T {
30 return o.v
31}
32
33fn (mut o Obv[T]) set(new_value T) T {
34 prev := o.v
35 if prev != new_value {
36 o.v = new_value
37 o.prev = prev
38 }
39
40 return o.v
41}
42
43fn oo2[T](init T) ?Obv[T] {
44 return none
45}
46
47fn oo[T](init T) Obv[T] {
48 return Obv[T]{
49 v: init
50 }
51}
52
53fn test_main() {
54 one := oo(1)
55 txt := oo('lala')
56
57 println('txt: ${txt.get()}')
58 println('one: ${one.get()}')
59
60 assert txt.get() == 'lala'
61 assert one.get() == 1
62}
63