Skip to main content

matchmaker/
noninteractive.rs

1use std::time::{Duration, Instant};
2
3use crate::{
4    SSS,
5    nucleo::{Column, Render, Worker, injector::Injector},
6};
7
8/// Map f on matches without starting the interface.
9pub 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        // new_snapshot already waits
38    }
39
40    for t in worker.raw_results() {
41        if f(t) {
42            break;
43        }
44    }
45}