@@ -28,6 +28,22 @@ pub trait Producer: IntoIterator + Send + Sized {
2828 /// Split into two producers; one produces items `0..index`, the
2929 /// other `index..N`. Index must be less than `N`.
3030 fn split_at ( self , index : usize ) -> ( Self , Self ) ;
31+
32+ /// Iterate the producer, feeding each element to `folder`, and
33+ /// stop when the folder is full (or all elements have been consumed).
34+ ///
35+ /// The provided implementation is sufficient for most iterables.
36+ fn fold_with < F > ( self , mut folder : F ) -> F
37+ where F : Folder < Self :: Item > ,
38+ {
39+ for item in self {
40+ folder = folder. consume ( item) ;
41+ if folder. full ( ) {
42+ break ;
43+ }
44+ }
45+ folder
46+ }
3147}
3248
3349/// A consumer which consumes items that are fed to it.
@@ -95,6 +111,22 @@ pub trait UnindexedConsumer<ITEM>: Consumer<ITEM> {
95111pub trait UnindexedProducer : IntoIterator + Send + Sized {
96112 fn can_split ( & self ) -> bool ;
97113 fn split ( self ) -> ( Self , Self ) ;
114+
115+ /// Iterate the producer, feeding each element to `folder`, and
116+ /// stop when the folder is full (or all elements have been consumed).
117+ ///
118+ /// The provided implementation is sufficient for most iterables.
119+ fn fold_with < F > ( self , mut folder : F ) -> F
120+ where F : Folder < Self :: Item > ,
121+ {
122+ for item in self {
123+ folder = folder. consume ( item) ;
124+ if folder. full ( ) {
125+ break ;
126+ }
127+ }
128+ folder
129+ }
98130}
99131
100132/// A splitter controls the policy for splitting into smaller work items.
@@ -207,14 +239,7 @@ pub fn bridge_producer_consumer<P, C>(len: usize, mut producer: P, mut consumer:
207239 || helper ( len - mid, splitter, right_producer, right_consumer) ) ;
208240 reducer. reduce ( left_result, right_result)
209241 } else {
210- let mut folder = consumer. into_folder ( ) ;
211- for item in producer {
212- folder = folder. consume ( item) ;
213- if folder. full ( ) {
214- break ;
215- }
216- }
217- folder. complete ( )
242+ producer. fold_with ( consumer. into_folder ( ) ) . complete ( )
218243 }
219244 }
220245}
@@ -245,13 +270,6 @@ fn bridge_unindexed_producer_consumer<P, C>(mut splitter: Splitter,
245270 || bridge_unindexed_producer_consumer ( splitter, right_producer, right_consumer) ) ;
246271 reducer. reduce ( left_result, right_result)
247272 } else {
248- let mut folder = consumer. into_folder ( ) ;
249- for item in producer {
250- folder = folder. consume ( item) ;
251- if folder. full ( ) {
252- break ;
253- }
254- }
255- folder. complete ( )
273+ producer. fold_with ( consumer. into_folder ( ) ) . complete ( )
256274 }
257275}
0 commit comments