Skip to content

Commit 0dfd502

Browse files
committed
Implement MergeBy::fold
1 parent ed695af commit 0dfd502

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

src/merge_join.rs

+47
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,53 @@ where
256256
}
257257
}
258258

259+
fn fold<B, G>(mut self, init: B, mut f: G) -> B
260+
where
261+
Self: Sized,
262+
G: FnMut(B, Self::Item) -> B,
263+
{
264+
let mut acc = init;
265+
let mut left = self.left.next();
266+
let mut right = self.right.next();
267+
268+
loop {
269+
match (left, right) {
270+
(Some(l), Some(r)) => match self.cmp_fn.merge(l, r) {
271+
(None, Some(r), x) => {
272+
acc = f(acc, x);
273+
left = self.left.next();
274+
right = Some(r);
275+
}
276+
(Some(l), _, x) => {
277+
acc = f(acc, x);
278+
left = Some(l);
279+
right = self.right.next();
280+
}
281+
(_, _, x) => {
282+
acc = f(acc, x);
283+
left = self.left.next();
284+
right = self.right.next();
285+
}
286+
},
287+
(Some(l), None) => {
288+
self.left.put_back(l);
289+
acc = self.left.fold(acc, |acc, x| f(acc, F::left(x)));
290+
break;
291+
}
292+
(None, Some(r)) => {
293+
self.right.put_back(r);
294+
acc = self.right.fold(acc, |acc, x| f(acc, F::right(x)));
295+
break;
296+
}
297+
(None, None) => {
298+
break;
299+
}
300+
}
301+
}
302+
303+
acc
304+
}
305+
259306
fn size_hint(&self) -> SizeHint {
260307
F::size_hint(self.left.size_hint(), self.right.size_hint())
261308
}

0 commit comments

Comments
 (0)