use crate::{Budget, EvaluationError, Location};
pub fn filter_native_exists<T, R, E>(
items: Vec<T>,
budget: &mut Budget,
location: Location,
mut relation: impl FnMut(&T, &mut Budget) -> Result<Vec<R>, EvaluationError<E>>,
) -> Result<Vec<T>, EvaluationError<E>> {
budget.check_items(items.len(), location.clone())?;
let mut selected = Vec::new();
for item in items {
budget.charge(1, location.clone())?;
if !relation(&item, budget)?.is_empty() {
budget.charge(1, location.clone())?;
budget.charge_results(1, location.clone())?;
selected.push(item);
}
}
Ok(selected)
}