Add ParallelIteratorExt

This commit is contained in:
Louis Dureuil 2024-09-26 17:46:58 +02:00 committed by Clément Renault
parent bb7a503e5d
commit 5b776556fe
No known key found for this signature in database
GPG Key ID: F250A4C4E3AE5F5F

View File

@ -1,4 +1,36 @@
use crossbeam_channel::{Receiver, Sender, TryRecvError}; use crossbeam_channel::{Receiver, Sender, TryRecvError};
use rayon::iter::{MapInit, ParallelIterator};
pub trait ParallelIteratorExt: ParallelIterator {
fn try_map_try_init<F, INIT, T, E, R>(
self,
init: INIT,
map_op: F,
) -> MapInit<
Self,
impl Fn() -> Result<T, Option<E>> + Sync + Send + Clone,
impl Fn(&mut Result<T, Option<E>>, Self::Item) -> Result<R, Option<E>> + Sync + Send + Clone,
>
where
E: Send,
F: Fn(&mut T, Self::Item) -> Result<R, E> + Sync + Send + Clone,
INIT: Fn() -> Result<T, E> + Sync + Send + Clone,
R: Send,
{
self.map_init(
move || match init() {
Ok(t) => Ok(t),
Err(err) => Err(Some(err)),
},
move |maybe_t, item| match maybe_t {
Ok(t) => map_op(t, item).map_err(Some),
Err(maybe_err) => Err(maybe_err.take()),
},
)
}
}
impl<T: ParallelIterator> ParallelIteratorExt for T {}
/// A pool of items that can be pull and generated on demand. /// A pool of items that can be pull and generated on demand.
pub struct ItemsPool<F, T, E> pub struct ItemsPool<F, T, E>