50 lines
		
	
	
		
			768 B
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			768 B
		
	
	
	
		
			V
		
	
	
import sync
 | 
						|
 | 
						|
struct Counter {
 | 
						|
pub mut:
 | 
						|
	i int
 | 
						|
}
 | 
						|
 | 
						|
fn (mut c Counter) add(i int) {
 | 
						|
	c.i = c.i + i
 | 
						|
}
 | 
						|
 | 
						|
fn run(mut m sync.ManyTimes, mut co Counter, c chan bool) {
 | 
						|
	m.do(fn [mut co] () {
 | 
						|
		co.add(5)
 | 
						|
	})
 | 
						|
	c <- true
 | 
						|
}
 | 
						|
 | 
						|
fn test_many_times_once() {
 | 
						|
	mut co := &Counter{}
 | 
						|
	mut m := sync.new_many_times(1)
 | 
						|
	c := chan bool{}
 | 
						|
	n := 10
 | 
						|
 | 
						|
	// It is executed 10 times, but only once actually.
 | 
						|
	for i := 0; i < n; i++ {
 | 
						|
		go run(mut m, mut co, c)
 | 
						|
	}
 | 
						|
	for i := 0; i < n; i++ {
 | 
						|
		<-c
 | 
						|
	}
 | 
						|
	assert co.i == 5
 | 
						|
}
 | 
						|
 | 
						|
fn test_many_times_fifth() {
 | 
						|
	mut co := &Counter{}
 | 
						|
	mut m := sync.new_many_times(5)
 | 
						|
	c := chan bool{}
 | 
						|
	n := 10
 | 
						|
 | 
						|
	// It is executed 10 times, but only 5 times actually.
 | 
						|
	for i := 0; i < n; i++ {
 | 
						|
		go run(mut m, mut co, c)
 | 
						|
	}
 | 
						|
	for i := 0; i < n; i++ {
 | 
						|
		<-c
 | 
						|
	}
 | 
						|
	assert co.i == 25
 | 
						|
}
 |