Skip to content

Instantly share code, notes, and snippets.

@MikuroXina
Last active October 24, 2023 08:52
Show Gist options
  • Save MikuroXina/995bad3bd6b4881b614254b1b9bed366 to your computer and use it in GitHub Desktop.
Save MikuroXina/995bad3bd6b4881b614254b1b9bed366 to your computer and use it in GitHub Desktop.
Merges two sorted IntoIterator into a sorted Iterator with Rust.
#[inline]
pub fn merge<T, L, R>(left: L, right: R) -> Merge<T, L::IntoIter, R::IntoIter>
where
T: PartialOrd,
L: IntoIterator<Item = T>,
R: IntoIterator<Item = T>,
{
Merge {
left: left.into_iter().peekable(),
right: right.into_iter().peekable(),
}
}
#[derive(Debug, Clone)]
pub struct Merge<T, L, R>
where
L: Iterator<Item = T>,
R: Iterator<Item = T>,
{
left: core::iter::Peekable<L>,
right: core::iter::Peekable<R>,
}
impl<T, L, R> Iterator for Merge<T, L, R>
where
T: PartialOrd,
L: Iterator<Item = T>,
R: Iterator<Item = T>,
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
match (self.left.peek(), self.right.peek()) {
(Some(l0), Some(r0)) => {
if l0 < r0 {
self.left.next()
} else {
self.right.next()
}
}
_ => self.left.next().or_else(|| self.right.next()),
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment