#[cfg(feature = "parallel")]
pub use rayon::prelude::{
IndexedParallelIterator, IntoParallelIterator, IntoParallelRefIterator,
IntoParallelRefMutIterator, ParallelBridge, ParallelIterator, ParallelSliceMut,
};
#[cfg(not(feature = "parallel"))]
pub use self::fallback::*;
#[cfg(not(feature = "parallel"))]
mod fallback {
pub use std::iter::Iterator as ParallelIterator;
pub use std::iter::Iterator as IndexedParallelIterator;
pub trait IntoParallelIterator {
type Item;
type Iter: Iterator<Item = Self::Item>;
fn into_par_iter(self) -> Self::Iter;
}
impl<I: IntoIterator> IntoParallelIterator for I {
type Item = I::Item;
type Iter = I::IntoIter;
fn into_par_iter(self) -> Self::Iter {
self.into_iter()
}
}
pub trait IntoParallelRefIterator<'data> {
type Item;
type Iter: Iterator<Item = Self::Item>;
fn par_iter(&'data self) -> Self::Iter;
}
impl<'data, I: 'data + ?Sized> IntoParallelRefIterator<'data> for I
where
&'data I: IntoIterator,
{
type Item = <&'data I as IntoIterator>::Item;
type Iter = <&'data I as IntoIterator>::IntoIter;
fn par_iter(&'data self) -> Self::Iter {
self.into_iter()
}
}
pub trait IntoParallelRefMutIterator<'data> {
type Item;
type Iter: Iterator<Item = Self::Item>;
fn par_iter_mut(&'data mut self) -> Self::Iter;
}
impl<'data, I: 'data + ?Sized> IntoParallelRefMutIterator<'data> for I
where
&'data mut I: IntoIterator,
{
type Item = <&'data mut I as IntoIterator>::Item;
type Iter = <&'data mut I as IntoIterator>::IntoIter;
fn par_iter_mut(&'data mut self) -> Self::Iter {
self.into_iter()
}
}
pub trait ParallelBridge: Iterator {
fn par_bridge(self) -> Self;
}
impl<T: Iterator> ParallelBridge for T {
fn par_bridge(self) -> Self {
self
}
}
pub trait ParallelSliceMut<T> {
fn par_sort_unstable(&mut self)
where
T: Ord;
fn par_sort_unstable_by_key<K, F>(&mut self, f: F)
where
K: Ord,
F: Fn(&T) -> K;
}
impl<T> ParallelSliceMut<T> for [T] {
fn par_sort_unstable(&mut self)
where
T: Ord,
{
self.sort_unstable();
}
fn par_sort_unstable_by_key<K, F>(&mut self, f: F)
where
K: Ord,
F: Fn(&T) -> K,
{
self.sort_unstable_by_key(f)
}
}
pub trait ParallelIteratorExt: Iterator {
fn flat_map_iter<U, F>(self, f: F) -> std::iter::FlatMap<Self, U, F>
where
Self: Sized,
U: IntoIterator,
F: FnMut(Self::Item) -> U,
{
self.flat_map(f)
}
fn try_reduce<T, E, ID, OP>(mut self, identity: ID, mut op: OP) -> Result<T, E>
where
Self: Sized + Iterator<Item = Result<T, E>>,
ID: Fn() -> T,
OP: FnMut(T, T) -> Result<T, E>,
{
let mut acc = identity();
for item in self {
match item {
Ok(v) => acc = op(acc, v)?,
Err(e) => return Err(e),
}
}
Ok(acc)
}
}
impl<I: Iterator> ParallelIteratorExt for I {}
}