1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use super::internal::*;
use super::*;
pub fn split<D, S>(data: D, splitter: S) -> Split<D, S>
where D: Send,
S: Fn(D) -> (D, Option<D>) + Sync
{
Split {
data: data,
splitter: splitter,
}
}
pub struct Split<D, S> {
data: D,
splitter: S,
}
impl<D, S> ParallelIterator for Split<D, S>
where D: Send,
S: Fn(D) -> (D, Option<D>) + Sync
{
type Item = D;
fn drive_unindexed<C>(self, consumer: C) -> C::Result
where C: UnindexedConsumer<Self::Item>
{
let producer = SplitProducer {
data: self.data,
splitter: &self.splitter,
};
bridge_unindexed(producer, consumer)
}
}
struct SplitProducer<'a, D, S: 'a> {
data: D,
splitter: &'a S,
}
impl<'a, D, S> UnindexedProducer for SplitProducer<'a, D, S>
where D: Send,
S: Fn(D) -> (D, Option<D>) + Sync
{
type Item = D;
fn split(mut self) -> (Self, Option<Self>) {
let splitter = self.splitter;
let (left, right) = splitter(self.data);
self.data = left;
(self,
right.map(|data| {
SplitProducer {
data: data,
splitter: splitter,
}
}))
}
fn fold_with<F>(self, folder: F) -> F
where F: Folder<Self::Item>
{
folder.consume(self.data)
}
}