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