rayon/iter/
for_each.rs

1use super::noop::*;
2use super::plumbing::*;
3use super::ParallelIterator;
4
5pub(super) fn for_each<I, F, T>(pi: I, op: &F)
6where
7    I: ParallelIterator<Item = T>,
8    F: Fn(T) + Sync,
9    T: Send,
10{
11    let consumer = ForEachConsumer { op };
12    pi.drive_unindexed(consumer)
13}
14
15struct ForEachConsumer<'f, F> {
16    op: &'f F,
17}
18
19impl<'f, F, T> Consumer<T> for ForEachConsumer<'f, F>
20where
21    F: Fn(T) + Sync,
22{
23    type Folder = ForEachConsumer<'f, F>;
24    type Reducer = NoopReducer;
25    type Result = ();
26
27    fn split_at(self, _index: usize) -> (Self, Self, NoopReducer) {
28        (self.split_off_left(), self, NoopReducer)
29    }
30
31    fn into_folder(self) -> Self {
32        self
33    }
34
35    fn full(&self) -> bool {
36        false
37    }
38}
39
40impl<'f, F, T> Folder<T> for ForEachConsumer<'f, F>
41where
42    F: Fn(T) + Sync,
43{
44    type Result = ();
45
46    fn consume(self, item: T) -> Self {
47        (self.op)(item);
48        self
49    }
50
51    fn consume_iter<I>(self, iter: I) -> Self
52    where
53        I: IntoIterator<Item = T>,
54    {
55        iter.into_iter().for_each(self.op);
56        self
57    }
58
59    fn complete(self) {}
60
61    fn full(&self) -> bool {
62        false
63    }
64}
65
66impl<'f, F, T> UnindexedConsumer<T> for ForEachConsumer<'f, F>
67where
68    F: Fn(T) + Sync,
69{
70    fn split_off_left(&self) -> Self {
71        ForEachConsumer { op: self.op }
72    }
73
74    fn to_reducer(&self) -> NoopReducer {
75        NoopReducer
76    }
77}