@@ -115,7 +115,7 @@ pub trait OrderingOrBool<L, R> {
115
115
// "merge" never returns (Some(...), Some(...), ...) so Option<Either<I::Item, J::Item>>
116
116
// is appealing but it is always followed by two put_backs, so we think the compiler is
117
117
// smart enough to optimize it. Or we could move put_backs into "merge".
118
- fn merge ( & mut self , left : L , right : R ) -> ( Option < L > , Option < R > , Self :: MergeResult ) ;
118
+ fn merge ( & mut self , left : L , right : R ) -> ( Option < Either < L , R > > , Self :: MergeResult ) ;
119
119
fn size_hint ( left : SizeHint , right : SizeHint ) -> SizeHint ;
120
120
}
121
121
@@ -127,11 +127,11 @@ impl<L, R, F: FnMut(&L, &R) -> Ordering> OrderingOrBool<L, R> for MergeFuncLR<F,
127
127
fn right ( right : R ) -> Self :: MergeResult {
128
128
EitherOrBoth :: Right ( right)
129
129
}
130
- fn merge ( & mut self , left : L , right : R ) -> ( Option < L > , Option < R > , Self :: MergeResult ) {
130
+ fn merge ( & mut self , left : L , right : R ) -> ( Option < Either < L , R > > , Self :: MergeResult ) {
131
131
match self . 0 ( & left, & right) {
132
- Ordering :: Equal => ( None , None , EitherOrBoth :: Both ( left, right) ) ,
133
- Ordering :: Less => ( None , Some ( right) , EitherOrBoth :: Left ( left) ) ,
134
- Ordering :: Greater => ( Some ( left) , None , EitherOrBoth :: Right ( right) ) ,
132
+ Ordering :: Equal => ( None , EitherOrBoth :: Both ( left, right) ) ,
133
+ Ordering :: Less => ( Some ( Either :: Right ( right) ) , EitherOrBoth :: Left ( left) ) ,
134
+ Ordering :: Greater => ( Some ( Either :: Left ( left) ) , EitherOrBoth :: Right ( right) ) ,
135
135
}
136
136
}
137
137
fn size_hint ( left : SizeHint , right : SizeHint ) -> SizeHint {
@@ -154,11 +154,11 @@ impl<L, R, F: FnMut(&L, &R) -> bool> OrderingOrBool<L, R> for MergeFuncLR<F, boo
154
154
fn right ( right : R ) -> Self :: MergeResult {
155
155
Either :: Right ( right)
156
156
}
157
- fn merge ( & mut self , left : L , right : R ) -> ( Option < L > , Option < R > , Self :: MergeResult ) {
157
+ fn merge ( & mut self , left : L , right : R ) -> ( Option < Either < L , R > > , Self :: MergeResult ) {
158
158
if self . 0 ( & left, & right) {
159
- ( None , Some ( right) , Either :: Left ( left) )
159
+ ( Some ( Either :: Right ( right) ) , Either :: Left ( left) )
160
160
} else {
161
- ( Some ( left) , None , Either :: Right ( right) )
161
+ ( Some ( Either :: Left ( left) ) , Either :: Right ( right) )
162
162
}
163
163
}
164
164
fn size_hint ( left : SizeHint , right : SizeHint ) -> SizeHint {
@@ -175,11 +175,11 @@ impl<T, F: FnMut(&T, &T) -> bool> OrderingOrBool<T, T> for F {
175
175
fn right ( right : T ) -> Self :: MergeResult {
176
176
right
177
177
}
178
- fn merge ( & mut self , left : T , right : T ) -> ( Option < T > , Option < T > , Self :: MergeResult ) {
178
+ fn merge ( & mut self , left : T , right : T ) -> ( Option < Either < T , T > > , Self :: MergeResult ) {
179
179
if self ( & left, & right) {
180
- ( None , Some ( right) , left)
180
+ ( Some ( Either :: Right ( right) ) , left)
181
181
} else {
182
- ( Some ( left) , None , right)
182
+ ( Some ( Either :: Left ( left) ) , right)
183
183
}
184
184
}
185
185
fn size_hint ( left : SizeHint , right : SizeHint ) -> SizeHint {
@@ -196,11 +196,11 @@ impl<T: PartialOrd> OrderingOrBool<T, T> for MergeLte {
196
196
fn right ( right : T ) -> Self :: MergeResult {
197
197
right
198
198
}
199
- fn merge ( & mut self , left : T , right : T ) -> ( Option < T > , Option < T > , Self :: MergeResult ) {
199
+ fn merge ( & mut self , left : T , right : T ) -> ( Option < Either < T , T > > , Self :: MergeResult ) {
200
200
if left <= right {
201
- ( None , Some ( right) , left)
201
+ ( Some ( Either :: Right ( right) ) , left)
202
202
} else {
203
- ( Some ( left) , None , right)
203
+ ( Some ( Either :: Left ( left) ) , right)
204
204
}
205
205
}
206
206
fn size_hint ( left : SizeHint , right : SizeHint ) -> SizeHint {
@@ -244,13 +244,17 @@ where
244
244
( Some ( left) , None ) => Some ( F :: left ( left) ) ,
245
245
( None , Some ( right) ) => Some ( F :: right ( right) ) ,
246
246
( Some ( left) , Some ( right) ) => {
247
- let ( left, right, next) = self . cmp_fn . merge ( left, right) ;
248
- if let Some ( left) = left {
249
- self . left . put_back ( left) ;
250
- }
251
- if let Some ( right) = right {
252
- self . right . put_back ( right) ;
247
+ let ( not_next, next) = self . cmp_fn . merge ( left, right) ;
248
+ match not_next {
249
+ Some ( Either :: Left ( l) ) => {
250
+ self . left . put_back ( l) ;
251
+ }
252
+ Some ( Either :: Right ( r) ) => {
253
+ self . right . put_back ( r) ;
254
+ }
255
+ None => ( ) ,
253
256
}
257
+
254
258
Some ( next)
255
259
}
256
260
}
@@ -268,22 +272,21 @@ where
268
272
loop {
269
273
match ( left, right) {
270
274
( Some ( l) , Some ( r) ) => match self . cmp_fn . merge ( l, r) {
271
- ( None , Some ( r ) , x) => {
275
+ ( Some ( Either :: Right ( r ) ) , x) => {
272
276
acc = f ( acc, x) ;
273
277
left = self . left . next ( ) ;
274
278
right = Some ( r) ;
275
279
}
276
- ( Some ( l ) , None , x) => {
280
+ ( Some ( Either :: Left ( l ) ) , x) => {
277
281
acc = f ( acc, x) ;
278
282
left = Some ( l) ;
279
283
right = self . right . next ( ) ;
280
284
}
281
- ( None , None , x) => {
285
+ ( None , x) => {
282
286
acc = f ( acc, x) ;
283
287
left = self . left . next ( ) ;
284
288
right = self . right . next ( ) ;
285
289
}
286
- ( Some ( _) , Some ( _) , _) => unreachable ! ( ) ,
287
290
} ,
288
291
( Some ( l) , None ) => {
289
292
self . left . put_back ( l) ;
@@ -319,12 +322,15 @@ where
319
322
( Some ( _left) , None ) => break self . left . nth ( n) . map ( F :: left) ,
320
323
( None , Some ( _right) ) => break self . right . nth ( n) . map ( F :: right) ,
321
324
( Some ( left) , Some ( right) ) => {
322
- let ( left, right, _) = self . cmp_fn . merge ( left, right) ;
323
- if let Some ( left) = left {
324
- self . left . put_back ( left) ;
325
- }
326
- if let Some ( right) = right {
327
- self . right . put_back ( right) ;
325
+ let ( not_next, _) = self . cmp_fn . merge ( left, right) ;
326
+ match not_next {
327
+ Some ( Either :: Left ( l) ) => {
328
+ self . left . put_back ( l) ;
329
+ }
330
+ Some ( Either :: Right ( r) ) => {
331
+ self . right . put_back ( r) ;
332
+ }
333
+ None => ( ) ,
328
334
}
329
335
}
330
336
}
0 commit comments