File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -119,23 +119,22 @@ where
119119 type Item = O ;
120120
121121 fn next ( & mut self ) -> Option < Self :: Item > {
122+ // This must loop because each outer iterator item could produce an inner iterator with
123+ // any number of items, including zero.
122124 loop {
123- match self . inner {
124- Some ( ( ref i_item, ref mut j_iter) ) => {
125- if let Some ( j_item) = j_iter. next ( ) {
126- return Some ( ( self . output_fn ) ( i_item. clone ( ) , j_item) ) ;
127- }
128- // If no items, try the outer iter.
129- self . inner = None ;
125+ // Try to produce an item using the current inner iterator.
126+ if let Some ( ( ref i_item, ref mut j_iter) ) = self . inner {
127+ if let Some ( j_item) = j_iter. next ( ) {
128+ return Some ( ( self . output_fn ) ( i_item. clone ( ) , j_item) ) ;
130129 }
131- None => match self . outer_iterator . next ( ) {
132- Some ( i_item) => {
133- let j_iter = ( self . iter_fn ) ( & i_item) ;
134- self . inner = Some ( ( i_item, j_iter) ) ;
135- }
136- None => return None ,
137- } ,
130+ // If no items, drop this inner iter and try the outer iter.
131+ self . inner = None ;
138132 }
133+
134+ // Advance the outer iterator to produce a new inner iterator.
135+ let i_item = self . outer_iterator . next ( ) ?;
136+ let j_iter = ( self . iter_fn ) ( & i_item) ;
137+ self . inner = Some ( ( i_item, j_iter) ) ;
139138 }
140139 }
141140}
You can’t perform that action at this time.
0 commit comments