use std::iter::Peekable; pub(crate) fn intersperse_option(iterator: I) -> impl Iterator> where I::Item: Clone, { intersperse(iterator.map(Some), None) } pub(crate) fn intersperse(iterator: I, separator: I::Item) -> Intersperse where I::Item: Clone, { Intersperse { inner: iterator.peekable(), separator, needs_sep: false, } } pub struct Intersperse where I: Iterator, { inner: Peekable, separator: I::Item, needs_sep: bool, } impl Iterator for Intersperse where I: Iterator, I::Item: Clone, { type Item = I::Item; fn next(&mut self) -> Option { 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() } } }