graph_bfs/
graph_bfs.rs

1use std::{collections::VecDeque, thread};
2
3use worker_synchronizer::Synchronizer;
4
5const TARGET: u32 = 10;
6fn main() {
7    let numbers: [_; 32] = std::array::from_fn(|i| i as u32);
8    let init = (0, 0, numbers.as_slice());
9    let synchronizer = Synchronizer::new(VecDeque::from([init]));
10    thread::scope(|scope| {
11        for _ in 0..thread::available_parallelism().unwrap().get() {
12            scope.spawn(|| {
13                for ((current, selected, remaining_slice), writer) in &synchronizer {
14                    use std::cmp::Ordering::*;
15                    match current.cmp(&TARGET) {
16                        Less => {
17                            let Some((next, remaining_slice)) = remaining_slice.split_first()
18                            else {
19                                continue;
20                            };
21                            writer
22                                .write_multiples([
23                                    (current + next, (selected << 1) + 1, remaining_slice),
24                                    (current, selected << 1, remaining_slice),
25                                ])
26                                .unwrap();
27                        }
28                        Equal => {
29                            dbg!(current, selected, remaining_slice);
30                            synchronizer.close();
31                        }
32                        Greater => (),
33                    }
34                }
35            });
36        }
37    })
38}