1use std::thread;
4use std::sync::mpsc;
5use std::time::Instant;
6
7pub fn race(x: i32, y: i32) -> i32 {
9 let mut z = 0;
10
11 let (tx1, rx1) = mpsc::channel();
12 let (tx2, rx2) = mpsc::channel();
13
14 thread::spawn(move || {
15 loop {
16 tx1.send(x);
17 let slowdown = generate_primes(2000);
18 }
19 });
20 thread::spawn(move || {
21 loop {
22 tx2.send(y);
23 let slowdown = generate_primes(2000);
24 }
25 });
26
27 let mut now = Instant::now();
28 loop {
29 match rx1.try_recv() {
30 Ok(v) => {z = v},
31 Err(_) => ()
32 }
33 match time_check(&mut now, z) {
34 Some(v) => {return v}
35 None => (),
36 }
37
38 match rx2.try_recv() {
39 Ok(v) => {z = v},
40 Err(_) => ()
41 }
42 match time_check(&mut now, z) {
43 Some(v) => {return v}
44 None => (),
45 }
46 }
47}
48
49fn generate_primes(n: usize) -> Vec<usize> {
50 let mut primes: Vec<usize> = Vec::new();
51
52 let count = 3;
53 loop {
54 let magic = ((count as f32).sqrt().round()) as usize + 1;
55 for i in 2..magic {
56 if count % i == 0 {
57 break
58 }
59 primes.push(count);
60 }
61
62 if primes.len() > n {
63 return primes;
64 }
65 }
66}
67
68fn time_check(now: &mut Instant, z: i32) -> Option<i32>{
69 let elapsed = now.elapsed();
70 if elapsed.as_millis() > 300 {
71 *now = Instant::now();
72 return Some(z)
73 }
74
75 return None;
76}