use crate::parallel_budget::{BudgetRequest, HostResources, worker_budget};
use crate::parallel_runner::{Event, OrderedRun, run_ordered};
use crate::worktree_trash_manifest::{TrashManifest, entry_name};
use crate::worktree_trash_remove::Removal;
use std::fs::File;
use std::path::Path;
const MEASURED_MILLION_NAME_PEAK: u64 = 99_655_680;
const ENTRY_MEMORY: u64 = MEASURED_MILLION_NAME_PEAK.next_power_of_two();
pub type RemoveOne<'a> = dyn Fn(&Path, &File, &std::ffi::OsStr, Option<crate::fs_beneath::ObjectId>) -> Result<crate::worktree_trash_remove::Removal, String> + Sync + 'a;
pub struct EntryRemoval<'a> {
pub inside: &'a Path,
pub trash: &'a File,
pub manifest: &'a TrashManifest,
pub host: &'a HostResources,
pub remove: &'a RemoveOne<'a>,
}
pub fn remove_entries(request: &EntryRemoval<'_>) -> Vec<String> {
let EntryRemoval { inside, trash, manifest, host, remove } = *request;
let indices: Vec<usize> = (0..manifest.entries.len()).collect();
let lanes: Vec<Vec<usize>> = indices.iter().map(|index: &usize| { return vec![*index]; }).collect();
let workers: usize = worker_budget(&BudgetRequest { items: indices.len(), per_item_memory: ENTRY_MEMORY, ceiling: None, cap: None, host });
let mut left: Vec<String> = Vec::new();
run_ordered(OrderedRun {
items: indices.as_slice(),
lanes: lanes.as_slice(),
workers,
work: &|_slot: usize, index: &usize, _say: &mut dyn FnMut(&str)| { return remove(inside, trash, std::ffi::OsStr::new(entry_name(*index).as_str()), Some(manifest.entries[*index])); },
on_event: &mut |event: Event<'_, Result<Removal, String>>| {
if let Event::End(_slot, Err(reason)) = event {
left.push(reason);
}
},
});
return left;
}
#[cfg(test)]
#[path = "worktree_trash_entries_tests.rs"]
mod tests;