47 lines
938 B
Rust
47 lines
938 B
Rust
use std::iter::Peekable;
|
|
|
|
pub(crate) fn intersperse_option<I: Iterator>(iterator: I) -> impl Iterator<Item = Option<I::Item>>
|
|
where
|
|
I::Item: Clone,
|
|
{
|
|
intersperse(iterator.map(Some), None)
|
|
}
|
|
|
|
pub(crate) fn intersperse<I: Iterator>(iterator: I, separator: I::Item) -> Intersperse<I>
|
|
where
|
|
I::Item: Clone,
|
|
{
|
|
Intersperse {
|
|
inner: iterator.peekable(),
|
|
separator,
|
|
needs_sep: false,
|
|
}
|
|
}
|
|
|
|
pub struct Intersperse<I>
|
|
where
|
|
I: Iterator,
|
|
{
|
|
inner: Peekable<I>,
|
|
separator: I::Item,
|
|
needs_sep: bool,
|
|
}
|
|
|
|
impl<I> Iterator for Intersperse<I>
|
|
where
|
|
I: Iterator,
|
|
I::Item: Clone,
|
|
{
|
|
type Item = I::Item;
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
if self.needs_sep && self.inner.peek().is_some() {
|
|
self.needs_sep = false;
|
|
Some(self.separator.clone())
|
|
} else {
|
|
self.needs_sep = true;
|
|
self.inner.next()
|
|
}
|
|
}
|
|
}
|