use std::sync::Arc;
use dioxus::prelude::*;
use dioxus_swdir_tree_core::{DirectoryTree, ScanExecutor, ScanRequest, scan};
use futures_util::StreamExt;
pub fn use_scan_driver(
mut tree: Signal<DirectoryTree>,
executor: Arc<dyn ScanExecutor>,
) -> Coroutine<ScanRequest> {
use_coroutine(move |mut rx: UnboundedReceiver<ScanRequest>| {
let exec = Arc::clone(&executor);
async move {
while let Some(req) = rx.next().await {
let req_copy = req.clone();
let job = Box::new(move || scan::run(&req_copy));
let payload = exec.spawn_blocking(job).await;
let outcome = tree.write().on_loaded(payload);
for prefetch_req in outcome.prefetch_requests {
let exec_clone = Arc::clone(&exec);
spawn(async move {
let r = prefetch_req.clone();
let job = Box::new(move || scan::run(&r));
let payload = exec_clone.spawn_blocking(job).await;
tree.write().on_loaded(payload);
});
}
}
}
})
}