3 /// An iterator adapter that places a separator between all elements.
4 #[unstable(feature = "iter_intersperse", reason = "recently added", issue = "79524")]
5 #[derive(Debug, Clone)]
6 pub struct Intersperse<I: Iterator>
15 impl<I: Iterator> Intersperse<I>
19 pub(in crate::iter) fn new(iter: I, separator: I::Item) -> Self {
20 Self { iter: iter.peekable(), separator, needs_sep: false }
24 #[unstable(feature = "iter_intersperse", reason = "recently added", issue = "79524")]
25 impl<I> Iterator for Intersperse<I>
33 fn next(&mut self) -> Option<I::Item> {
34 if self.needs_sep && self.iter.peek().is_some() {
35 self.needs_sep = false;
36 Some(self.separator.clone())
38 self.needs_sep = true;
43 fn fold<B, F>(mut self, init: B, mut f: F) -> B
46 F: FnMut(B, Self::Item) -> B,
50 // Use `peek()` first to avoid calling `next()` on an empty iterator.
51 if !self.needs_sep || self.iter.peek().is_some() {
52 if let Some(x) = self.iter.next() {
57 let element = &self.separator;
59 self.iter.fold(accum, |mut accum, x| {
60 accum = f(accum, element.clone());
66 fn size_hint(&self) -> (usize, Option<usize>) {
67 let (lo, hi) = self.iter.size_hint();
68 let next_is_elem = !self.needs_sep;
69 let lo = lo.saturating_sub(next_is_elem as usize).saturating_add(lo);
71 Some(hi) => hi.saturating_sub(next_is_elem as usize).checked_add(hi),