matchmaker/
noninteractive.rs1use std::time::{Duration, Instant};
2
3use crate::{
4 SSS,
5 nucleo::{Column, Render, Worker, injector::Injector},
6};
7
8pub fn get_matches<T: SSS + Render>(
10 items: impl IntoIterator<Item = T>,
11 query: &str,
12 timeout: Duration,
13 mut f: impl FnMut(&T) -> bool,
14) {
15 let mut worker = Worker::new([Column::new("", |item: &T| item.as_text())], 0);
16 let mut total = 0;
17
18 let injector = worker.injector();
19 for i in items {
20 total += 1;
21 let _ = injector.push(i);
22 }
23
24 worker.find(query);
25
26 let start = Instant::now();
27 loop {
28 let (_, status) = Worker::new_snapshot(&mut worker.nucleo);
29
30 if status.item_count == total && !status.running {
31 break;
32 }
33
34 if start.elapsed() >= timeout {
35 break;
36 }
37 }
39
40 for t in worker.raw_results() {
41 if f(t) {
42 break;
43 }
44 }
45}