]> git.lizzy.rs Git - rust.git/blob - src/libcore/iter/adapters/mod.rs
Rollup merge of #63055 - Mark-Simulacrum:save-analysis-clean-2, r=Xanewok
[rust.git] / src / libcore / iter / adapters / mod.rs
1 use crate::cmp;
2 use crate::fmt;
3 use crate::ops::Try;
4 use crate::usize;
5 use crate::intrinsics;
6
7 use super::{Iterator, DoubleEndedIterator, ExactSizeIterator, FusedIterator, TrustedLen};
8 use super::LoopState;
9
10 mod chain;
11 mod flatten;
12 mod zip;
13
14 pub use self::chain::Chain;
15 #[stable(feature = "rust1", since = "1.0.0")]
16 pub use self::flatten::{FlatMap, Flatten};
17 pub use self::zip::Zip;
18 pub(crate) use self::zip::TrustedRandomAccess;
19
20 /// A double-ended iterator with the direction inverted.
21 ///
22 /// This `struct` is created by the [`rev`] method on [`Iterator`]. See its
23 /// documentation for more.
24 ///
25 /// [`rev`]: trait.Iterator.html#method.rev
26 /// [`Iterator`]: trait.Iterator.html
27 #[derive(Clone, Debug)]
28 #[must_use = "iterators are lazy and do nothing unless consumed"]
29 #[stable(feature = "rust1", since = "1.0.0")]
30 pub struct Rev<T> {
31     iter: T
32 }
33 impl<T> Rev<T> {
34     pub(super) fn new(iter: T) -> Rev<T> {
35         Rev { iter }
36     }
37 }
38
39 #[stable(feature = "rust1", since = "1.0.0")]
40 impl<I> Iterator for Rev<I> where I: DoubleEndedIterator {
41     type Item = <I as Iterator>::Item;
42
43     #[inline]
44     fn next(&mut self) -> Option<<I as Iterator>::Item> { self.iter.next_back() }
45     #[inline]
46     fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
47
48     #[inline]
49     fn nth(&mut self, n: usize) -> Option<<I as Iterator>::Item> { self.iter.nth_back(n) }
50
51     fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R where
52         Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
53     {
54         self.iter.try_rfold(init, f)
55     }
56
57     fn fold<Acc, F>(self, init: Acc, f: F) -> Acc
58         where F: FnMut(Acc, Self::Item) -> Acc,
59     {
60         self.iter.rfold(init, f)
61     }
62
63     #[inline]
64     fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
65         where P: FnMut(&Self::Item) -> bool
66     {
67         self.iter.rfind(predicate)
68     }
69
70     #[inline]
71     fn rposition<P>(&mut self, predicate: P) -> Option<usize> where
72         P: FnMut(Self::Item) -> bool
73     {
74         self.iter.position(predicate)
75     }
76 }
77
78 #[stable(feature = "rust1", since = "1.0.0")]
79 impl<I> DoubleEndedIterator for Rev<I> where I: DoubleEndedIterator {
80     #[inline]
81     fn next_back(&mut self) -> Option<<I as Iterator>::Item> { self.iter.next() }
82
83     #[inline]
84     fn nth_back(&mut self, n: usize) -> Option<<I as Iterator>::Item> { self.iter.nth(n) }
85
86     fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R where
87         Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
88     {
89         self.iter.try_fold(init, f)
90     }
91
92     fn rfold<Acc, F>(self, init: Acc, f: F) -> Acc
93         where F: FnMut(Acc, Self::Item) -> Acc,
94     {
95         self.iter.fold(init, f)
96     }
97
98     fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
99         where P: FnMut(&Self::Item) -> bool
100     {
101         self.iter.find(predicate)
102     }
103 }
104
105 #[stable(feature = "rust1", since = "1.0.0")]
106 impl<I> ExactSizeIterator for Rev<I>
107     where I: ExactSizeIterator + DoubleEndedIterator
108 {
109     fn len(&self) -> usize {
110         self.iter.len()
111     }
112
113     fn is_empty(&self) -> bool {
114         self.iter.is_empty()
115     }
116 }
117
118 #[stable(feature = "fused", since = "1.26.0")]
119 impl<I> FusedIterator for Rev<I>
120     where I: FusedIterator + DoubleEndedIterator {}
121
122 #[unstable(feature = "trusted_len", issue = "37572")]
123 unsafe impl<I> TrustedLen for Rev<I>
124     where I: TrustedLen + DoubleEndedIterator {}
125
126 /// An iterator that copies the elements of an underlying iterator.
127 ///
128 /// This `struct` is created by the [`copied`] method on [`Iterator`]. See its
129 /// documentation for more.
130 ///
131 /// [`copied`]: trait.Iterator.html#method.copied
132 /// [`Iterator`]: trait.Iterator.html
133 #[stable(feature = "iter_copied", since = "1.36.0")]
134 #[must_use = "iterators are lazy and do nothing unless consumed"]
135 #[derive(Clone, Debug)]
136 pub struct Copied<I> {
137     it: I,
138 }
139
140 impl<I> Copied<I> {
141     pub(super) fn new(it: I) -> Copied<I> {
142         Copied { it }
143     }
144 }
145
146 #[stable(feature = "iter_copied", since = "1.36.0")]
147 impl<'a, I, T: 'a> Iterator for Copied<I>
148     where I: Iterator<Item=&'a T>, T: Copy
149 {
150     type Item = T;
151
152     fn next(&mut self) -> Option<T> {
153         self.it.next().copied()
154     }
155
156     fn size_hint(&self) -> (usize, Option<usize>) {
157         self.it.size_hint()
158     }
159
160     fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R where
161         Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
162     {
163         self.it.try_fold(init, move |acc, &elt| f(acc, elt))
164     }
165
166     fn fold<Acc, F>(self, init: Acc, mut f: F) -> Acc
167         where F: FnMut(Acc, Self::Item) -> Acc,
168     {
169         self.it.fold(init, move |acc, &elt| f(acc, elt))
170     }
171 }
172
173 #[stable(feature = "iter_copied", since = "1.36.0")]
174 impl<'a, I, T: 'a> DoubleEndedIterator for Copied<I>
175     where I: DoubleEndedIterator<Item=&'a T>, T: Copy
176 {
177     fn next_back(&mut self) -> Option<T> {
178         self.it.next_back().copied()
179     }
180
181     fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R where
182         Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
183     {
184         self.it.try_rfold(init, move |acc, &elt| f(acc, elt))
185     }
186
187     fn rfold<Acc, F>(self, init: Acc, mut f: F) -> Acc
188         where F: FnMut(Acc, Self::Item) -> Acc,
189     {
190         self.it.rfold(init, move |acc, &elt| f(acc, elt))
191     }
192 }
193
194 #[stable(feature = "iter_copied", since = "1.36.0")]
195 impl<'a, I, T: 'a> ExactSizeIterator for Copied<I>
196     where I: ExactSizeIterator<Item=&'a T>, T: Copy
197 {
198     fn len(&self) -> usize {
199         self.it.len()
200     }
201
202     fn is_empty(&self) -> bool {
203         self.it.is_empty()
204     }
205 }
206
207 #[stable(feature = "iter_copied", since = "1.36.0")]
208 impl<'a, I, T: 'a> FusedIterator for Copied<I>
209     where I: FusedIterator<Item=&'a T>, T: Copy
210 {}
211
212 #[doc(hidden)]
213 unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Copied<I>
214     where I: TrustedRandomAccess<Item=&'a T>, T: Copy
215 {
216     unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
217         *self.it.get_unchecked(i)
218     }
219
220     #[inline]
221     fn may_have_side_effect() -> bool {
222         I::may_have_side_effect()
223     }
224 }
225
226 #[stable(feature = "iter_copied", since = "1.36.0")]
227 unsafe impl<'a, I, T: 'a> TrustedLen for Copied<I>
228     where I: TrustedLen<Item=&'a T>,
229           T: Copy
230 {}
231
232 /// An iterator that clones the elements of an underlying iterator.
233 ///
234 /// This `struct` is created by the [`cloned`] method on [`Iterator`]. See its
235 /// documentation for more.
236 ///
237 /// [`cloned`]: trait.Iterator.html#method.cloned
238 /// [`Iterator`]: trait.Iterator.html
239 #[stable(feature = "iter_cloned", since = "1.1.0")]
240 #[must_use = "iterators are lazy and do nothing unless consumed"]
241 #[derive(Clone, Debug)]
242 pub struct Cloned<I> {
243     it: I,
244 }
245 impl<I> Cloned<I> {
246     pub(super) fn new(it: I) -> Cloned<I> {
247         Cloned { it }
248     }
249 }
250
251 #[stable(feature = "iter_cloned", since = "1.1.0")]
252 impl<'a, I, T: 'a> Iterator for Cloned<I>
253     where I: Iterator<Item=&'a T>, T: Clone
254 {
255     type Item = T;
256
257     fn next(&mut self) -> Option<T> {
258         self.it.next().cloned()
259     }
260
261     fn size_hint(&self) -> (usize, Option<usize>) {
262         self.it.size_hint()
263     }
264
265     fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R where
266         Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
267     {
268         self.it.try_fold(init, move |acc, elt| f(acc, elt.clone()))
269     }
270
271     fn fold<Acc, F>(self, init: Acc, mut f: F) -> Acc
272         where F: FnMut(Acc, Self::Item) -> Acc,
273     {
274         self.it.fold(init, move |acc, elt| f(acc, elt.clone()))
275     }
276 }
277
278 #[stable(feature = "iter_cloned", since = "1.1.0")]
279 impl<'a, I, T: 'a> DoubleEndedIterator for Cloned<I>
280     where I: DoubleEndedIterator<Item=&'a T>, T: Clone
281 {
282     fn next_back(&mut self) -> Option<T> {
283         self.it.next_back().cloned()
284     }
285
286     fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R where
287         Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
288     {
289         self.it.try_rfold(init, move |acc, elt| f(acc, elt.clone()))
290     }
291
292     fn rfold<Acc, F>(self, init: Acc, mut f: F) -> Acc
293         where F: FnMut(Acc, Self::Item) -> Acc,
294     {
295         self.it.rfold(init, move |acc, elt| f(acc, elt.clone()))
296     }
297 }
298
299 #[stable(feature = "iter_cloned", since = "1.1.0")]
300 impl<'a, I, T: 'a> ExactSizeIterator for Cloned<I>
301     where I: ExactSizeIterator<Item=&'a T>, T: Clone
302 {
303     fn len(&self) -> usize {
304         self.it.len()
305     }
306
307     fn is_empty(&self) -> bool {
308         self.it.is_empty()
309     }
310 }
311
312 #[stable(feature = "fused", since = "1.26.0")]
313 impl<'a, I, T: 'a> FusedIterator for Cloned<I>
314     where I: FusedIterator<Item=&'a T>, T: Clone
315 {}
316
317 #[doc(hidden)]
318 unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
319     where I: TrustedRandomAccess<Item=&'a T>, T: Clone
320 {
321     default unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
322         self.it.get_unchecked(i).clone()
323     }
324
325     #[inline]
326     default fn may_have_side_effect() -> bool { true }
327 }
328
329 #[doc(hidden)]
330 unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
331     where I: TrustedRandomAccess<Item=&'a T>, T: Copy
332 {
333     unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
334         *self.it.get_unchecked(i)
335     }
336
337     #[inline]
338     fn may_have_side_effect() -> bool {
339         I::may_have_side_effect()
340     }
341 }
342
343 #[unstable(feature = "trusted_len", issue = "37572")]
344 unsafe impl<'a, I, T: 'a> TrustedLen for Cloned<I>
345     where I: TrustedLen<Item=&'a T>,
346           T: Clone
347 {}
348
349 /// An iterator that repeats endlessly.
350 ///
351 /// This `struct` is created by the [`cycle`] method on [`Iterator`]. See its
352 /// documentation for more.
353 ///
354 /// [`cycle`]: trait.Iterator.html#method.cycle
355 /// [`Iterator`]: trait.Iterator.html
356 #[derive(Clone, Debug)]
357 #[must_use = "iterators are lazy and do nothing unless consumed"]
358 #[stable(feature = "rust1", since = "1.0.0")]
359 pub struct Cycle<I> {
360     orig: I,
361     iter: I,
362 }
363 impl<I: Clone> Cycle<I> {
364     pub(super) fn new(iter: I) -> Cycle<I> {
365         Cycle { orig: iter.clone(), iter }
366     }
367 }
368
369 #[stable(feature = "rust1", since = "1.0.0")]
370 impl<I> Iterator for Cycle<I> where I: Clone + Iterator {
371     type Item = <I as Iterator>::Item;
372
373     #[inline]
374     fn next(&mut self) -> Option<<I as Iterator>::Item> {
375         match self.iter.next() {
376             None => { self.iter = self.orig.clone(); self.iter.next() }
377             y => y
378         }
379     }
380
381     #[inline]
382     fn size_hint(&self) -> (usize, Option<usize>) {
383         // the cycle iterator is either empty or infinite
384         match self.orig.size_hint() {
385             sz @ (0, Some(0)) => sz,
386             (0, _) => (0, None),
387             _ => (usize::MAX, None)
388         }
389     }
390 }
391
392 #[stable(feature = "fused", since = "1.26.0")]
393 impl<I> FusedIterator for Cycle<I> where I: Clone + Iterator {}
394
395 /// An iterator for stepping iterators by a custom amount.
396 ///
397 /// This `struct` is created by the [`step_by`] method on [`Iterator`]. See
398 /// its documentation for more.
399 ///
400 /// [`step_by`]: trait.Iterator.html#method.step_by
401 /// [`Iterator`]: trait.Iterator.html
402 #[must_use = "iterators are lazy and do nothing unless consumed"]
403 #[stable(feature = "iterator_step_by", since = "1.28.0")]
404 #[derive(Clone, Debug)]
405 pub struct StepBy<I> {
406     iter: I,
407     step: usize,
408     first_take: bool,
409 }
410 impl<I> StepBy<I> {
411     pub(super) fn new(iter: I, step: usize) -> StepBy<I> {
412         assert!(step != 0);
413         StepBy { iter, step: step - 1, first_take: true }
414     }
415 }
416
417 #[stable(feature = "iterator_step_by", since = "1.28.0")]
418 impl<I> Iterator for StepBy<I> where I: Iterator {
419     type Item = I::Item;
420
421     #[inline]
422     fn next(&mut self) -> Option<Self::Item> {
423         if self.first_take {
424             self.first_take = false;
425             self.iter.next()
426         } else {
427             self.iter.nth(self.step)
428         }
429     }
430
431     #[inline]
432     fn size_hint(&self) -> (usize, Option<usize>) {
433         let inner_hint = self.iter.size_hint();
434
435         if self.first_take {
436             let f = |n| if n == 0 { 0 } else { 1 + (n-1)/(self.step+1) };
437             (f(inner_hint.0), inner_hint.1.map(f))
438         } else {
439             let f = |n| n / (self.step+1);
440             (f(inner_hint.0), inner_hint.1.map(f))
441         }
442     }
443
444     #[inline]
445     fn nth(&mut self, mut n: usize) -> Option<Self::Item> {
446         if self.first_take {
447             self.first_take = false;
448             let first = self.iter.next();
449             if n == 0 {
450                 return first;
451             }
452             n -= 1;
453         }
454         // n and self.step are indices, we need to add 1 to get the amount of elements
455         // When calling `.nth`, we need to subtract 1 again to convert back to an index
456         // step + 1 can't overflow because `.step_by` sets `self.step` to `step - 1`
457         let mut step = self.step + 1;
458         // n + 1 could overflow
459         // thus, if n is usize::MAX, instead of adding one, we call .nth(step)
460         if n == usize::MAX {
461             self.iter.nth(step - 1);
462         } else {
463             n += 1;
464         }
465
466         // overflow handling
467         loop {
468             let mul = n.checked_mul(step);
469             if unsafe { intrinsics::likely(mul.is_some()) } {
470                 return self.iter.nth(mul.unwrap() - 1);
471             }
472             let div_n = usize::MAX / n;
473             let div_step = usize::MAX / step;
474             let nth_n = div_n * n;
475             let nth_step = div_step * step;
476             let nth = if nth_n > nth_step {
477                 step -= div_n;
478                 nth_n
479             } else {
480                 n -= div_step;
481                 nth_step
482             };
483             self.iter.nth(nth - 1);
484         }
485     }
486 }
487
488 // StepBy can only make the iterator shorter, so the len will still fit.
489 #[stable(feature = "iterator_step_by", since = "1.28.0")]
490 impl<I> ExactSizeIterator for StepBy<I> where I: ExactSizeIterator {}
491
492 /// An iterator that maps the values of `iter` with `f`.
493 ///
494 /// This `struct` is created by the [`map`] method on [`Iterator`]. See its
495 /// documentation for more.
496 ///
497 /// [`map`]: trait.Iterator.html#method.map
498 /// [`Iterator`]: trait.Iterator.html
499 ///
500 /// # Notes about side effects
501 ///
502 /// The [`map`] iterator implements [`DoubleEndedIterator`], meaning that
503 /// you can also [`map`] backwards:
504 ///
505 /// ```rust
506 /// let v: Vec<i32> = vec![1, 2, 3].into_iter().map(|x| x + 1).rev().collect();
507 ///
508 /// assert_eq!(v, [4, 3, 2]);
509 /// ```
510 ///
511 /// [`DoubleEndedIterator`]: trait.DoubleEndedIterator.html
512 ///
513 /// But if your closure has state, iterating backwards may act in a way you do
514 /// not expect. Let's go through an example. First, in the forward direction:
515 ///
516 /// ```rust
517 /// let mut c = 0;
518 ///
519 /// for pair in vec!['a', 'b', 'c'].into_iter()
520 ///                                .map(|letter| { c += 1; (letter, c) }) {
521 ///     println!("{:?}", pair);
522 /// }
523 /// ```
524 ///
525 /// This will print "('a', 1), ('b', 2), ('c', 3)".
526 ///
527 /// Now consider this twist where we add a call to `rev`. This version will
528 /// print `('c', 1), ('b', 2), ('a', 3)`. Note that the letters are reversed,
529 /// but the values of the counter still go in order. This is because `map()` is
530 /// still being called lazily on each item, but we are popping items off the
531 /// back of the vector now, instead of shifting them from the front.
532 ///
533 /// ```rust
534 /// let mut c = 0;
535 ///
536 /// for pair in vec!['a', 'b', 'c'].into_iter()
537 ///                                .map(|letter| { c += 1; (letter, c) })
538 ///                                .rev() {
539 ///     println!("{:?}", pair);
540 /// }
541 /// ```
542 #[must_use = "iterators are lazy and do nothing unless consumed"]
543 #[stable(feature = "rust1", since = "1.0.0")]
544 #[derive(Clone)]
545 pub struct Map<I, F> {
546     iter: I,
547     f: F,
548 }
549 impl<I, F> Map<I, F> {
550     pub(super) fn new(iter: I, f: F) -> Map<I, F> {
551         Map { iter, f }
552     }
553 }
554
555 #[stable(feature = "core_impl_debug", since = "1.9.0")]
556 impl<I: fmt::Debug, F> fmt::Debug for Map<I, F> {
557     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
558         f.debug_struct("Map")
559             .field("iter", &self.iter)
560             .finish()
561     }
562 }
563
564 #[stable(feature = "rust1", since = "1.0.0")]
565 impl<B, I: Iterator, F> Iterator for Map<I, F> where F: FnMut(I::Item) -> B {
566     type Item = B;
567
568     #[inline]
569     fn next(&mut self) -> Option<B> {
570         self.iter.next().map(&mut self.f)
571     }
572
573     #[inline]
574     fn size_hint(&self) -> (usize, Option<usize>) {
575         self.iter.size_hint()
576     }
577
578     fn try_fold<Acc, G, R>(&mut self, init: Acc, mut g: G) -> R where
579         Self: Sized, G: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
580     {
581         let f = &mut self.f;
582         self.iter.try_fold(init, move |acc, elt| g(acc, f(elt)))
583     }
584
585     fn fold<Acc, G>(self, init: Acc, mut g: G) -> Acc
586         where G: FnMut(Acc, Self::Item) -> Acc,
587     {
588         let mut f = self.f;
589         self.iter.fold(init, move |acc, elt| g(acc, f(elt)))
590     }
591 }
592
593 #[stable(feature = "rust1", since = "1.0.0")]
594 impl<B, I: DoubleEndedIterator, F> DoubleEndedIterator for Map<I, F> where
595     F: FnMut(I::Item) -> B,
596 {
597     #[inline]
598     fn next_back(&mut self) -> Option<B> {
599         self.iter.next_back().map(&mut self.f)
600     }
601
602     fn try_rfold<Acc, G, R>(&mut self, init: Acc, mut g: G) -> R where
603         Self: Sized, G: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
604     {
605         let f = &mut self.f;
606         self.iter.try_rfold(init, move |acc, elt| g(acc, f(elt)))
607     }
608
609     fn rfold<Acc, G>(self, init: Acc, mut g: G) -> Acc
610         where G: FnMut(Acc, Self::Item) -> Acc,
611     {
612         let mut f = self.f;
613         self.iter.rfold(init, move |acc, elt| g(acc, f(elt)))
614     }
615 }
616
617 #[stable(feature = "rust1", since = "1.0.0")]
618 impl<B, I: ExactSizeIterator, F> ExactSizeIterator for Map<I, F>
619     where F: FnMut(I::Item) -> B
620 {
621     fn len(&self) -> usize {
622         self.iter.len()
623     }
624
625     fn is_empty(&self) -> bool {
626         self.iter.is_empty()
627     }
628 }
629
630 #[stable(feature = "fused", since = "1.26.0")]
631 impl<B, I: FusedIterator, F> FusedIterator for Map<I, F>
632     where F: FnMut(I::Item) -> B {}
633
634 #[unstable(feature = "trusted_len", issue = "37572")]
635 unsafe impl<B, I, F> TrustedLen for Map<I, F>
636     where I: TrustedLen,
637           F: FnMut(I::Item) -> B {}
638
639 #[doc(hidden)]
640 unsafe impl<B, I, F> TrustedRandomAccess for Map<I, F>
641     where I: TrustedRandomAccess,
642           F: FnMut(I::Item) -> B,
643 {
644     unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
645         (self.f)(self.iter.get_unchecked(i))
646     }
647     #[inline]
648     fn may_have_side_effect() -> bool { true }
649 }
650
651 /// An iterator that filters the elements of `iter` with `predicate`.
652 ///
653 /// This `struct` is created by the [`filter`] method on [`Iterator`]. See its
654 /// documentation for more.
655 ///
656 /// [`filter`]: trait.Iterator.html#method.filter
657 /// [`Iterator`]: trait.Iterator.html
658 #[must_use = "iterators are lazy and do nothing unless consumed"]
659 #[stable(feature = "rust1", since = "1.0.0")]
660 #[derive(Clone)]
661 pub struct Filter<I, P> {
662     iter: I,
663     predicate: P,
664 }
665 impl<I, P> Filter<I, P> {
666     pub(super) fn new(iter: I, predicate: P) -> Filter<I, P> {
667         Filter { iter, predicate }
668     }
669 }
670
671 #[stable(feature = "core_impl_debug", since = "1.9.0")]
672 impl<I: fmt::Debug, P> fmt::Debug for Filter<I, P> {
673     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
674         f.debug_struct("Filter")
675             .field("iter", &self.iter)
676             .finish()
677     }
678 }
679
680 #[stable(feature = "rust1", since = "1.0.0")]
681 impl<I: Iterator, P> Iterator for Filter<I, P> where P: FnMut(&I::Item) -> bool {
682     type Item = I::Item;
683
684     #[inline]
685     fn next(&mut self) -> Option<I::Item> {
686         self.try_for_each(Err).err()
687     }
688
689     #[inline]
690     fn size_hint(&self) -> (usize, Option<usize>) {
691         let (_, upper) = self.iter.size_hint();
692         (0, upper) // can't know a lower bound, due to the predicate
693     }
694
695     // this special case allows the compiler to make `.filter(_).count()`
696     // branchless. Barring perfect branch prediction (which is unattainable in
697     // the general case), this will be much faster in >90% of cases (containing
698     // virtually all real workloads) and only a tiny bit slower in the rest.
699     //
700     // Having this specialization thus allows us to write `.filter(p).count()`
701     // where we would otherwise write `.map(|x| p(x) as usize).sum()`, which is
702     // less readable and also less backwards-compatible to Rust before 1.10.
703     //
704     // Using the branchless version will also simplify the LLVM byte code, thus
705     // leaving more budget for LLVM optimizations.
706     #[inline]
707     fn count(self) -> usize {
708         let mut predicate = self.predicate;
709         self.iter.map(|x| predicate(&x) as usize).sum()
710     }
711
712     #[inline]
713     fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
714         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
715     {
716         let predicate = &mut self.predicate;
717         self.iter.try_fold(init, move |acc, item| if predicate(&item) {
718             fold(acc, item)
719         } else {
720             Try::from_ok(acc)
721         })
722     }
723
724     #[inline]
725     fn fold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
726         where Fold: FnMut(Acc, Self::Item) -> Acc,
727     {
728         let mut predicate = self.predicate;
729         self.iter.fold(init, move |acc, item| if predicate(&item) {
730             fold(acc, item)
731         } else {
732             acc
733         })
734     }
735 }
736
737 #[stable(feature = "rust1", since = "1.0.0")]
738 impl<I: DoubleEndedIterator, P> DoubleEndedIterator for Filter<I, P>
739     where P: FnMut(&I::Item) -> bool,
740 {
741     #[inline]
742     fn next_back(&mut self) -> Option<I::Item> {
743         self.try_rfold((), |_, x| Err(x)).err()
744     }
745
746     #[inline]
747     fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
748         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
749     {
750         let predicate = &mut self.predicate;
751         self.iter.try_rfold(init, move |acc, item| if predicate(&item) {
752             fold(acc, item)
753         } else {
754             Try::from_ok(acc)
755         })
756     }
757
758     #[inline]
759     fn rfold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
760         where Fold: FnMut(Acc, Self::Item) -> Acc,
761     {
762         let mut predicate = self.predicate;
763         self.iter.rfold(init, move |acc, item| if predicate(&item) {
764             fold(acc, item)
765         } else {
766             acc
767         })
768     }
769 }
770
771 #[stable(feature = "fused", since = "1.26.0")]
772 impl<I: FusedIterator, P> FusedIterator for Filter<I, P>
773     where P: FnMut(&I::Item) -> bool {}
774
775 /// An iterator that uses `f` to both filter and map elements from `iter`.
776 ///
777 /// This `struct` is created by the [`filter_map`] method on [`Iterator`]. See its
778 /// documentation for more.
779 ///
780 /// [`filter_map`]: trait.Iterator.html#method.filter_map
781 /// [`Iterator`]: trait.Iterator.html
782 #[must_use = "iterators are lazy and do nothing unless consumed"]
783 #[stable(feature = "rust1", since = "1.0.0")]
784 #[derive(Clone)]
785 pub struct FilterMap<I, F> {
786     iter: I,
787     f: F,
788 }
789 impl<I, F> FilterMap<I, F> {
790     pub(super) fn new(iter: I, f: F) -> FilterMap<I, F> {
791         FilterMap { iter, f }
792     }
793 }
794
795 #[stable(feature = "core_impl_debug", since = "1.9.0")]
796 impl<I: fmt::Debug, F> fmt::Debug for FilterMap<I, F> {
797     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
798         f.debug_struct("FilterMap")
799             .field("iter", &self.iter)
800             .finish()
801     }
802 }
803
804 #[stable(feature = "rust1", since = "1.0.0")]
805 impl<B, I: Iterator, F> Iterator for FilterMap<I, F>
806     where F: FnMut(I::Item) -> Option<B>,
807 {
808     type Item = B;
809
810     #[inline]
811     fn next(&mut self) -> Option<B> {
812         self.try_for_each(Err).err()
813     }
814
815     #[inline]
816     fn size_hint(&self) -> (usize, Option<usize>) {
817         let (_, upper) = self.iter.size_hint();
818         (0, upper) // can't know a lower bound, due to the predicate
819     }
820
821     #[inline]
822     fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
823         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
824     {
825         let f = &mut self.f;
826         self.iter.try_fold(init, move |acc, item| match f(item) {
827             Some(x) => fold(acc, x),
828             None => Try::from_ok(acc),
829         })
830     }
831
832     #[inline]
833     fn fold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
834         where Fold: FnMut(Acc, Self::Item) -> Acc,
835     {
836         let mut f = self.f;
837         self.iter.fold(init, move |acc, item| match f(item) {
838             Some(x) => fold(acc, x),
839             None => acc,
840         })
841     }
842 }
843
844 #[stable(feature = "rust1", since = "1.0.0")]
845 impl<B, I: DoubleEndedIterator, F> DoubleEndedIterator for FilterMap<I, F>
846     where F: FnMut(I::Item) -> Option<B>,
847 {
848     #[inline]
849     fn next_back(&mut self) -> Option<B> {
850         self.try_rfold((), |_, x| Err(x)).err()
851     }
852
853     #[inline]
854     fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
855         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
856     {
857         let f = &mut self.f;
858         self.iter.try_rfold(init, move |acc, item| match f(item) {
859             Some(x) => fold(acc, x),
860             None => Try::from_ok(acc),
861         })
862     }
863
864     #[inline]
865     fn rfold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
866         where Fold: FnMut(Acc, Self::Item) -> Acc,
867     {
868         let mut f = self.f;
869         self.iter.rfold(init, move |acc, item| match f(item) {
870             Some(x) => fold(acc, x),
871             None => acc,
872         })
873     }
874 }
875
876 #[stable(feature = "fused", since = "1.26.0")]
877 impl<B, I: FusedIterator, F> FusedIterator for FilterMap<I, F>
878     where F: FnMut(I::Item) -> Option<B> {}
879
880 /// An iterator that yields the current count and the element during iteration.
881 ///
882 /// This `struct` is created by the [`enumerate`] method on [`Iterator`]. See its
883 /// documentation for more.
884 ///
885 /// [`enumerate`]: trait.Iterator.html#method.enumerate
886 /// [`Iterator`]: trait.Iterator.html
887 #[derive(Clone, Debug)]
888 #[must_use = "iterators are lazy and do nothing unless consumed"]
889 #[stable(feature = "rust1", since = "1.0.0")]
890 pub struct Enumerate<I> {
891     iter: I,
892     count: usize,
893 }
894 impl<I> Enumerate<I> {
895     pub(super) fn new(iter: I) -> Enumerate<I> {
896         Enumerate { iter, count: 0 }
897     }
898 }
899
900 #[stable(feature = "rust1", since = "1.0.0")]
901 impl<I> Iterator for Enumerate<I> where I: Iterator {
902     type Item = (usize, <I as Iterator>::Item);
903
904     /// # Overflow Behavior
905     ///
906     /// The method does no guarding against overflows, so enumerating more than
907     /// `usize::MAX` elements either produces the wrong result or panics. If
908     /// debug assertions are enabled, a panic is guaranteed.
909     ///
910     /// # Panics
911     ///
912     /// Might panic if the index of the element overflows a `usize`.
913     #[inline]
914     #[rustc_inherit_overflow_checks]
915     fn next(&mut self) -> Option<(usize, <I as Iterator>::Item)> {
916         self.iter.next().map(|a| {
917             let ret = (self.count, a);
918             // Possible undefined overflow.
919             self.count += 1;
920             ret
921         })
922     }
923
924     #[inline]
925     fn size_hint(&self) -> (usize, Option<usize>) {
926         self.iter.size_hint()
927     }
928
929     #[inline]
930     #[rustc_inherit_overflow_checks]
931     fn nth(&mut self, n: usize) -> Option<(usize, I::Item)> {
932         self.iter.nth(n).map(|a| {
933             let i = self.count + n;
934             self.count = i + 1;
935             (i, a)
936         })
937     }
938
939     #[inline]
940     fn count(self) -> usize {
941         self.iter.count()
942     }
943
944     #[inline]
945     #[rustc_inherit_overflow_checks]
946     fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
947         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
948     {
949         let count = &mut self.count;
950         self.iter.try_fold(init, move |acc, item| {
951             let acc = fold(acc, (*count, item));
952             *count += 1;
953             acc
954         })
955     }
956
957     #[inline]
958     #[rustc_inherit_overflow_checks]
959     fn fold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
960         where Fold: FnMut(Acc, Self::Item) -> Acc,
961     {
962         let mut count = self.count;
963         self.iter.fold(init, move |acc, item| {
964             let acc = fold(acc, (count, item));
965             count += 1;
966             acc
967         })
968     }
969 }
970
971 #[stable(feature = "rust1", since = "1.0.0")]
972 impl<I> DoubleEndedIterator for Enumerate<I> where
973     I: ExactSizeIterator + DoubleEndedIterator
974 {
975     #[inline]
976     fn next_back(&mut self) -> Option<(usize, <I as Iterator>::Item)> {
977         self.iter.next_back().map(|a| {
978             let len = self.iter.len();
979             // Can safely add, `ExactSizeIterator` promises that the number of
980             // elements fits into a `usize`.
981             (self.count + len, a)
982         })
983     }
984
985     #[inline]
986     fn nth_back(&mut self, n: usize) -> Option<(usize, <I as Iterator>::Item)> {
987         self.iter.nth_back(n).map(|a| {
988             let len = self.iter.len();
989             // Can safely add, `ExactSizeIterator` promises that the number of
990             // elements fits into a `usize`.
991             (self.count + len, a)
992         })
993     }
994
995     #[inline]
996     fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
997         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
998     {
999         // Can safely add and subtract the count, as `ExactSizeIterator` promises
1000         // that the number of elements fits into a `usize`.
1001         let mut count = self.count + self.iter.len();
1002         self.iter.try_rfold(init, move |acc, item| {
1003             count -= 1;
1004             fold(acc, (count, item))
1005         })
1006     }
1007
1008     #[inline]
1009     fn rfold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
1010         where Fold: FnMut(Acc, Self::Item) -> Acc,
1011     {
1012         // Can safely add and subtract the count, as `ExactSizeIterator` promises
1013         // that the number of elements fits into a `usize`.
1014         let mut count = self.count + self.iter.len();
1015         self.iter.rfold(init, move |acc, item| {
1016             count -= 1;
1017             fold(acc, (count, item))
1018         })
1019     }
1020 }
1021
1022 #[stable(feature = "rust1", since = "1.0.0")]
1023 impl<I> ExactSizeIterator for Enumerate<I> where I: ExactSizeIterator {
1024     fn len(&self) -> usize {
1025         self.iter.len()
1026     }
1027
1028     fn is_empty(&self) -> bool {
1029         self.iter.is_empty()
1030     }
1031 }
1032
1033 #[doc(hidden)]
1034 unsafe impl<I> TrustedRandomAccess for Enumerate<I>
1035     where I: TrustedRandomAccess
1036 {
1037     unsafe fn get_unchecked(&mut self, i: usize) -> (usize, I::Item) {
1038         (self.count + i, self.iter.get_unchecked(i))
1039     }
1040
1041     fn may_have_side_effect() -> bool {
1042         I::may_have_side_effect()
1043     }
1044 }
1045
1046 #[stable(feature = "fused", since = "1.26.0")]
1047 impl<I> FusedIterator for Enumerate<I> where I: FusedIterator {}
1048
1049 #[unstable(feature = "trusted_len", issue = "37572")]
1050 unsafe impl<I> TrustedLen for Enumerate<I>
1051     where I: TrustedLen,
1052 {}
1053
1054
1055 /// An iterator with a `peek()` that returns an optional reference to the next
1056 /// element.
1057 ///
1058 /// This `struct` is created by the [`peekable`] method on [`Iterator`]. See its
1059 /// documentation for more.
1060 ///
1061 /// [`peekable`]: trait.Iterator.html#method.peekable
1062 /// [`Iterator`]: trait.Iterator.html
1063 #[derive(Clone, Debug)]
1064 #[must_use = "iterators are lazy and do nothing unless consumed"]
1065 #[stable(feature = "rust1", since = "1.0.0")]
1066 pub struct Peekable<I: Iterator> {
1067     iter: I,
1068     /// Remember a peeked value, even if it was None.
1069     peeked: Option<Option<I::Item>>,
1070 }
1071 impl<I: Iterator> Peekable<I> {
1072     pub(super) fn new(iter: I) -> Peekable<I> {
1073         Peekable { iter, peeked: None }
1074     }
1075 }
1076
1077 // Peekable must remember if a None has been seen in the `.peek()` method.
1078 // It ensures that `.peek(); .peek();` or `.peek(); .next();` only advances the
1079 // underlying iterator at most once. This does not by itself make the iterator
1080 // fused.
1081 #[stable(feature = "rust1", since = "1.0.0")]
1082 impl<I: Iterator> Iterator for Peekable<I> {
1083     type Item = I::Item;
1084
1085     #[inline]
1086     fn next(&mut self) -> Option<I::Item> {
1087         match self.peeked.take() {
1088             Some(v) => v,
1089             None => self.iter.next(),
1090         }
1091     }
1092
1093     #[inline]
1094     #[rustc_inherit_overflow_checks]
1095     fn count(mut self) -> usize {
1096         match self.peeked.take() {
1097             Some(None) => 0,
1098             Some(Some(_)) => 1 + self.iter.count(),
1099             None => self.iter.count(),
1100         }
1101     }
1102
1103     #[inline]
1104     fn nth(&mut self, n: usize) -> Option<I::Item> {
1105         match self.peeked.take() {
1106             Some(None) => None,
1107             Some(v @ Some(_)) if n == 0 => v,
1108             Some(Some(_)) => self.iter.nth(n - 1),
1109             None => self.iter.nth(n),
1110         }
1111     }
1112
1113     #[inline]
1114     fn last(mut self) -> Option<I::Item> {
1115         let peek_opt = match self.peeked.take() {
1116             Some(None) => return None,
1117             Some(v) => v,
1118             None => None,
1119         };
1120         self.iter.last().or(peek_opt)
1121     }
1122
1123     #[inline]
1124     fn size_hint(&self) -> (usize, Option<usize>) {
1125         let peek_len = match self.peeked {
1126             Some(None) => return (0, Some(0)),
1127             Some(Some(_)) => 1,
1128             None => 0,
1129         };
1130         let (lo, hi) = self.iter.size_hint();
1131         let lo = lo.saturating_add(peek_len);
1132         let hi = hi.and_then(|x| x.checked_add(peek_len));
1133         (lo, hi)
1134     }
1135
1136     #[inline]
1137     fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R where
1138         Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
1139     {
1140         let acc = match self.peeked.take() {
1141             Some(None) => return Try::from_ok(init),
1142             Some(Some(v)) => f(init, v)?,
1143             None => init,
1144         };
1145         self.iter.try_fold(acc, f)
1146     }
1147
1148     #[inline]
1149     fn fold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
1150         where Fold: FnMut(Acc, Self::Item) -> Acc,
1151     {
1152         let acc = match self.peeked {
1153             Some(None) => return init,
1154             Some(Some(v)) => fold(init, v),
1155             None => init,
1156         };
1157         self.iter.fold(acc, fold)
1158     }
1159 }
1160
1161 #[stable(feature = "rust1", since = "1.0.0")]
1162 impl<I: ExactSizeIterator> ExactSizeIterator for Peekable<I> {}
1163
1164 #[stable(feature = "fused", since = "1.26.0")]
1165 impl<I: FusedIterator> FusedIterator for Peekable<I> {}
1166
1167 impl<I: Iterator> Peekable<I> {
1168     /// Returns a reference to the next() value without advancing the iterator.
1169     ///
1170     /// Like [`next`], if there is a value, it is wrapped in a `Some(T)`.
1171     /// But if the iteration is over, `None` is returned.
1172     ///
1173     /// [`next`]: trait.Iterator.html#tymethod.next
1174     ///
1175     /// Because `peek()` returns a reference, and many iterators iterate over
1176     /// references, there can be a possibly confusing situation where the
1177     /// return value is a double reference. You can see this effect in the
1178     /// examples below.
1179     ///
1180     /// # Examples
1181     ///
1182     /// Basic usage:
1183     ///
1184     /// ```
1185     /// let xs = [1, 2, 3];
1186     ///
1187     /// let mut iter = xs.iter().peekable();
1188     ///
1189     /// // peek() lets us see into the future
1190     /// assert_eq!(iter.peek(), Some(&&1));
1191     /// assert_eq!(iter.next(), Some(&1));
1192     ///
1193     /// assert_eq!(iter.next(), Some(&2));
1194     ///
1195     /// // The iterator does not advance even if we `peek` multiple times
1196     /// assert_eq!(iter.peek(), Some(&&3));
1197     /// assert_eq!(iter.peek(), Some(&&3));
1198     ///
1199     /// assert_eq!(iter.next(), Some(&3));
1200     ///
1201     /// // After the iterator is finished, so is `peek()`
1202     /// assert_eq!(iter.peek(), None);
1203     /// assert_eq!(iter.next(), None);
1204     /// ```
1205     #[inline]
1206     #[stable(feature = "rust1", since = "1.0.0")]
1207     pub fn peek(&mut self) -> Option<&I::Item> {
1208         let iter = &mut self.iter;
1209         self.peeked.get_or_insert_with(|| iter.next()).as_ref()
1210     }
1211 }
1212
1213 /// An iterator that rejects elements while `predicate` returns `true`.
1214 ///
1215 /// This `struct` is created by the [`skip_while`] method on [`Iterator`]. See its
1216 /// documentation for more.
1217 ///
1218 /// [`skip_while`]: trait.Iterator.html#method.skip_while
1219 /// [`Iterator`]: trait.Iterator.html
1220 #[must_use = "iterators are lazy and do nothing unless consumed"]
1221 #[stable(feature = "rust1", since = "1.0.0")]
1222 #[derive(Clone)]
1223 pub struct SkipWhile<I, P> {
1224     iter: I,
1225     flag: bool,
1226     predicate: P,
1227 }
1228 impl<I, P> SkipWhile<I, P> {
1229     pub(super) fn new(iter: I, predicate: P) -> SkipWhile<I, P> {
1230         SkipWhile { iter, flag: false, predicate }
1231     }
1232 }
1233
1234 #[stable(feature = "core_impl_debug", since = "1.9.0")]
1235 impl<I: fmt::Debug, P> fmt::Debug for SkipWhile<I, P> {
1236     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1237         f.debug_struct("SkipWhile")
1238             .field("iter", &self.iter)
1239             .field("flag", &self.flag)
1240             .finish()
1241     }
1242 }
1243
1244 #[stable(feature = "rust1", since = "1.0.0")]
1245 impl<I: Iterator, P> Iterator for SkipWhile<I, P>
1246     where P: FnMut(&I::Item) -> bool
1247 {
1248     type Item = I::Item;
1249
1250     #[inline]
1251     fn next(&mut self) -> Option<I::Item> {
1252         let flag = &mut self.flag;
1253         let pred = &mut self.predicate;
1254         self.iter.find(move |x| {
1255             if *flag || !pred(x) {
1256                 *flag = true;
1257                 true
1258             } else {
1259                 false
1260             }
1261         })
1262     }
1263
1264     #[inline]
1265     fn size_hint(&self) -> (usize, Option<usize>) {
1266         let (_, upper) = self.iter.size_hint();
1267         (0, upper) // can't know a lower bound, due to the predicate
1268     }
1269
1270     #[inline]
1271     fn try_fold<Acc, Fold, R>(&mut self, mut init: Acc, mut fold: Fold) -> R where
1272         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1273     {
1274         if !self.flag {
1275             match self.next() {
1276                 Some(v) => init = fold(init, v)?,
1277                 None => return Try::from_ok(init),
1278             }
1279         }
1280         self.iter.try_fold(init, fold)
1281     }
1282
1283     #[inline]
1284     fn fold<Acc, Fold>(mut self, mut init: Acc, mut fold: Fold) -> Acc
1285         where Fold: FnMut(Acc, Self::Item) -> Acc,
1286     {
1287         if !self.flag {
1288             match self.next() {
1289                 Some(v) => init = fold(init, v),
1290                 None => return init,
1291             }
1292         }
1293         self.iter.fold(init, fold)
1294     }
1295 }
1296
1297 #[stable(feature = "fused", since = "1.26.0")]
1298 impl<I, P> FusedIterator for SkipWhile<I, P>
1299     where I: FusedIterator, P: FnMut(&I::Item) -> bool {}
1300
1301 /// An iterator that only accepts elements while `predicate` returns `true`.
1302 ///
1303 /// This `struct` is created by the [`take_while`] method on [`Iterator`]. See its
1304 /// documentation for more.
1305 ///
1306 /// [`take_while`]: trait.Iterator.html#method.take_while
1307 /// [`Iterator`]: trait.Iterator.html
1308 #[must_use = "iterators are lazy and do nothing unless consumed"]
1309 #[stable(feature = "rust1", since = "1.0.0")]
1310 #[derive(Clone)]
1311 pub struct TakeWhile<I, P> {
1312     iter: I,
1313     flag: bool,
1314     predicate: P,
1315 }
1316 impl<I, P> TakeWhile<I, P> {
1317     pub(super) fn new(iter: I, predicate: P) -> TakeWhile<I, P> {
1318         TakeWhile { iter, flag: false, predicate }
1319     }
1320 }
1321
1322 #[stable(feature = "core_impl_debug", since = "1.9.0")]
1323 impl<I: fmt::Debug, P> fmt::Debug for TakeWhile<I, P> {
1324     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1325         f.debug_struct("TakeWhile")
1326             .field("iter", &self.iter)
1327             .field("flag", &self.flag)
1328             .finish()
1329     }
1330 }
1331
1332 #[stable(feature = "rust1", since = "1.0.0")]
1333 impl<I: Iterator, P> Iterator for TakeWhile<I, P>
1334     where P: FnMut(&I::Item) -> bool
1335 {
1336     type Item = I::Item;
1337
1338     #[inline]
1339     fn next(&mut self) -> Option<I::Item> {
1340         if self.flag {
1341             None
1342         } else {
1343             self.iter.next().and_then(|x| {
1344                 if (self.predicate)(&x) {
1345                     Some(x)
1346                 } else {
1347                     self.flag = true;
1348                     None
1349                 }
1350             })
1351         }
1352     }
1353
1354     #[inline]
1355     fn size_hint(&self) -> (usize, Option<usize>) {
1356         if self.flag {
1357             (0, Some(0))
1358         } else {
1359             let (_, upper) = self.iter.size_hint();
1360             (0, upper) // can't know a lower bound, due to the predicate
1361         }
1362     }
1363
1364     #[inline]
1365     fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
1366         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1367     {
1368         if self.flag {
1369             Try::from_ok(init)
1370         } else {
1371             let flag = &mut self.flag;
1372             let p = &mut self.predicate;
1373             self.iter.try_fold(init, move |acc, x|{
1374                 if p(&x) {
1375                     LoopState::from_try(fold(acc, x))
1376                 } else {
1377                     *flag = true;
1378                     LoopState::Break(Try::from_ok(acc))
1379                 }
1380             }).into_try()
1381         }
1382     }
1383 }
1384
1385 #[stable(feature = "fused", since = "1.26.0")]
1386 impl<I, P> FusedIterator for TakeWhile<I, P>
1387     where I: FusedIterator, P: FnMut(&I::Item) -> bool {}
1388
1389 /// An iterator that skips over `n` elements of `iter`.
1390 ///
1391 /// This `struct` is created by the [`skip`] method on [`Iterator`]. See its
1392 /// documentation for more.
1393 ///
1394 /// [`skip`]: trait.Iterator.html#method.skip
1395 /// [`Iterator`]: trait.Iterator.html
1396 #[derive(Clone, Debug)]
1397 #[must_use = "iterators are lazy and do nothing unless consumed"]
1398 #[stable(feature = "rust1", since = "1.0.0")]
1399 pub struct Skip<I> {
1400     iter: I,
1401     n: usize
1402 }
1403 impl<I> Skip<I> {
1404     pub(super) fn new(iter: I, n: usize) -> Skip<I> {
1405         Skip { iter, n }
1406     }
1407 }
1408
1409 #[stable(feature = "rust1", since = "1.0.0")]
1410 impl<I> Iterator for Skip<I> where I: Iterator {
1411     type Item = <I as Iterator>::Item;
1412
1413     #[inline]
1414     fn next(&mut self) -> Option<I::Item> {
1415         if self.n == 0 {
1416             self.iter.next()
1417         } else {
1418             let old_n = self.n;
1419             self.n = 0;
1420             self.iter.nth(old_n)
1421         }
1422     }
1423
1424     #[inline]
1425     fn nth(&mut self, n: usize) -> Option<I::Item> {
1426         // Can't just add n + self.n due to overflow.
1427         if self.n == 0 {
1428             self.iter.nth(n)
1429         } else {
1430             let to_skip = self.n;
1431             self.n = 0;
1432             // nth(n) skips n+1
1433             if self.iter.nth(to_skip-1).is_none() {
1434                 return None;
1435             }
1436             self.iter.nth(n)
1437         }
1438     }
1439
1440     #[inline]
1441     fn count(self) -> usize {
1442         self.iter.count().saturating_sub(self.n)
1443     }
1444
1445     #[inline]
1446     fn last(mut self) -> Option<I::Item> {
1447         if self.n == 0 {
1448             self.iter.last()
1449         } else {
1450             let next = self.next();
1451             if next.is_some() {
1452                 // recurse. n should be 0.
1453                 self.last().or(next)
1454             } else {
1455                 None
1456             }
1457         }
1458     }
1459
1460     #[inline]
1461     fn size_hint(&self) -> (usize, Option<usize>) {
1462         let (lower, upper) = self.iter.size_hint();
1463
1464         let lower = lower.saturating_sub(self.n);
1465         let upper = upper.map(|x| x.saturating_sub(self.n));
1466
1467         (lower, upper)
1468     }
1469
1470     #[inline]
1471     fn try_fold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
1472         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1473     {
1474         let n = self.n;
1475         self.n = 0;
1476         if n > 0 {
1477             // nth(n) skips n+1
1478             if self.iter.nth(n - 1).is_none() {
1479                 return Try::from_ok(init);
1480             }
1481         }
1482         self.iter.try_fold(init, fold)
1483     }
1484
1485     #[inline]
1486     fn fold<Acc, Fold>(mut self, init: Acc, fold: Fold) -> Acc
1487         where Fold: FnMut(Acc, Self::Item) -> Acc,
1488     {
1489         if self.n > 0 {
1490             // nth(n) skips n+1
1491             if self.iter.nth(self.n - 1).is_none() {
1492                 return init;
1493             }
1494         }
1495         self.iter.fold(init, fold)
1496     }
1497 }
1498
1499 #[stable(feature = "rust1", since = "1.0.0")]
1500 impl<I> ExactSizeIterator for Skip<I> where I: ExactSizeIterator {}
1501
1502 #[stable(feature = "double_ended_skip_iterator", since = "1.9.0")]
1503 impl<I> DoubleEndedIterator for Skip<I> where I: DoubleEndedIterator + ExactSizeIterator {
1504     fn next_back(&mut self) -> Option<Self::Item> {
1505         if self.len() > 0 {
1506             self.iter.next_back()
1507         } else {
1508             None
1509         }
1510     }
1511
1512     #[inline]
1513     fn nth_back(&mut self, n: usize) -> Option<I::Item> {
1514         let len = self.len();
1515         if n < len {
1516             self.iter.nth_back(n)
1517         } else {
1518             if len > 0 {
1519                 // consume the original iterator
1520                 self.iter.nth_back(len-1);
1521             }
1522             None
1523         }
1524     }
1525
1526     fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
1527         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1528     {
1529         let mut n = self.len();
1530         if n == 0 {
1531             Try::from_ok(init)
1532         } else {
1533             self.iter.try_rfold(init, move |acc, x| {
1534                 n -= 1;
1535                 let r = fold(acc, x);
1536                 if n == 0 { LoopState::Break(r) }
1537                 else { LoopState::from_try(r) }
1538             }).into_try()
1539         }
1540     }
1541 }
1542
1543 #[stable(feature = "fused", since = "1.26.0")]
1544 impl<I> FusedIterator for Skip<I> where I: FusedIterator {}
1545
1546 /// An iterator that only iterates over the first `n` iterations of `iter`.
1547 ///
1548 /// This `struct` is created by the [`take`] method on [`Iterator`]. See its
1549 /// documentation for more.
1550 ///
1551 /// [`take`]: trait.Iterator.html#method.take
1552 /// [`Iterator`]: trait.Iterator.html
1553 #[derive(Clone, Debug)]
1554 #[must_use = "iterators are lazy and do nothing unless consumed"]
1555 #[stable(feature = "rust1", since = "1.0.0")]
1556 pub struct Take<I> {
1557     pub(super) iter: I,
1558     pub(super) n: usize
1559 }
1560 impl<I> Take<I> {
1561     pub(super) fn new(iter: I, n: usize) -> Take<I> {
1562         Take { iter, n }
1563     }
1564 }
1565
1566 #[stable(feature = "rust1", since = "1.0.0")]
1567 impl<I> Iterator for Take<I> where I: Iterator{
1568     type Item = <I as Iterator>::Item;
1569
1570     #[inline]
1571     fn next(&mut self) -> Option<<I as Iterator>::Item> {
1572         if self.n != 0 {
1573             self.n -= 1;
1574             self.iter.next()
1575         } else {
1576             None
1577         }
1578     }
1579
1580     #[inline]
1581     fn nth(&mut self, n: usize) -> Option<I::Item> {
1582         if self.n > n {
1583             self.n -= n + 1;
1584             self.iter.nth(n)
1585         } else {
1586             if self.n > 0 {
1587                 self.iter.nth(self.n - 1);
1588                 self.n = 0;
1589             }
1590             None
1591         }
1592     }
1593
1594     #[inline]
1595     fn size_hint(&self) -> (usize, Option<usize>) {
1596         if self.n == 0 {
1597             return (0, Some(0));
1598         }
1599
1600         let (lower, upper) = self.iter.size_hint();
1601
1602         let lower = cmp::min(lower, self.n);
1603
1604         let upper = match upper {
1605             Some(x) if x < self.n => Some(x),
1606             _ => Some(self.n)
1607         };
1608
1609         (lower, upper)
1610     }
1611
1612     #[inline]
1613     fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
1614         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1615     {
1616         if self.n == 0 {
1617             Try::from_ok(init)
1618         } else {
1619             let n = &mut self.n;
1620             self.iter.try_fold(init, move |acc, x| {
1621                 *n -= 1;
1622                 let r = fold(acc, x);
1623                 if *n == 0 { LoopState::Break(r) }
1624                 else { LoopState::from_try(r) }
1625             }).into_try()
1626         }
1627     }
1628 }
1629
1630 #[stable(feature = "rust1", since = "1.0.0")]
1631 impl<I> ExactSizeIterator for Take<I> where I: ExactSizeIterator {}
1632
1633 #[stable(feature = "fused", since = "1.26.0")]
1634 impl<I> FusedIterator for Take<I> where I: FusedIterator {}
1635
1636 #[unstable(feature = "trusted_len", issue = "37572")]
1637 unsafe impl<I: TrustedLen> TrustedLen for Take<I> {}
1638
1639 /// An iterator to maintain state while iterating another iterator.
1640 ///
1641 /// This `struct` is created by the [`scan`] method on [`Iterator`]. See its
1642 /// documentation for more.
1643 ///
1644 /// [`scan`]: trait.Iterator.html#method.scan
1645 /// [`Iterator`]: trait.Iterator.html
1646 #[must_use = "iterators are lazy and do nothing unless consumed"]
1647 #[stable(feature = "rust1", since = "1.0.0")]
1648 #[derive(Clone)]
1649 pub struct Scan<I, St, F> {
1650     iter: I,
1651     f: F,
1652     state: St,
1653 }
1654 impl<I, St, F> Scan<I, St, F> {
1655     pub(super) fn new(iter: I, state: St, f: F) -> Scan<I, St, F> {
1656         Scan { iter, state, f }
1657     }
1658 }
1659
1660 #[stable(feature = "core_impl_debug", since = "1.9.0")]
1661 impl<I: fmt::Debug, St: fmt::Debug, F> fmt::Debug for Scan<I, St, F> {
1662     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1663         f.debug_struct("Scan")
1664             .field("iter", &self.iter)
1665             .field("state", &self.state)
1666             .finish()
1667     }
1668 }
1669
1670 #[stable(feature = "rust1", since = "1.0.0")]
1671 impl<B, I, St, F> Iterator for Scan<I, St, F> where
1672     I: Iterator,
1673     F: FnMut(&mut St, I::Item) -> Option<B>,
1674 {
1675     type Item = B;
1676
1677     #[inline]
1678     fn next(&mut self) -> Option<B> {
1679         self.iter.next().and_then(|a| (self.f)(&mut self.state, a))
1680     }
1681
1682     #[inline]
1683     fn size_hint(&self) -> (usize, Option<usize>) {
1684         let (_, upper) = self.iter.size_hint();
1685         (0, upper) // can't know a lower bound, due to the scan function
1686     }
1687
1688     #[inline]
1689     fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
1690         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1691     {
1692         let state = &mut self.state;
1693         let f = &mut self.f;
1694         self.iter.try_fold(init, move |acc, x| {
1695             match f(state, x) {
1696                 None => LoopState::Break(Try::from_ok(acc)),
1697                 Some(x) => LoopState::from_try(fold(acc, x)),
1698             }
1699         }).into_try()
1700     }
1701 }
1702
1703 /// An iterator that yields `None` forever after the underlying iterator
1704 /// yields `None` once.
1705 ///
1706 /// This `struct` is created by the [`fuse`] method on [`Iterator`]. See its
1707 /// documentation for more.
1708 ///
1709 /// [`fuse`]: trait.Iterator.html#method.fuse
1710 /// [`Iterator`]: trait.Iterator.html
1711 #[derive(Clone, Debug)]
1712 #[must_use = "iterators are lazy and do nothing unless consumed"]
1713 #[stable(feature = "rust1", since = "1.0.0")]
1714 pub struct Fuse<I> {
1715     iter: I,
1716     done: bool
1717 }
1718 impl<I> Fuse<I> {
1719     pub(super) fn new(iter: I) -> Fuse<I> {
1720         Fuse { iter, done: false }
1721     }
1722 }
1723
1724 #[stable(feature = "fused", since = "1.26.0")]
1725 impl<I> FusedIterator for Fuse<I> where I: Iterator {}
1726
1727 #[stable(feature = "rust1", since = "1.0.0")]
1728 impl<I> Iterator for Fuse<I> where I: Iterator {
1729     type Item = <I as Iterator>::Item;
1730
1731     #[inline]
1732     default fn next(&mut self) -> Option<<I as Iterator>::Item> {
1733         if self.done {
1734             None
1735         } else {
1736             let next = self.iter.next();
1737             self.done = next.is_none();
1738             next
1739         }
1740     }
1741
1742     #[inline]
1743     default fn nth(&mut self, n: usize) -> Option<I::Item> {
1744         if self.done {
1745             None
1746         } else {
1747             let nth = self.iter.nth(n);
1748             self.done = nth.is_none();
1749             nth
1750         }
1751     }
1752
1753     #[inline]
1754     default fn last(self) -> Option<I::Item> {
1755         if self.done {
1756             None
1757         } else {
1758             self.iter.last()
1759         }
1760     }
1761
1762     #[inline]
1763     default fn count(self) -> usize {
1764         if self.done {
1765             0
1766         } else {
1767             self.iter.count()
1768         }
1769     }
1770
1771     #[inline]
1772     default fn size_hint(&self) -> (usize, Option<usize>) {
1773         if self.done {
1774             (0, Some(0))
1775         } else {
1776             self.iter.size_hint()
1777         }
1778     }
1779
1780     #[inline]
1781     default fn try_fold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
1782         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1783     {
1784         if self.done {
1785             Try::from_ok(init)
1786         } else {
1787             let acc = self.iter.try_fold(init, fold)?;
1788             self.done = true;
1789             Try::from_ok(acc)
1790         }
1791     }
1792
1793     #[inline]
1794     default fn fold<Acc, Fold>(self, init: Acc, fold: Fold) -> Acc
1795         where Fold: FnMut(Acc, Self::Item) -> Acc,
1796     {
1797         if self.done {
1798             init
1799         } else {
1800             self.iter.fold(init, fold)
1801         }
1802     }
1803 }
1804
1805 #[stable(feature = "rust1", since = "1.0.0")]
1806 impl<I> DoubleEndedIterator for Fuse<I> where I: DoubleEndedIterator {
1807     #[inline]
1808     default fn next_back(&mut self) -> Option<<I as Iterator>::Item> {
1809         if self.done {
1810             None
1811         } else {
1812             let next = self.iter.next_back();
1813             self.done = next.is_none();
1814             next
1815         }
1816     }
1817
1818     #[inline]
1819     default fn nth_back(&mut self, n: usize) -> Option<<I as Iterator>::Item> {
1820         if self.done {
1821             None
1822         } else {
1823             let nth = self.iter.nth_back(n);
1824             self.done = nth.is_none();
1825             nth
1826         }
1827     }
1828
1829     #[inline]
1830     default fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
1831         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1832     {
1833         if self.done {
1834             Try::from_ok(init)
1835         } else {
1836             let acc = self.iter.try_rfold(init, fold)?;
1837             self.done = true;
1838             Try::from_ok(acc)
1839         }
1840     }
1841
1842     #[inline]
1843     default fn rfold<Acc, Fold>(self, init: Acc, fold: Fold) -> Acc
1844         where Fold: FnMut(Acc, Self::Item) -> Acc,
1845     {
1846         if self.done {
1847             init
1848         } else {
1849             self.iter.rfold(init, fold)
1850         }
1851     }
1852 }
1853
1854 unsafe impl<I> TrustedRandomAccess for Fuse<I>
1855     where I: TrustedRandomAccess,
1856 {
1857     unsafe fn get_unchecked(&mut self, i: usize) -> I::Item {
1858         self.iter.get_unchecked(i)
1859     }
1860
1861     fn may_have_side_effect() -> bool {
1862         I::may_have_side_effect()
1863     }
1864 }
1865
1866 #[stable(feature = "fused", since = "1.26.0")]
1867 impl<I> Iterator for Fuse<I> where I: FusedIterator {
1868     #[inline]
1869     fn next(&mut self) -> Option<<I as Iterator>::Item> {
1870         self.iter.next()
1871     }
1872
1873     #[inline]
1874     fn nth(&mut self, n: usize) -> Option<I::Item> {
1875         self.iter.nth(n)
1876     }
1877
1878     #[inline]
1879     fn last(self) -> Option<I::Item> {
1880         self.iter.last()
1881     }
1882
1883     #[inline]
1884     fn count(self) -> usize {
1885         self.iter.count()
1886     }
1887
1888     #[inline]
1889     fn size_hint(&self) -> (usize, Option<usize>) {
1890         self.iter.size_hint()
1891     }
1892
1893     #[inline]
1894     fn try_fold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
1895         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1896     {
1897         self.iter.try_fold(init, fold)
1898     }
1899
1900     #[inline]
1901     fn fold<Acc, Fold>(self, init: Acc, fold: Fold) -> Acc
1902         where Fold: FnMut(Acc, Self::Item) -> Acc,
1903     {
1904         self.iter.fold(init, fold)
1905     }
1906 }
1907
1908 #[stable(feature = "fused", since = "1.26.0")]
1909 impl<I> DoubleEndedIterator for Fuse<I>
1910     where I: DoubleEndedIterator + FusedIterator
1911 {
1912     #[inline]
1913     fn next_back(&mut self) -> Option<<I as Iterator>::Item> {
1914         self.iter.next_back()
1915     }
1916
1917     #[inline]
1918     fn nth_back(&mut self, n: usize) -> Option<<I as Iterator>::Item> {
1919         self.iter.nth_back(n)
1920     }
1921
1922     #[inline]
1923     fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
1924         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1925     {
1926         self.iter.try_rfold(init, fold)
1927     }
1928
1929     #[inline]
1930     fn rfold<Acc, Fold>(self, init: Acc, fold: Fold) -> Acc
1931         where Fold: FnMut(Acc, Self::Item) -> Acc,
1932     {
1933         self.iter.rfold(init, fold)
1934     }
1935 }
1936
1937
1938 #[stable(feature = "rust1", since = "1.0.0")]
1939 impl<I> ExactSizeIterator for Fuse<I> where I: ExactSizeIterator {
1940     fn len(&self) -> usize {
1941         self.iter.len()
1942     }
1943
1944     fn is_empty(&self) -> bool {
1945         self.iter.is_empty()
1946     }
1947 }
1948
1949 /// An iterator that calls a function with a reference to each element before
1950 /// yielding it.
1951 ///
1952 /// This `struct` is created by the [`inspect`] method on [`Iterator`]. See its
1953 /// documentation for more.
1954 ///
1955 /// [`inspect`]: trait.Iterator.html#method.inspect
1956 /// [`Iterator`]: trait.Iterator.html
1957 #[must_use = "iterators are lazy and do nothing unless consumed"]
1958 #[stable(feature = "rust1", since = "1.0.0")]
1959 #[derive(Clone)]
1960 pub struct Inspect<I, F> {
1961     iter: I,
1962     f: F,
1963 }
1964 impl<I, F> Inspect<I, F> {
1965     pub(super) fn new(iter: I, f: F) -> Inspect<I, F> {
1966         Inspect { iter, f }
1967     }
1968 }
1969
1970 #[stable(feature = "core_impl_debug", since = "1.9.0")]
1971 impl<I: fmt::Debug, F> fmt::Debug for Inspect<I, F> {
1972     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1973         f.debug_struct("Inspect")
1974             .field("iter", &self.iter)
1975             .finish()
1976     }
1977 }
1978
1979 impl<I: Iterator, F> Inspect<I, F> where F: FnMut(&I::Item) {
1980     #[inline]
1981     fn do_inspect(&mut self, elt: Option<I::Item>) -> Option<I::Item> {
1982         if let Some(ref a) = elt {
1983             (self.f)(a);
1984         }
1985
1986         elt
1987     }
1988 }
1989
1990 #[stable(feature = "rust1", since = "1.0.0")]
1991 impl<I: Iterator, F> Iterator for Inspect<I, F> where F: FnMut(&I::Item) {
1992     type Item = I::Item;
1993
1994     #[inline]
1995     fn next(&mut self) -> Option<I::Item> {
1996         let next = self.iter.next();
1997         self.do_inspect(next)
1998     }
1999
2000     #[inline]
2001     fn size_hint(&self) -> (usize, Option<usize>) {
2002         self.iter.size_hint()
2003     }
2004
2005     #[inline]
2006     fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
2007         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
2008     {
2009         let f = &mut self.f;
2010         self.iter.try_fold(init, move |acc, item| { f(&item); fold(acc, item) })
2011     }
2012
2013     #[inline]
2014     fn fold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
2015         where Fold: FnMut(Acc, Self::Item) -> Acc,
2016     {
2017         let mut f = self.f;
2018         self.iter.fold(init, move |acc, item| { f(&item); fold(acc, item) })
2019     }
2020 }
2021
2022 #[stable(feature = "rust1", since = "1.0.0")]
2023 impl<I: DoubleEndedIterator, F> DoubleEndedIterator for Inspect<I, F>
2024     where F: FnMut(&I::Item),
2025 {
2026     #[inline]
2027     fn next_back(&mut self) -> Option<I::Item> {
2028         let next = self.iter.next_back();
2029         self.do_inspect(next)
2030     }
2031
2032     #[inline]
2033     fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
2034         Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
2035     {
2036         let f = &mut self.f;
2037         self.iter.try_rfold(init, move |acc, item| { f(&item); fold(acc, item) })
2038     }
2039
2040     #[inline]
2041     fn rfold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
2042         where Fold: FnMut(Acc, Self::Item) -> Acc,
2043     {
2044         let mut f = self.f;
2045         self.iter.rfold(init, move |acc, item| { f(&item); fold(acc, item) })
2046     }
2047 }
2048
2049 #[stable(feature = "rust1", since = "1.0.0")]
2050 impl<I: ExactSizeIterator, F> ExactSizeIterator for Inspect<I, F>
2051     where F: FnMut(&I::Item)
2052 {
2053     fn len(&self) -> usize {
2054         self.iter.len()
2055     }
2056
2057     fn is_empty(&self) -> bool {
2058         self.iter.is_empty()
2059     }
2060 }
2061
2062 #[stable(feature = "fused", since = "1.26.0")]
2063 impl<I: FusedIterator, F> FusedIterator for Inspect<I, F>
2064     where F: FnMut(&I::Item) {}
2065
2066 /// An iterator adapter that produces output as long as the underlying
2067 /// iterator produces `Option::Some` values.
2068 pub(crate) struct OptionShunt<I> {
2069     iter: I,
2070     exited_early: bool,
2071 }
2072
2073 impl<I, T> OptionShunt<I>
2074 where
2075     I: Iterator<Item = Option<T>>,
2076 {
2077     /// Process the given iterator as if it yielded a `T` instead of a
2078     /// `Option<T>`. Any `None` value will stop the inner iterator and
2079     /// the overall result will be a `None`.
2080     pub fn process<F, U>(iter: I, mut f: F) -> Option<U>
2081     where
2082         F: FnMut(&mut Self) -> U,
2083     {
2084         let mut shunt = OptionShunt::new(iter);
2085         let value = f(shunt.by_ref());
2086         shunt.reconstruct(value)
2087     }
2088
2089     fn new(iter: I) -> Self {
2090         OptionShunt {
2091             iter,
2092             exited_early: false,
2093         }
2094     }
2095
2096     /// Consume the adapter and rebuild a `Option` value.
2097     fn reconstruct<U>(self, val: U) -> Option<U> {
2098         if self.exited_early {
2099             None
2100         } else {
2101             Some(val)
2102         }
2103     }
2104 }
2105
2106 impl<I, T> Iterator for OptionShunt<I>
2107 where
2108     I: Iterator<Item = Option<T>>,
2109 {
2110     type Item = T;
2111
2112     fn next(&mut self) -> Option<Self::Item> {
2113         match self.iter.next() {
2114             Some(Some(v)) => Some(v),
2115             Some(None) => {
2116                 self.exited_early = true;
2117                 None
2118             }
2119             None => None,
2120         }
2121     }
2122
2123     fn size_hint(&self) -> (usize, Option<usize>) {
2124         if self.exited_early {
2125             (0, Some(0))
2126         } else {
2127             let (_, upper) = self.iter.size_hint();
2128             (0, upper)
2129         }
2130     }
2131 }
2132
2133 /// An iterator adapter that produces output as long as the underlying
2134 /// iterator produces `Result::Ok` values.
2135 ///
2136 /// If an error is encountered, the iterator stops and the error is
2137 /// stored. The error may be recovered later via `reconstruct`.
2138 pub(crate) struct ResultShunt<I, E> {
2139     iter: I,
2140     error: Option<E>,
2141 }
2142
2143 impl<I, T, E> ResultShunt<I, E>
2144     where I: Iterator<Item = Result<T, E>>
2145 {
2146     /// Process the given iterator as if it yielded a `T` instead of a
2147     /// `Result<T, _>`. Any errors will stop the inner iterator and
2148     /// the overall result will be an error.
2149     pub fn process<F, U>(iter: I, mut f: F) -> Result<U, E>
2150         where F: FnMut(&mut Self) -> U
2151     {
2152         let mut shunt = ResultShunt::new(iter);
2153         let value = f(shunt.by_ref());
2154         shunt.reconstruct(value)
2155     }
2156
2157     fn new(iter: I) -> Self {
2158         ResultShunt {
2159             iter,
2160             error: None,
2161         }
2162     }
2163
2164     /// Consume the adapter and rebuild a `Result` value. This should
2165     /// *always* be called, otherwise any potential error would be
2166     /// lost.
2167     fn reconstruct<U>(self, val: U) -> Result<U, E> {
2168         match self.error {
2169             None => Ok(val),
2170             Some(e) => Err(e),
2171         }
2172     }
2173 }
2174
2175 impl<I, T, E> Iterator for ResultShunt<I, E>
2176     where I: Iterator<Item = Result<T, E>>
2177 {
2178     type Item = T;
2179
2180     fn next(&mut self) -> Option<Self::Item> {
2181         match self.iter.next() {
2182             Some(Ok(v)) => Some(v),
2183             Some(Err(e)) => {
2184                 self.error = Some(e);
2185                 None
2186             }
2187             None => None,
2188         }
2189     }
2190
2191     fn size_hint(&self) -> (usize, Option<usize>) {
2192         if self.error.is_some() {
2193             (0, Some(0))
2194         } else {
2195             let (_, upper) = self.iter.size_hint();
2196             (0, upper)
2197         }
2198     }
2199 }