meilisearch/crates/milli/src/update/new/parallel_iterator_ext.rs

34 lines
1.1 KiB
Rust
Raw Normal View History

2024-09-26 18:43:23 +02:00
use std::sync::Arc;
use rayon::iter::ParallelIterator;
2024-09-26 17:46:58 +02:00
pub trait ParallelIteratorExt: ParallelIterator {
/// A method to run a closure of all the items and return an owned error.
///
/// The init function is ran only as necessary which is basically once by thread.
fn try_arc_for_each_try_init<F, INIT, T, E>(self, init: INIT, op: F) -> Result<(), E>
where
E: Send + Sync,
F: Fn(&mut T, Self::Item) -> Result<(), Arc<E>> + Sync + Send + Clone,
INIT: Fn() -> Result<T, E> + Sync + Send + Clone,
{
let result = self.try_for_each_init(
move || match init() {
Ok(t) => Ok(t),
Err(err) => Err(Arc::new(err)),
},
move |result, item| match result {
Ok(t) => op(t, item),
Err(err) => Err(err.clone()),
},
);
match result {
Ok(()) => Ok(()),
Err(err) => Err(Arc::into_inner(err).expect("the error must be only owned by us")),
}
}
2024-09-26 17:46:58 +02:00
}
impl<T: ParallelIterator> ParallelIteratorExt for T {}