1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

#[cfg(feature = "parallel")]
pub fn potential_parallel_for_each<D, T, F, G, S>(data: D, init_thread: G, body: F)
    where F: Fn(&mut S, usize, T) + Send + Sync,
        G: Fn() -> S + Send + Sync,
        T: Send,
        D: rayon::iter::IntoParallelIterator<Item = T>,
        <D as rayon::iter::IntoParallelIterator>::Iter: rayon::iter::IndexedParallelIterator
{
    <_ as rayon::iter::ParallelIterator>::for_each_init(<_ as rayon::iter::IndexedParallelIterator>::enumerate(<_ as rayon::iter::IntoParallelIterator>::into_par_iter(data)), init_thread, |state, (i, el)| body(state, i, el))
}

#[cfg(not(feature = "parallel"))]
pub fn potential_parallel_for_each<D, T, F, G, S>(data: D, init_thread: G, body: F)
    where F: Fn(&mut S, usize, T) + Send + Sync,
        G: Fn() -> S + Send + Sync,
        D: IntoIterator<Item = T>
{
    let mut state = init_thread();
    for (i, el) in data.into_iter().enumerate() {
        body(&mut state, i, el);
    }
}