3 /// An iterator adapter that places a separator between all elements.
5 /// This `struct` is created by [`Iterator::intersperse`]. See its documentation
6 /// for more information.
7 #[unstable(feature = "iter_intersperse", reason = "recently added", issue = "79524")]
8 #[derive(Debug, Clone)]
9 pub struct Intersperse<I: Iterator>
18 impl<I: Iterator> Intersperse<I>
22 pub(in crate::iter) fn new(iter: I, separator: I::Item) -> Self {
23 Self { iter: iter.peekable(), separator, needs_sep: false }
27 #[unstable(feature = "iter_intersperse", reason = "recently added", issue = "79524")]
28 impl<I> Iterator for Intersperse<I>
36 fn next(&mut self) -> Option<I::Item> {
37 if self.needs_sep && self.iter.peek().is_some() {
38 self.needs_sep = false;
39 Some(self.separator.clone())
41 self.needs_sep = true;
46 fn fold<B, F>(self, init: B, f: F) -> B
49 F: FnMut(B, Self::Item) -> B,
51 let separator = self.separator;
52 intersperse_fold(self.iter, init, f, move || separator.clone(), self.needs_sep)
55 fn size_hint(&self) -> (usize, Option<usize>) {
56 intersperse_size_hint(&self.iter, self.needs_sep)
60 /// An iterator adapter that places a separator between all elements.
62 /// This `struct` is created by [`Iterator::intersperse_with`]. See its
63 /// documentation for more information.
64 #[unstable(feature = "iter_intersperse", reason = "recently added", issue = "79524")]
65 pub struct IntersperseWith<I, G>
74 #[unstable(feature = "iter_intersperse", reason = "recently added", issue = "79524")]
75 impl<I, G> crate::fmt::Debug for IntersperseWith<I, G>
77 I: Iterator + crate::fmt::Debug,
78 I::Item: crate::fmt::Debug,
81 fn fmt(&self, f: &mut crate::fmt::Formatter<'_>) -> crate::fmt::Result {
82 f.debug_struct("IntersperseWith")
83 .field("separator", &self.separator)
84 .field("iter", &self.iter)
85 .field("needs_sep", &self.needs_sep)
90 #[unstable(feature = "iter_intersperse", reason = "recently added", issue = "79524")]
91 impl<I, G> crate::clone::Clone for IntersperseWith<I, G>
93 I: Iterator + crate::clone::Clone,
94 I::Item: crate::clone::Clone,
97 fn clone(&self) -> Self {
99 separator: self.separator.clone(),
100 iter: self.iter.clone(),
101 needs_sep: self.needs_sep.clone(),
106 impl<I, G> IntersperseWith<I, G>
109 G: FnMut() -> I::Item,
111 pub(in crate::iter) fn new(iter: I, separator: G) -> Self {
112 Self { iter: iter.peekable(), separator, needs_sep: false }
116 #[unstable(feature = "iter_intersperse", reason = "recently added", issue = "79524")]
117 impl<I, G> Iterator for IntersperseWith<I, G>
120 G: FnMut() -> I::Item,
125 fn next(&mut self) -> Option<I::Item> {
126 if self.needs_sep && self.iter.peek().is_some() {
127 self.needs_sep = false;
128 Some((self.separator)())
130 self.needs_sep = true;
135 fn fold<B, F>(self, init: B, f: F) -> B
138 F: FnMut(B, Self::Item) -> B,
140 intersperse_fold(self.iter, init, f, self.separator, self.needs_sep)
143 fn size_hint(&self) -> (usize, Option<usize>) {
144 intersperse_size_hint(&self.iter, self.needs_sep)
148 fn intersperse_size_hint<I>(iter: &I, needs_sep: bool) -> (usize, Option<usize>)
152 let (lo, hi) = iter.size_hint();
153 let next_is_elem = !needs_sep;
155 lo.saturating_sub(next_is_elem as usize).saturating_add(lo),
156 hi.and_then(|hi| hi.saturating_sub(next_is_elem as usize).checked_add(hi)),
160 fn intersperse_fold<I, B, F, G>(
169 F: FnMut(B, I::Item) -> B,
170 G: FnMut() -> I::Item,
172 let mut accum = init;
175 if let Some(x) = iter.next() {
182 iter.fold(accum, |mut accum, x| {
183 accum = f(accum, separator());