Skip to content

Commit

Permalink
Implement MergeBy::fold
Browse files Browse the repository at this point in the history
  • Loading branch information
kinto-b committed Apr 18, 2024
1 parent ed695af commit ecb2cd2
Showing 1 changed file with 43 additions and 0 deletions.
43 changes: 43 additions & 0 deletions src/merge_join.rs
Expand Up @@ -256,6 +256,49 @@ where
}
}

fn fold<B, G>(mut self, init: B, mut f: G) -> B
where
Self: Sized,
G: FnMut(B, Self::Item) -> B,
{
let mut acc = init;
let mut left = self.left.next();
let mut right = self.right.next();

loop {
match (left, right) {
(Some(l), Some(r)) => match self.cmp_fn.merge(l, r) {
(None, Some(r), x) => {
acc = f(acc, x);
left = self.left.next();
right = Some(r);
}
(Some(l), _, x) => {
acc = f(acc, x);
left = Some(l);
right = self.right.next();
}
_ => unreachable!(),
},
(Some(l), None) => {
self.left.put_back(l);
acc = self.left.fold(acc, |acc, x| f(acc, F::left(x)));
break;
}
(None, Some(r)) => {
self.right.put_back(r);
acc = self.right.fold(acc, |acc, x| f(acc, F::right(x)));
break;
}
(None, None) => {
break;
}
}
}

acc
}

fn size_hint(&self) -> SizeHint {
F::size_hint(self.left.size_hint(), self.right.size_hint())
}
Expand Down

0 comments on commit ecb2cd2

Please sign in to comment.