core/iter/traits/
iterator.rs

1use super::super::{
2    ArrayChunks, ByRefSized, Chain, Cloned, Copied, Cycle, Enumerate, Filter, FilterMap, FlatMap,
3    Flatten, Fuse, Inspect, Intersperse, IntersperseWith, Map, MapWhile, MapWindows, Peekable,
4    Product, Rev, Scan, Skip, SkipWhile, StepBy, Sum, Take, TakeWhile, TrustedRandomAccessNoCoerce,
5    Zip, try_process,
6};
7use crate::array;
8use crate::cmp::{self, Ordering};
9use crate::num::NonZero;
10use crate::ops::{ChangeOutputType, ControlFlow, FromResidual, Residual, Try};
11
12fn _assert_is_dyn_compatible(_: &dyn Iterator<Item = ()>) {}
13
14/// A trait for dealing with iterators.
15///
16/// This is the main iterator trait. For more about the concept of iterators
17/// generally, please see the [module-level documentation]. In particular, you
18/// may want to know how to [implement `Iterator`][impl].
19///
20/// [module-level documentation]: crate::iter
21/// [impl]: crate::iter#implementing-iterator
22#[stable(feature = "rust1", since = "1.0.0")]
23#[rustc_on_unimplemented(
24    on(
25        _Self = "core::ops::range::RangeTo<Idx>",
26        note = "you might have meant to use a bounded `Range`"
27    ),
28    on(
29        _Self = "core::ops::range::RangeToInclusive<Idx>",
30        note = "you might have meant to use a bounded `RangeInclusive`"
31    ),
32    label = "`{Self}` is not an iterator",
33    message = "`{Self}` is not an iterator"
34)]
35#[doc(notable_trait)]
36#[lang = "iterator"]
37#[rustc_diagnostic_item = "Iterator"]
38#[must_use = "iterators are lazy and do nothing unless consumed"]
39pub trait Iterator {
40    /// The type of the elements being iterated over.
41    #[rustc_diagnostic_item = "IteratorItem"]
42    #[stable(feature = "rust1", since = "1.0.0")]
43    type Item;
44
45    /// Advances the iterator and returns the next value.
46    ///
47    /// Returns [`None`] when iteration is finished. Individual iterator
48    /// implementations may choose to resume iteration, and so calling `next()`
49    /// again may or may not eventually start returning [`Some(Item)`] again at some
50    /// point.
51    ///
52    /// [`Some(Item)`]: Some
53    ///
54    /// # Examples
55    ///
56    /// ```
57    /// let a = [1, 2, 3];
58    ///
59    /// let mut iter = a.iter();
60    ///
61    /// // A call to next() returns the next value...
62    /// assert_eq!(Some(&1), iter.next());
63    /// assert_eq!(Some(&2), iter.next());
64    /// assert_eq!(Some(&3), iter.next());
65    ///
66    /// // ... and then None once it's over.
67    /// assert_eq!(None, iter.next());
68    ///
69    /// // More calls may or may not return `None`. Here, they always will.
70    /// assert_eq!(None, iter.next());
71    /// assert_eq!(None, iter.next());
72    /// ```
73    #[lang = "next"]
74    #[stable(feature = "rust1", since = "1.0.0")]
75    fn next(&mut self) -> Option<Self::Item>;
76
77    /// Advances the iterator and returns an array containing the next `N` values.
78    ///
79    /// If there are not enough elements to fill the array then `Err` is returned
80    /// containing an iterator over the remaining elements.
81    ///
82    /// # Examples
83    ///
84    /// Basic usage:
85    ///
86    /// ```
87    /// #![feature(iter_next_chunk)]
88    ///
89    /// let mut iter = "lorem".chars();
90    ///
91    /// assert_eq!(iter.next_chunk().unwrap(), ['l', 'o']);              // N is inferred as 2
92    /// assert_eq!(iter.next_chunk().unwrap(), ['r', 'e', 'm']);         // N is inferred as 3
93    /// assert_eq!(iter.next_chunk::<4>().unwrap_err().as_slice(), &[]); // N is explicitly 4
94    /// ```
95    ///
96    /// Split a string and get the first three items.
97    ///
98    /// ```
99    /// #![feature(iter_next_chunk)]
100    ///
101    /// let quote = "not all those who wander are lost";
102    /// let [first, second, third] = quote.split_whitespace().next_chunk().unwrap();
103    /// assert_eq!(first, "not");
104    /// assert_eq!(second, "all");
105    /// assert_eq!(third, "those");
106    /// ```
107    #[inline]
108    #[unstable(feature = "iter_next_chunk", reason = "recently added", issue = "98326")]
109    fn next_chunk<const N: usize>(
110        &mut self,
111    ) -> Result<[Self::Item; N], array::IntoIter<Self::Item, N>>
112    where
113        Self: Sized,
114    {
115        array::iter_next_chunk(self)
116    }
117
118    /// Returns the bounds on the remaining length of the iterator.
119    ///
120    /// Specifically, `size_hint()` returns a tuple where the first element
121    /// is the lower bound, and the second element is the upper bound.
122    ///
123    /// The second half of the tuple that is returned is an <code>[Option]<[usize]></code>.
124    /// A [`None`] here means that either there is no known upper bound, or the
125    /// upper bound is larger than [`usize`].
126    ///
127    /// # Implementation notes
128    ///
129    /// It is not enforced that an iterator implementation yields the declared
130    /// number of elements. A buggy iterator may yield less than the lower bound
131    /// or more than the upper bound of elements.
132    ///
133    /// `size_hint()` is primarily intended to be used for optimizations such as
134    /// reserving space for the elements of the iterator, but must not be
135    /// trusted to e.g., omit bounds checks in unsafe code. An incorrect
136    /// implementation of `size_hint()` should not lead to memory safety
137    /// violations.
138    ///
139    /// That said, the implementation should provide a correct estimation,
140    /// because otherwise it would be a violation of the trait's protocol.
141    ///
142    /// The default implementation returns <code>(0, [None])</code> which is correct for any
143    /// iterator.
144    ///
145    /// # Examples
146    ///
147    /// Basic usage:
148    ///
149    /// ```
150    /// let a = [1, 2, 3];
151    /// let mut iter = a.iter();
152    ///
153    /// assert_eq!((3, Some(3)), iter.size_hint());
154    /// let _ = iter.next();
155    /// assert_eq!((2, Some(2)), iter.size_hint());
156    /// ```
157    ///
158    /// A more complex example:
159    ///
160    /// ```
161    /// // The even numbers in the range of zero to nine.
162    /// let iter = (0..10).filter(|x| x % 2 == 0);
163    ///
164    /// // We might iterate from zero to ten times. Knowing that it's five
165    /// // exactly wouldn't be possible without executing filter().
166    /// assert_eq!((0, Some(10)), iter.size_hint());
167    ///
168    /// // Let's add five more numbers with chain()
169    /// let iter = (0..10).filter(|x| x % 2 == 0).chain(15..20);
170    ///
171    /// // now both bounds are increased by five
172    /// assert_eq!((5, Some(15)), iter.size_hint());
173    /// ```
174    ///
175    /// Returning `None` for an upper bound:
176    ///
177    /// ```
178    /// // an infinite iterator has no upper bound
179    /// // and the maximum possible lower bound
180    /// let iter = 0..;
181    ///
182    /// assert_eq!((usize::MAX, None), iter.size_hint());
183    /// ```
184    #[inline]
185    #[stable(feature = "rust1", since = "1.0.0")]
186    fn size_hint(&self) -> (usize, Option<usize>) {
187        (0, None)
188    }
189
190    /// Consumes the iterator, counting the number of iterations and returning it.
191    ///
192    /// This method will call [`next`] repeatedly until [`None`] is encountered,
193    /// returning the number of times it saw [`Some`]. Note that [`next`] has to be
194    /// called at least once even if the iterator does not have any elements.
195    ///
196    /// [`next`]: Iterator::next
197    ///
198    /// # Overflow Behavior
199    ///
200    /// The method does no guarding against overflows, so counting elements of
201    /// an iterator with more than [`usize::MAX`] elements either produces the
202    /// wrong result or panics. If debug assertions are enabled, a panic is
203    /// guaranteed.
204    ///
205    /// # Panics
206    ///
207    /// This function might panic if the iterator has more than [`usize::MAX`]
208    /// elements.
209    ///
210    /// # Examples
211    ///
212    /// ```
213    /// let a = [1, 2, 3];
214    /// assert_eq!(a.iter().count(), 3);
215    ///
216    /// let a = [1, 2, 3, 4, 5];
217    /// assert_eq!(a.iter().count(), 5);
218    /// ```
219    #[inline]
220    #[stable(feature = "rust1", since = "1.0.0")]
221    fn count(self) -> usize
222    where
223        Self: Sized,
224    {
225        self.fold(
226            0,
227            #[rustc_inherit_overflow_checks]
228            |count, _| count + 1,
229        )
230    }
231
232    /// Consumes the iterator, returning the last element.
233    ///
234    /// This method will evaluate the iterator until it returns [`None`]. While
235    /// doing so, it keeps track of the current element. After [`None`] is
236    /// returned, `last()` will then return the last element it saw.
237    ///
238    /// # Examples
239    ///
240    /// ```
241    /// let a = [1, 2, 3];
242    /// assert_eq!(a.iter().last(), Some(&3));
243    ///
244    /// let a = [1, 2, 3, 4, 5];
245    /// assert_eq!(a.iter().last(), Some(&5));
246    /// ```
247    #[inline]
248    #[stable(feature = "rust1", since = "1.0.0")]
249    fn last(self) -> Option<Self::Item>
250    where
251        Self: Sized,
252    {
253        #[inline]
254        fn some<T>(_: Option<T>, x: T) -> Option<T> {
255            Some(x)
256        }
257
258        self.fold(None, some)
259    }
260
261    /// Advances the iterator by `n` elements.
262    ///
263    /// This method will eagerly skip `n` elements by calling [`next`] up to `n`
264    /// times until [`None`] is encountered.
265    ///
266    /// `advance_by(n)` will return `Ok(())` if the iterator successfully advances by
267    /// `n` elements, or a `Err(NonZero<usize>)` with value `k` if [`None`] is encountered,
268    /// where `k` is remaining number of steps that could not be advanced because the iterator ran out.
269    /// If `self` is empty and `n` is non-zero, then this returns `Err(n)`.
270    /// Otherwise, `k` is always less than `n`.
271    ///
272    /// Calling `advance_by(0)` can do meaningful work, for example [`Flatten`]
273    /// can advance its outer iterator until it finds an inner iterator that is not empty, which
274    /// then often allows it to return a more accurate `size_hint()` than in its initial state.
275    ///
276    /// [`Flatten`]: crate::iter::Flatten
277    /// [`next`]: Iterator::next
278    ///
279    /// # Examples
280    ///
281    /// ```
282    /// #![feature(iter_advance_by)]
283    ///
284    /// use std::num::NonZero;
285    ///
286    /// let a = [1, 2, 3, 4];
287    /// let mut iter = a.iter();
288    ///
289    /// assert_eq!(iter.advance_by(2), Ok(()));
290    /// assert_eq!(iter.next(), Some(&3));
291    /// assert_eq!(iter.advance_by(0), Ok(()));
292    /// assert_eq!(iter.advance_by(100), Err(NonZero::new(99).unwrap())); // only `&4` was skipped
293    /// ```
294    #[inline]
295    #[unstable(feature = "iter_advance_by", reason = "recently added", issue = "77404")]
296    fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>> {
297        for i in 0..n {
298            if self.next().is_none() {
299                // SAFETY: `i` is always less than `n`.
300                return Err(unsafe { NonZero::new_unchecked(n - i) });
301            }
302        }
303        Ok(())
304    }
305
306    /// Returns the `n`th element of the iterator.
307    ///
308    /// Like most indexing operations, the count starts from zero, so `nth(0)`
309    /// returns the first value, `nth(1)` the second, and so on.
310    ///
311    /// Note that all preceding elements, as well as the returned element, will be
312    /// consumed from the iterator. That means that the preceding elements will be
313    /// discarded, and also that calling `nth(0)` multiple times on the same iterator
314    /// will return different elements.
315    ///
316    /// `nth()` will return [`None`] if `n` is greater than or equal to the length of the
317    /// iterator.
318    ///
319    /// # Examples
320    ///
321    /// Basic usage:
322    ///
323    /// ```
324    /// let a = [1, 2, 3];
325    /// assert_eq!(a.iter().nth(1), Some(&2));
326    /// ```
327    ///
328    /// Calling `nth()` multiple times doesn't rewind the iterator:
329    ///
330    /// ```
331    /// let a = [1, 2, 3];
332    ///
333    /// let mut iter = a.iter();
334    ///
335    /// assert_eq!(iter.nth(1), Some(&2));
336    /// assert_eq!(iter.nth(1), None);
337    /// ```
338    ///
339    /// Returning `None` if there are less than `n + 1` elements:
340    ///
341    /// ```
342    /// let a = [1, 2, 3];
343    /// assert_eq!(a.iter().nth(10), None);
344    /// ```
345    #[inline]
346    #[stable(feature = "rust1", since = "1.0.0")]
347    fn nth(&mut self, n: usize) -> Option<Self::Item> {
348        self.advance_by(n).ok()?;
349        self.next()
350    }
351
352    /// Creates an iterator starting at the same point, but stepping by
353    /// the given amount at each iteration.
354    ///
355    /// Note 1: The first element of the iterator will always be returned,
356    /// regardless of the step given.
357    ///
358    /// Note 2: The time at which ignored elements are pulled is not fixed.
359    /// `StepBy` behaves like the sequence `self.next()`, `self.nth(step-1)`,
360    /// `self.nth(step-1)`, …, but is also free to behave like the sequence
361    /// `advance_n_and_return_first(&mut self, step)`,
362    /// `advance_n_and_return_first(&mut self, step)`, …
363    /// Which way is used may change for some iterators for performance reasons.
364    /// The second way will advance the iterator earlier and may consume more items.
365    ///
366    /// `advance_n_and_return_first` is the equivalent of:
367    /// ```
368    /// fn advance_n_and_return_first<I>(iter: &mut I, n: usize) -> Option<I::Item>
369    /// where
370    ///     I: Iterator,
371    /// {
372    ///     let next = iter.next();
373    ///     if n > 1 {
374    ///         iter.nth(n - 2);
375    ///     }
376    ///     next
377    /// }
378    /// ```
379    ///
380    /// # Panics
381    ///
382    /// The method will panic if the given step is `0`.
383    ///
384    /// # Examples
385    ///
386    /// ```
387    /// let a = [0, 1, 2, 3, 4, 5];
388    /// let mut iter = a.iter().step_by(2);
389    ///
390    /// assert_eq!(iter.next(), Some(&0));
391    /// assert_eq!(iter.next(), Some(&2));
392    /// assert_eq!(iter.next(), Some(&4));
393    /// assert_eq!(iter.next(), None);
394    /// ```
395    #[inline]
396    #[stable(feature = "iterator_step_by", since = "1.28.0")]
397    fn step_by(self, step: usize) -> StepBy<Self>
398    where
399        Self: Sized,
400    {
401        StepBy::new(self, step)
402    }
403
404    /// Takes two iterators and creates a new iterator over both in sequence.
405    ///
406    /// `chain()` will return a new iterator which will first iterate over
407    /// values from the first iterator and then over values from the second
408    /// iterator.
409    ///
410    /// In other words, it links two iterators together, in a chain. 🔗
411    ///
412    /// [`once`] is commonly used to adapt a single value into a chain of
413    /// other kinds of iteration.
414    ///
415    /// # Examples
416    ///
417    /// Basic usage:
418    ///
419    /// ```
420    /// let a1 = [1, 2, 3];
421    /// let a2 = [4, 5, 6];
422    ///
423    /// let mut iter = a1.iter().chain(a2.iter());
424    ///
425    /// assert_eq!(iter.next(), Some(&1));
426    /// assert_eq!(iter.next(), Some(&2));
427    /// assert_eq!(iter.next(), Some(&3));
428    /// assert_eq!(iter.next(), Some(&4));
429    /// assert_eq!(iter.next(), Some(&5));
430    /// assert_eq!(iter.next(), Some(&6));
431    /// assert_eq!(iter.next(), None);
432    /// ```
433    ///
434    /// Since the argument to `chain()` uses [`IntoIterator`], we can pass
435    /// anything that can be converted into an [`Iterator`], not just an
436    /// [`Iterator`] itself. For example, slices (`&[T]`) implement
437    /// [`IntoIterator`], and so can be passed to `chain()` directly:
438    ///
439    /// ```
440    /// let s1 = &[1, 2, 3];
441    /// let s2 = &[4, 5, 6];
442    ///
443    /// let mut iter = s1.iter().chain(s2);
444    ///
445    /// assert_eq!(iter.next(), Some(&1));
446    /// assert_eq!(iter.next(), Some(&2));
447    /// assert_eq!(iter.next(), Some(&3));
448    /// assert_eq!(iter.next(), Some(&4));
449    /// assert_eq!(iter.next(), Some(&5));
450    /// assert_eq!(iter.next(), Some(&6));
451    /// assert_eq!(iter.next(), None);
452    /// ```
453    ///
454    /// If you work with Windows API, you may wish to convert [`OsStr`] to `Vec<u16>`:
455    ///
456    /// ```
457    /// #[cfg(windows)]
458    /// fn os_str_to_utf16(s: &std::ffi::OsStr) -> Vec<u16> {
459    ///     use std::os::windows::ffi::OsStrExt;
460    ///     s.encode_wide().chain(std::iter::once(0)).collect()
461    /// }
462    /// ```
463    ///
464    /// [`once`]: crate::iter::once
465    /// [`OsStr`]: ../../std/ffi/struct.OsStr.html
466    #[inline]
467    #[stable(feature = "rust1", since = "1.0.0")]
468    fn chain<U>(self, other: U) -> Chain<Self, U::IntoIter>
469    where
470        Self: Sized,
471        U: IntoIterator<Item = Self::Item>,
472    {
473        Chain::new(self, other.into_iter())
474    }
475
476    /// 'Zips up' two iterators into a single iterator of pairs.
477    ///
478    /// `zip()` returns a new iterator that will iterate over two other
479    /// iterators, returning a tuple where the first element comes from the
480    /// first iterator, and the second element comes from the second iterator.
481    ///
482    /// In other words, it zips two iterators together, into a single one.
483    ///
484    /// If either iterator returns [`None`], [`next`] from the zipped iterator
485    /// will return [`None`].
486    /// If the zipped iterator has no more elements to return then each further attempt to advance
487    /// it will first try to advance the first iterator at most one time and if it still yielded an item
488    /// try to advance the second iterator at most one time.
489    ///
490    /// To 'undo' the result of zipping up two iterators, see [`unzip`].
491    ///
492    /// [`unzip`]: Iterator::unzip
493    ///
494    /// # Examples
495    ///
496    /// Basic usage:
497    ///
498    /// ```
499    /// let a1 = [1, 2, 3];
500    /// let a2 = [4, 5, 6];
501    ///
502    /// let mut iter = a1.iter().zip(a2.iter());
503    ///
504    /// assert_eq!(iter.next(), Some((&1, &4)));
505    /// assert_eq!(iter.next(), Some((&2, &5)));
506    /// assert_eq!(iter.next(), Some((&3, &6)));
507    /// assert_eq!(iter.next(), None);
508    /// ```
509    ///
510    /// Since the argument to `zip()` uses [`IntoIterator`], we can pass
511    /// anything that can be converted into an [`Iterator`], not just an
512    /// [`Iterator`] itself. For example, slices (`&[T]`) implement
513    /// [`IntoIterator`], and so can be passed to `zip()` directly:
514    ///
515    /// ```
516    /// let s1 = &[1, 2, 3];
517    /// let s2 = &[4, 5, 6];
518    ///
519    /// let mut iter = s1.iter().zip(s2);
520    ///
521    /// assert_eq!(iter.next(), Some((&1, &4)));
522    /// assert_eq!(iter.next(), Some((&2, &5)));
523    /// assert_eq!(iter.next(), Some((&3, &6)));
524    /// assert_eq!(iter.next(), None);
525    /// ```
526    ///
527    /// `zip()` is often used to zip an infinite iterator to a finite one.
528    /// This works because the finite iterator will eventually return [`None`],
529    /// ending the zipper. Zipping with `(0..)` can look a lot like [`enumerate`]:
530    ///
531    /// ```
532    /// let enumerate: Vec<_> = "foo".chars().enumerate().collect();
533    ///
534    /// let zipper: Vec<_> = (0..).zip("foo".chars()).collect();
535    ///
536    /// assert_eq!((0, 'f'), enumerate[0]);
537    /// assert_eq!((0, 'f'), zipper[0]);
538    ///
539    /// assert_eq!((1, 'o'), enumerate[1]);
540    /// assert_eq!((1, 'o'), zipper[1]);
541    ///
542    /// assert_eq!((2, 'o'), enumerate[2]);
543    /// assert_eq!((2, 'o'), zipper[2]);
544    /// ```
545    ///
546    /// If both iterators have roughly equivalent syntax, it may be more readable to use [`zip`]:
547    ///
548    /// ```
549    /// use std::iter::zip;
550    ///
551    /// let a = [1, 2, 3];
552    /// let b = [2, 3, 4];
553    ///
554    /// let mut zipped = zip(
555    ///     a.into_iter().map(|x| x * 2).skip(1),
556    ///     b.into_iter().map(|x| x * 2).skip(1),
557    /// );
558    ///
559    /// assert_eq!(zipped.next(), Some((4, 6)));
560    /// assert_eq!(zipped.next(), Some((6, 8)));
561    /// assert_eq!(zipped.next(), None);
562    /// ```
563    ///
564    /// compared to:
565    ///
566    /// ```
567    /// # let a = [1, 2, 3];
568    /// # let b = [2, 3, 4];
569    /// #
570    /// let mut zipped = a
571    ///     .into_iter()
572    ///     .map(|x| x * 2)
573    ///     .skip(1)
574    ///     .zip(b.into_iter().map(|x| x * 2).skip(1));
575    /// #
576    /// # assert_eq!(zipped.next(), Some((4, 6)));
577    /// # assert_eq!(zipped.next(), Some((6, 8)));
578    /// # assert_eq!(zipped.next(), None);
579    /// ```
580    ///
581    /// [`enumerate`]: Iterator::enumerate
582    /// [`next`]: Iterator::next
583    /// [`zip`]: crate::iter::zip
584    #[inline]
585    #[stable(feature = "rust1", since = "1.0.0")]
586    fn zip<U>(self, other: U) -> Zip<Self, U::IntoIter>
587    where
588        Self: Sized,
589        U: IntoIterator,
590    {
591        Zip::new(self, other.into_iter())
592    }
593
594    /// Creates a new iterator which places a copy of `separator` between adjacent
595    /// items of the original iterator.
596    ///
597    /// In case `separator` does not implement [`Clone`] or needs to be
598    /// computed every time, use [`intersperse_with`].
599    ///
600    /// # Examples
601    ///
602    /// Basic usage:
603    ///
604    /// ```
605    /// #![feature(iter_intersperse)]
606    ///
607    /// let mut a = [0, 1, 2].iter().intersperse(&100);
608    /// assert_eq!(a.next(), Some(&0));   // The first element from `a`.
609    /// assert_eq!(a.next(), Some(&100)); // The separator.
610    /// assert_eq!(a.next(), Some(&1));   // The next element from `a`.
611    /// assert_eq!(a.next(), Some(&100)); // The separator.
612    /// assert_eq!(a.next(), Some(&2));   // The last element from `a`.
613    /// assert_eq!(a.next(), None);       // The iterator is finished.
614    /// ```
615    ///
616    /// `intersperse` can be very useful to join an iterator's items using a common element:
617    /// ```
618    /// #![feature(iter_intersperse)]
619    ///
620    /// let hello = ["Hello", "World", "!"].iter().copied().intersperse(" ").collect::<String>();
621    /// assert_eq!(hello, "Hello World !");
622    /// ```
623    ///
624    /// [`Clone`]: crate::clone::Clone
625    /// [`intersperse_with`]: Iterator::intersperse_with
626    #[inline]
627    #[unstable(feature = "iter_intersperse", reason = "recently added", issue = "79524")]
628    fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
629    where
630        Self: Sized,
631        Self::Item: Clone,
632    {
633        Intersperse::new(self, separator)
634    }
635
636    /// Creates a new iterator which places an item generated by `separator`
637    /// between adjacent items of the original iterator.
638    ///
639    /// The closure will be called exactly once each time an item is placed
640    /// between two adjacent items from the underlying iterator; specifically,
641    /// the closure is not called if the underlying iterator yields less than
642    /// two items and after the last item is yielded.
643    ///
644    /// If the iterator's item implements [`Clone`], it may be easier to use
645    /// [`intersperse`].
646    ///
647    /// # Examples
648    ///
649    /// Basic usage:
650    ///
651    /// ```
652    /// #![feature(iter_intersperse)]
653    ///
654    /// #[derive(PartialEq, Debug)]
655    /// struct NotClone(usize);
656    ///
657    /// let v = [NotClone(0), NotClone(1), NotClone(2)];
658    /// let mut it = v.into_iter().intersperse_with(|| NotClone(99));
659    ///
660    /// assert_eq!(it.next(), Some(NotClone(0)));  // The first element from `v`.
661    /// assert_eq!(it.next(), Some(NotClone(99))); // The separator.
662    /// assert_eq!(it.next(), Some(NotClone(1)));  // The next element from `v`.
663    /// assert_eq!(it.next(), Some(NotClone(99))); // The separator.
664    /// assert_eq!(it.next(), Some(NotClone(2)));  // The last element from `v`.
665    /// assert_eq!(it.next(), None);               // The iterator is finished.
666    /// ```
667    ///
668    /// `intersperse_with` can be used in situations where the separator needs
669    /// to be computed:
670    /// ```
671    /// #![feature(iter_intersperse)]
672    ///
673    /// let src = ["Hello", "to", "all", "people", "!!"].iter().copied();
674    ///
675    /// // The closure mutably borrows its context to generate an item.
676    /// let mut happy_emojis = [" ❤️ ", " 😀 "].iter().copied();
677    /// let separator = || happy_emojis.next().unwrap_or(" 🦀 ");
678    ///
679    /// let result = src.intersperse_with(separator).collect::<String>();
680    /// assert_eq!(result, "Hello ❤️ to 😀 all 🦀 people 🦀 !!");
681    /// ```
682    /// [`Clone`]: crate::clone::Clone
683    /// [`intersperse`]: Iterator::intersperse
684    #[inline]
685    #[unstable(feature = "iter_intersperse", reason = "recently added", issue = "79524")]
686    fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
687    where
688        Self: Sized,
689        G: FnMut() -> Self::Item,
690    {
691        IntersperseWith::new(self, separator)
692    }
693
694    /// Takes a closure and creates an iterator which calls that closure on each
695    /// element.
696    ///
697    /// `map()` transforms one iterator into another, by means of its argument:
698    /// something that implements [`FnMut`]. It produces a new iterator which
699    /// calls this closure on each element of the original iterator.
700    ///
701    /// If you are good at thinking in types, you can think of `map()` like this:
702    /// If you have an iterator that gives you elements of some type `A`, and
703    /// you want an iterator of some other type `B`, you can use `map()`,
704    /// passing a closure that takes an `A` and returns a `B`.
705    ///
706    /// `map()` is conceptually similar to a [`for`] loop. However, as `map()` is
707    /// lazy, it is best used when you're already working with other iterators.
708    /// If you're doing some sort of looping for a side effect, it's considered
709    /// more idiomatic to use [`for`] than `map()`.
710    ///
711    /// [`for`]: ../../book/ch03-05-control-flow.html#looping-through-a-collection-with-for
712    ///
713    /// # Examples
714    ///
715    /// Basic usage:
716    ///
717    /// ```
718    /// let a = [1, 2, 3];
719    ///
720    /// let mut iter = a.iter().map(|x| 2 * x);
721    ///
722    /// assert_eq!(iter.next(), Some(2));
723    /// assert_eq!(iter.next(), Some(4));
724    /// assert_eq!(iter.next(), Some(6));
725    /// assert_eq!(iter.next(), None);
726    /// ```
727    ///
728    /// If you're doing some sort of side effect, prefer [`for`] to `map()`:
729    ///
730    /// ```
731    /// # #![allow(unused_must_use)]
732    /// // don't do this:
733    /// (0..5).map(|x| println!("{x}"));
734    ///
735    /// // it won't even execute, as it is lazy. Rust will warn you about this.
736    ///
737    /// // Instead, use for:
738    /// for x in 0..5 {
739    ///     println!("{x}");
740    /// }
741    /// ```
742    #[rustc_diagnostic_item = "IteratorMap"]
743    #[inline]
744    #[stable(feature = "rust1", since = "1.0.0")]
745    fn map<B, F>(self, f: F) -> Map<Self, F>
746    where
747        Self: Sized,
748        F: FnMut(Self::Item) -> B,
749    {
750        Map::new(self, f)
751    }
752
753    /// Calls a closure on each element of an iterator.
754    ///
755    /// This is equivalent to using a [`for`] loop on the iterator, although
756    /// `break` and `continue` are not possible from a closure. It's generally
757    /// more idiomatic to use a `for` loop, but `for_each` may be more legible
758    /// when processing items at the end of longer iterator chains. In some
759    /// cases `for_each` may also be faster than a loop, because it will use
760    /// internal iteration on adapters like `Chain`.
761    ///
762    /// [`for`]: ../../book/ch03-05-control-flow.html#looping-through-a-collection-with-for
763    ///
764    /// # Examples
765    ///
766    /// Basic usage:
767    ///
768    /// ```
769    /// use std::sync::mpsc::channel;
770    ///
771    /// let (tx, rx) = channel();
772    /// (0..5).map(|x| x * 2 + 1)
773    ///       .for_each(move |x| tx.send(x).unwrap());
774    ///
775    /// let v: Vec<_> = rx.iter().collect();
776    /// assert_eq!(v, vec![1, 3, 5, 7, 9]);
777    /// ```
778    ///
779    /// For such a small example, a `for` loop may be cleaner, but `for_each`
780    /// might be preferable to keep a functional style with longer iterators:
781    ///
782    /// ```
783    /// (0..5).flat_map(|x| x * 100 .. x * 110)
784    ///       .enumerate()
785    ///       .filter(|&(i, x)| (i + x) % 3 == 0)
786    ///       .for_each(|(i, x)| println!("{i}:{x}"));
787    /// ```
788    #[inline]
789    #[stable(feature = "iterator_for_each", since = "1.21.0")]
790    fn for_each<F>(self, f: F)
791    where
792        Self: Sized,
793        F: FnMut(Self::Item),
794    {
795        #[inline]
796        fn call<T>(mut f: impl FnMut(T)) -> impl FnMut((), T) {
797            move |(), item| f(item)
798        }
799
800        self.fold((), call(f));
801    }
802
803    /// Creates an iterator which uses a closure to determine if an element
804    /// should be yielded.
805    ///
806    /// Given an element the closure must return `true` or `false`. The returned
807    /// iterator will yield only the elements for which the closure returns
808    /// `true`.
809    ///
810    /// # Examples
811    ///
812    /// Basic usage:
813    ///
814    /// ```
815    /// let a = [0i32, 1, 2];
816    ///
817    /// let mut iter = a.iter().filter(|x| x.is_positive());
818    ///
819    /// assert_eq!(iter.next(), Some(&1));
820    /// assert_eq!(iter.next(), Some(&2));
821    /// assert_eq!(iter.next(), None);
822    /// ```
823    ///
824    /// Because the closure passed to `filter()` takes a reference, and many
825    /// iterators iterate over references, this leads to a possibly confusing
826    /// situation, where the type of the closure is a double reference:
827    ///
828    /// ```
829    /// let a = [0, 1, 2];
830    ///
831    /// let mut iter = a.iter().filter(|x| **x > 1); // need two *s!
832    ///
833    /// assert_eq!(iter.next(), Some(&2));
834    /// assert_eq!(iter.next(), None);
835    /// ```
836    ///
837    /// It's common to instead use destructuring on the argument to strip away
838    /// one:
839    ///
840    /// ```
841    /// let a = [0, 1, 2];
842    ///
843    /// let mut iter = a.iter().filter(|&x| *x > 1); // both & and *
844    ///
845    /// assert_eq!(iter.next(), Some(&2));
846    /// assert_eq!(iter.next(), None);
847    /// ```
848    ///
849    /// or both:
850    ///
851    /// ```
852    /// let a = [0, 1, 2];
853    ///
854    /// let mut iter = a.iter().filter(|&&x| x > 1); // two &s
855    ///
856    /// assert_eq!(iter.next(), Some(&2));
857    /// assert_eq!(iter.next(), None);
858    /// ```
859    ///
860    /// of these layers.
861    ///
862    /// Note that `iter.filter(f).next()` is equivalent to `iter.find(f)`.
863    #[inline]
864    #[stable(feature = "rust1", since = "1.0.0")]
865    #[rustc_diagnostic_item = "iter_filter"]
866    fn filter<P>(self, predicate: P) -> Filter<Self, P>
867    where
868        Self: Sized,
869        P: FnMut(&Self::Item) -> bool,
870    {
871        Filter::new(self, predicate)
872    }
873
874    /// Creates an iterator that both filters and maps.
875    ///
876    /// The returned iterator yields only the `value`s for which the supplied
877    /// closure returns `Some(value)`.
878    ///
879    /// `filter_map` can be used to make chains of [`filter`] and [`map`] more
880    /// concise. The example below shows how a `map().filter().map()` can be
881    /// shortened to a single call to `filter_map`.
882    ///
883    /// [`filter`]: Iterator::filter
884    /// [`map`]: Iterator::map
885    ///
886    /// # Examples
887    ///
888    /// Basic usage:
889    ///
890    /// ```
891    /// let a = ["1", "two", "NaN", "four", "5"];
892    ///
893    /// let mut iter = a.iter().filter_map(|s| s.parse().ok());
894    ///
895    /// assert_eq!(iter.next(), Some(1));
896    /// assert_eq!(iter.next(), Some(5));
897    /// assert_eq!(iter.next(), None);
898    /// ```
899    ///
900    /// Here's the same example, but with [`filter`] and [`map`]:
901    ///
902    /// ```
903    /// let a = ["1", "two", "NaN", "four", "5"];
904    /// let mut iter = a.iter().map(|s| s.parse()).filter(|s| s.is_ok()).map(|s| s.unwrap());
905    /// assert_eq!(iter.next(), Some(1));
906    /// assert_eq!(iter.next(), Some(5));
907    /// assert_eq!(iter.next(), None);
908    /// ```
909    #[inline]
910    #[stable(feature = "rust1", since = "1.0.0")]
911    fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
912    where
913        Self: Sized,
914        F: FnMut(Self::Item) -> Option<B>,
915    {
916        FilterMap::new(self, f)
917    }
918
919    /// Creates an iterator which gives the current iteration count as well as
920    /// the next value.
921    ///
922    /// The iterator returned yields pairs `(i, val)`, where `i` is the
923    /// current index of iteration and `val` is the value returned by the
924    /// iterator.
925    ///
926    /// `enumerate()` keeps its count as a [`usize`]. If you want to count by a
927    /// different sized integer, the [`zip`] function provides similar
928    /// functionality.
929    ///
930    /// # Overflow Behavior
931    ///
932    /// The method does no guarding against overflows, so enumerating more than
933    /// [`usize::MAX`] elements either produces the wrong result or panics. If
934    /// debug assertions are enabled, a panic is guaranteed.
935    ///
936    /// # Panics
937    ///
938    /// The returned iterator might panic if the to-be-returned index would
939    /// overflow a [`usize`].
940    ///
941    /// [`zip`]: Iterator::zip
942    ///
943    /// # Examples
944    ///
945    /// ```
946    /// let a = ['a', 'b', 'c'];
947    ///
948    /// let mut iter = a.iter().enumerate();
949    ///
950    /// assert_eq!(iter.next(), Some((0, &'a')));
951    /// assert_eq!(iter.next(), Some((1, &'b')));
952    /// assert_eq!(iter.next(), Some((2, &'c')));
953    /// assert_eq!(iter.next(), None);
954    /// ```
955    #[inline]
956    #[stable(feature = "rust1", since = "1.0.0")]
957    #[rustc_diagnostic_item = "enumerate_method"]
958    fn enumerate(self) -> Enumerate<Self>
959    where
960        Self: Sized,
961    {
962        Enumerate::new(self)
963    }
964
965    /// Creates an iterator which can use the [`peek`] and [`peek_mut`] methods
966    /// to look at the next element of the iterator without consuming it. See
967    /// their documentation for more information.
968    ///
969    /// Note that the underlying iterator is still advanced when [`peek`] or
970    /// [`peek_mut`] are called for the first time: In order to retrieve the
971    /// next element, [`next`] is called on the underlying iterator, hence any
972    /// side effects (i.e. anything other than fetching the next value) of
973    /// the [`next`] method will occur.
974    ///
975    ///
976    /// # Examples
977    ///
978    /// Basic usage:
979    ///
980    /// ```
981    /// let xs = [1, 2, 3];
982    ///
983    /// let mut iter = xs.iter().peekable();
984    ///
985    /// // peek() lets us see into the future
986    /// assert_eq!(iter.peek(), Some(&&1));
987    /// assert_eq!(iter.next(), Some(&1));
988    ///
989    /// assert_eq!(iter.next(), Some(&2));
990    ///
991    /// // we can peek() multiple times, the iterator won't advance
992    /// assert_eq!(iter.peek(), Some(&&3));
993    /// assert_eq!(iter.peek(), Some(&&3));
994    ///
995    /// assert_eq!(iter.next(), Some(&3));
996    ///
997    /// // after the iterator is finished, so is peek()
998    /// assert_eq!(iter.peek(), None);
999    /// assert_eq!(iter.next(), None);
1000    /// ```
1001    ///
1002    /// Using [`peek_mut`] to mutate the next item without advancing the
1003    /// iterator:
1004    ///
1005    /// ```
1006    /// let xs = [1, 2, 3];
1007    ///
1008    /// let mut iter = xs.iter().peekable();
1009    ///
1010    /// // `peek_mut()` lets us see into the future
1011    /// assert_eq!(iter.peek_mut(), Some(&mut &1));
1012    /// assert_eq!(iter.peek_mut(), Some(&mut &1));
1013    /// assert_eq!(iter.next(), Some(&1));
1014    ///
1015    /// if let Some(mut p) = iter.peek_mut() {
1016    ///     assert_eq!(*p, &2);
1017    ///     // put a value into the iterator
1018    ///     *p = &1000;
1019    /// }
1020    ///
1021    /// // The value reappears as the iterator continues
1022    /// assert_eq!(iter.collect::<Vec<_>>(), vec![&1000, &3]);
1023    /// ```
1024    /// [`peek`]: Peekable::peek
1025    /// [`peek_mut`]: Peekable::peek_mut
1026    /// [`next`]: Iterator::next
1027    #[inline]
1028    #[stable(feature = "rust1", since = "1.0.0")]
1029    fn peekable(self) -> Peekable<Self>
1030    where
1031        Self: Sized,
1032    {
1033        Peekable::new(self)
1034    }
1035
1036    /// Creates an iterator that [`skip`]s elements based on a predicate.
1037    ///
1038    /// [`skip`]: Iterator::skip
1039    ///
1040    /// `skip_while()` takes a closure as an argument. It will call this
1041    /// closure on each element of the iterator, and ignore elements
1042    /// until it returns `false`.
1043    ///
1044    /// After `false` is returned, `skip_while()`'s job is over, and the
1045    /// rest of the elements are yielded.
1046    ///
1047    /// # Examples
1048    ///
1049    /// Basic usage:
1050    ///
1051    /// ```
1052    /// let a = [-1i32, 0, 1];
1053    ///
1054    /// let mut iter = a.iter().skip_while(|x| x.is_negative());
1055    ///
1056    /// assert_eq!(iter.next(), Some(&0));
1057    /// assert_eq!(iter.next(), Some(&1));
1058    /// assert_eq!(iter.next(), None);
1059    /// ```
1060    ///
1061    /// Because the closure passed to `skip_while()` takes a reference, and many
1062    /// iterators iterate over references, this leads to a possibly confusing
1063    /// situation, where the type of the closure argument is a double reference:
1064    ///
1065    /// ```
1066    /// let a = [-1, 0, 1];
1067    ///
1068    /// let mut iter = a.iter().skip_while(|x| **x < 0); // need two *s!
1069    ///
1070    /// assert_eq!(iter.next(), Some(&0));
1071    /// assert_eq!(iter.next(), Some(&1));
1072    /// assert_eq!(iter.next(), None);
1073    /// ```
1074    ///
1075    /// Stopping after an initial `false`:
1076    ///
1077    /// ```
1078    /// let a = [-1, 0, 1, -2];
1079    ///
1080    /// let mut iter = a.iter().skip_while(|x| **x < 0);
1081    ///
1082    /// assert_eq!(iter.next(), Some(&0));
1083    /// assert_eq!(iter.next(), Some(&1));
1084    ///
1085    /// // while this would have been false, since we already got a false,
1086    /// // skip_while() isn't used any more
1087    /// assert_eq!(iter.next(), Some(&-2));
1088    ///
1089    /// assert_eq!(iter.next(), None);
1090    /// ```
1091    #[inline]
1092    #[doc(alias = "drop_while")]
1093    #[stable(feature = "rust1", since = "1.0.0")]
1094    fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
1095    where
1096        Self: Sized,
1097        P: FnMut(&Self::Item) -> bool,
1098    {
1099        SkipWhile::new(self, predicate)
1100    }
1101
1102    /// Creates an iterator that yields elements based on a predicate.
1103    ///
1104    /// `take_while()` takes a closure as an argument. It will call this
1105    /// closure on each element of the iterator, and yield elements
1106    /// while it returns `true`.
1107    ///
1108    /// After `false` is returned, `take_while()`'s job is over, and the
1109    /// rest of the elements are ignored.
1110    ///
1111    /// # Examples
1112    ///
1113    /// Basic usage:
1114    ///
1115    /// ```
1116    /// let a = [-1i32, 0, 1];
1117    ///
1118    /// let mut iter = a.iter().take_while(|x| x.is_negative());
1119    ///
1120    /// assert_eq!(iter.next(), Some(&-1));
1121    /// assert_eq!(iter.next(), None);
1122    /// ```
1123    ///
1124    /// Because the closure passed to `take_while()` takes a reference, and many
1125    /// iterators iterate over references, this leads to a possibly confusing
1126    /// situation, where the type of the closure is a double reference:
1127    ///
1128    /// ```
1129    /// let a = [-1, 0, 1];
1130    ///
1131    /// let mut iter = a.iter().take_while(|x| **x < 0); // need two *s!
1132    ///
1133    /// assert_eq!(iter.next(), Some(&-1));
1134    /// assert_eq!(iter.next(), None);
1135    /// ```
1136    ///
1137    /// Stopping after an initial `false`:
1138    ///
1139    /// ```
1140    /// let a = [-1, 0, 1, -2];
1141    ///
1142    /// let mut iter = a.iter().take_while(|x| **x < 0);
1143    ///
1144    /// assert_eq!(iter.next(), Some(&-1));
1145    ///
1146    /// // We have more elements that are less than zero, but since we already
1147    /// // got a false, take_while() isn't used any more
1148    /// assert_eq!(iter.next(), None);
1149    /// ```
1150    ///
1151    /// Because `take_while()` needs to look at the value in order to see if it
1152    /// should be included or not, consuming iterators will see that it is
1153    /// removed:
1154    ///
1155    /// ```
1156    /// let a = [1, 2, 3, 4];
1157    /// let mut iter = a.iter();
1158    ///
1159    /// let result: Vec<i32> = iter.by_ref()
1160    ///                            .take_while(|n| **n != 3)
1161    ///                            .cloned()
1162    ///                            .collect();
1163    ///
1164    /// assert_eq!(result, &[1, 2]);
1165    ///
1166    /// let result: Vec<i32> = iter.cloned().collect();
1167    ///
1168    /// assert_eq!(result, &[4]);
1169    /// ```
1170    ///
1171    /// The `3` is no longer there, because it was consumed in order to see if
1172    /// the iteration should stop, but wasn't placed back into the iterator.
1173    #[inline]
1174    #[stable(feature = "rust1", since = "1.0.0")]
1175    fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
1176    where
1177        Self: Sized,
1178        P: FnMut(&Self::Item) -> bool,
1179    {
1180        TakeWhile::new(self, predicate)
1181    }
1182
1183    /// Creates an iterator that both yields elements based on a predicate and maps.
1184    ///
1185    /// `map_while()` takes a closure as an argument. It will call this
1186    /// closure on each element of the iterator, and yield elements
1187    /// while it returns [`Some(_)`][`Some`].
1188    ///
1189    /// # Examples
1190    ///
1191    /// Basic usage:
1192    ///
1193    /// ```
1194    /// let a = [-1i32, 4, 0, 1];
1195    ///
1196    /// let mut iter = a.iter().map_while(|x| 16i32.checked_div(*x));
1197    ///
1198    /// assert_eq!(iter.next(), Some(-16));
1199    /// assert_eq!(iter.next(), Some(4));
1200    /// assert_eq!(iter.next(), None);
1201    /// ```
1202    ///
1203    /// Here's the same example, but with [`take_while`] and [`map`]:
1204    ///
1205    /// [`take_while`]: Iterator::take_while
1206    /// [`map`]: Iterator::map
1207    ///
1208    /// ```
1209    /// let a = [-1i32, 4, 0, 1];
1210    ///
1211    /// let mut iter = a.iter()
1212    ///                 .map(|x| 16i32.checked_div(*x))
1213    ///                 .take_while(|x| x.is_some())
1214    ///                 .map(|x| x.unwrap());
1215    ///
1216    /// assert_eq!(iter.next(), Some(-16));
1217    /// assert_eq!(iter.next(), Some(4));
1218    /// assert_eq!(iter.next(), None);
1219    /// ```
1220    ///
1221    /// Stopping after an initial [`None`]:
1222    ///
1223    /// ```
1224    /// let a = [0, 1, 2, -3, 4, 5, -6];
1225    ///
1226    /// let iter = a.iter().map_while(|x| u32::try_from(*x).ok());
1227    /// let vec = iter.collect::<Vec<_>>();
1228    ///
1229    /// // We have more elements which could fit in u32 (4, 5), but `map_while` returned `None` for `-3`
1230    /// // (as the `predicate` returned `None`) and `collect` stops at the first `None` encountered.
1231    /// assert_eq!(vec, vec![0, 1, 2]);
1232    /// ```
1233    ///
1234    /// Because `map_while()` needs to look at the value in order to see if it
1235    /// should be included or not, consuming iterators will see that it is
1236    /// removed:
1237    ///
1238    /// ```
1239    /// let a = [1, 2, -3, 4];
1240    /// let mut iter = a.iter();
1241    ///
1242    /// let result: Vec<u32> = iter.by_ref()
1243    ///                            .map_while(|n| u32::try_from(*n).ok())
1244    ///                            .collect();
1245    ///
1246    /// assert_eq!(result, &[1, 2]);
1247    ///
1248    /// let result: Vec<i32> = iter.cloned().collect();
1249    ///
1250    /// assert_eq!(result, &[4]);
1251    /// ```
1252    ///
1253    /// The `-3` is no longer there, because it was consumed in order to see if
1254    /// the iteration should stop, but wasn't placed back into the iterator.
1255    ///
1256    /// Note that unlike [`take_while`] this iterator is **not** fused.
1257    /// It is also not specified what this iterator returns after the first [`None`] is returned.
1258    /// If you need fused iterator, use [`fuse`].
1259    ///
1260    /// [`fuse`]: Iterator::fuse
1261    #[inline]
1262    #[stable(feature = "iter_map_while", since = "1.57.0")]
1263    fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
1264    where
1265        Self: Sized,
1266        P: FnMut(Self::Item) -> Option<B>,
1267    {
1268        MapWhile::new(self, predicate)
1269    }
1270
1271    /// Creates an iterator that skips the first `n` elements.
1272    ///
1273    /// `skip(n)` skips elements until `n` elements are skipped or the end of the
1274    /// iterator is reached (whichever happens first). After that, all the remaining
1275    /// elements are yielded. In particular, if the original iterator is too short,
1276    /// then the returned iterator is empty.
1277    ///
1278    /// Rather than overriding this method directly, instead override the `nth` method.
1279    ///
1280    /// # Examples
1281    ///
1282    /// ```
1283    /// let a = [1, 2, 3];
1284    ///
1285    /// let mut iter = a.iter().skip(2);
1286    ///
1287    /// assert_eq!(iter.next(), Some(&3));
1288    /// assert_eq!(iter.next(), None);
1289    /// ```
1290    #[inline]
1291    #[stable(feature = "rust1", since = "1.0.0")]
1292    fn skip(self, n: usize) -> Skip<Self>
1293    where
1294        Self: Sized,
1295    {
1296        Skip::new(self, n)
1297    }
1298
1299    /// Creates an iterator that yields the first `n` elements, or fewer
1300    /// if the underlying iterator ends sooner.
1301    ///
1302    /// `take(n)` yields elements until `n` elements are yielded or the end of
1303    /// the iterator is reached (whichever happens first).
1304    /// The returned iterator is a prefix of length `n` if the original iterator
1305    /// contains at least `n` elements, otherwise it contains all of the
1306    /// (fewer than `n`) elements of the original iterator.
1307    ///
1308    /// # Examples
1309    ///
1310    /// Basic usage:
1311    ///
1312    /// ```
1313    /// let a = [1, 2, 3];
1314    ///
1315    /// let mut iter = a.iter().take(2);
1316    ///
1317    /// assert_eq!(iter.next(), Some(&1));
1318    /// assert_eq!(iter.next(), Some(&2));
1319    /// assert_eq!(iter.next(), None);
1320    /// ```
1321    ///
1322    /// `take()` is often used with an infinite iterator, to make it finite:
1323    ///
1324    /// ```
1325    /// let mut iter = (0..).take(3);
1326    ///
1327    /// assert_eq!(iter.next(), Some(0));
1328    /// assert_eq!(iter.next(), Some(1));
1329    /// assert_eq!(iter.next(), Some(2));
1330    /// assert_eq!(iter.next(), None);
1331    /// ```
1332    ///
1333    /// If less than `n` elements are available,
1334    /// `take` will limit itself to the size of the underlying iterator:
1335    ///
1336    /// ```
1337    /// let v = [1, 2];
1338    /// let mut iter = v.into_iter().take(5);
1339    /// assert_eq!(iter.next(), Some(1));
1340    /// assert_eq!(iter.next(), Some(2));
1341    /// assert_eq!(iter.next(), None);
1342    /// ```
1343    #[inline]
1344    #[stable(feature = "rust1", since = "1.0.0")]
1345    fn take(self, n: usize) -> Take<Self>
1346    where
1347        Self: Sized,
1348    {
1349        Take::new(self, n)
1350    }
1351
1352    /// An iterator adapter which, like [`fold`], holds internal state, but
1353    /// unlike [`fold`], produces a new iterator.
1354    ///
1355    /// [`fold`]: Iterator::fold
1356    ///
1357    /// `scan()` takes two arguments: an initial value which seeds the internal
1358    /// state, and a closure with two arguments, the first being a mutable
1359    /// reference to the internal state and the second an iterator element.
1360    /// The closure can assign to the internal state to share state between
1361    /// iterations.
1362    ///
1363    /// On iteration, the closure will be applied to each element of the
1364    /// iterator and the return value from the closure, an [`Option`], is
1365    /// returned by the `next` method. Thus the closure can return
1366    /// `Some(value)` to yield `value`, or `None` to end the iteration.
1367    ///
1368    /// # Examples
1369    ///
1370    /// ```
1371    /// let a = [1, 2, 3, 4];
1372    ///
1373    /// let mut iter = a.iter().scan(1, |state, &x| {
1374    ///     // each iteration, we'll multiply the state by the element ...
1375    ///     *state = *state * x;
1376    ///
1377    ///     // ... and terminate if the state exceeds 6
1378    ///     if *state > 6 {
1379    ///         return None;
1380    ///     }
1381    ///     // ... else yield the negation of the state
1382    ///     Some(-*state)
1383    /// });
1384    ///
1385    /// assert_eq!(iter.next(), Some(-1));
1386    /// assert_eq!(iter.next(), Some(-2));
1387    /// assert_eq!(iter.next(), Some(-6));
1388    /// assert_eq!(iter.next(), None);
1389    /// ```
1390    #[inline]
1391    #[stable(feature = "rust1", since = "1.0.0")]
1392    fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
1393    where
1394        Self: Sized,
1395        F: FnMut(&mut St, Self::Item) -> Option<B>,
1396    {
1397        Scan::new(self, initial_state, f)
1398    }
1399
1400    /// Creates an iterator that works like map, but flattens nested structure.
1401    ///
1402    /// The [`map`] adapter is very useful, but only when the closure
1403    /// argument produces values. If it produces an iterator instead, there's
1404    /// an extra layer of indirection. `flat_map()` will remove this extra layer
1405    /// on its own.
1406    ///
1407    /// You can think of `flat_map(f)` as the semantic equivalent
1408    /// of [`map`]ping, and then [`flatten`]ing as in `map(f).flatten()`.
1409    ///
1410    /// Another way of thinking about `flat_map()`: [`map`]'s closure returns
1411    /// one item for each element, and `flat_map()`'s closure returns an
1412    /// iterator for each element.
1413    ///
1414    /// [`map`]: Iterator::map
1415    /// [`flatten`]: Iterator::flatten
1416    ///
1417    /// # Examples
1418    ///
1419    /// ```
1420    /// let words = ["alpha", "beta", "gamma"];
1421    ///
1422    /// // chars() returns an iterator
1423    /// let merged: String = words.iter()
1424    ///                           .flat_map(|s| s.chars())
1425    ///                           .collect();
1426    /// assert_eq!(merged, "alphabetagamma");
1427    /// ```
1428    #[inline]
1429    #[stable(feature = "rust1", since = "1.0.0")]
1430    fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
1431    where
1432        Self: Sized,
1433        U: IntoIterator,
1434        F: FnMut(Self::Item) -> U,
1435    {
1436        FlatMap::new(self, f)
1437    }
1438
1439    /// Creates an iterator that flattens nested structure.
1440    ///
1441    /// This is useful when you have an iterator of iterators or an iterator of
1442    /// things that can be turned into iterators and you want to remove one
1443    /// level of indirection.
1444    ///
1445    /// # Examples
1446    ///
1447    /// Basic usage:
1448    ///
1449    /// ```
1450    /// let data = vec![vec![1, 2, 3, 4], vec![5, 6]];
1451    /// let flattened = data.into_iter().flatten().collect::<Vec<u8>>();
1452    /// assert_eq!(flattened, &[1, 2, 3, 4, 5, 6]);
1453    /// ```
1454    ///
1455    /// Mapping and then flattening:
1456    ///
1457    /// ```
1458    /// let words = ["alpha", "beta", "gamma"];
1459    ///
1460    /// // chars() returns an iterator
1461    /// let merged: String = words.iter()
1462    ///                           .map(|s| s.chars())
1463    ///                           .flatten()
1464    ///                           .collect();
1465    /// assert_eq!(merged, "alphabetagamma");
1466    /// ```
1467    ///
1468    /// You can also rewrite this in terms of [`flat_map()`], which is preferable
1469    /// in this case since it conveys intent more clearly:
1470    ///
1471    /// ```
1472    /// let words = ["alpha", "beta", "gamma"];
1473    ///
1474    /// // chars() returns an iterator
1475    /// let merged: String = words.iter()
1476    ///                           .flat_map(|s| s.chars())
1477    ///                           .collect();
1478    /// assert_eq!(merged, "alphabetagamma");
1479    /// ```
1480    ///
1481    /// Flattening works on any `IntoIterator` type, including `Option` and `Result`:
1482    ///
1483    /// ```
1484    /// let options = vec![Some(123), Some(321), None, Some(231)];
1485    /// let flattened_options: Vec<_> = options.into_iter().flatten().collect();
1486    /// assert_eq!(flattened_options, vec![123, 321, 231]);
1487    ///
1488    /// let results = vec![Ok(123), Ok(321), Err(456), Ok(231)];
1489    /// let flattened_results: Vec<_> = results.into_iter().flatten().collect();
1490    /// assert_eq!(flattened_results, vec![123, 321, 231]);
1491    /// ```
1492    ///
1493    /// Flattening only removes one level of nesting at a time:
1494    ///
1495    /// ```
1496    /// let d3 = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]];
1497    ///
1498    /// let d2 = d3.iter().flatten().collect::<Vec<_>>();
1499    /// assert_eq!(d2, [&[1, 2], &[3, 4], &[5, 6], &[7, 8]]);
1500    ///
1501    /// let d1 = d3.iter().flatten().flatten().collect::<Vec<_>>();
1502    /// assert_eq!(d1, [&1, &2, &3, &4, &5, &6, &7, &8]);
1503    /// ```
1504    ///
1505    /// Here we see that `flatten()` does not perform a "deep" flatten.
1506    /// Instead, only one level of nesting is removed. That is, if you
1507    /// `flatten()` a three-dimensional array, the result will be
1508    /// two-dimensional and not one-dimensional. To get a one-dimensional
1509    /// structure, you have to `flatten()` again.
1510    ///
1511    /// [`flat_map()`]: Iterator::flat_map
1512    #[inline]
1513    #[stable(feature = "iterator_flatten", since = "1.29.0")]
1514    fn flatten(self) -> Flatten<Self>
1515    where
1516        Self: Sized,
1517        Self::Item: IntoIterator,
1518    {
1519        Flatten::new(self)
1520    }
1521
1522    /// Calls the given function `f` for each contiguous window of size `N` over
1523    /// `self` and returns an iterator over the outputs of `f`. Like [`slice::windows()`],
1524    /// the windows during mapping overlap as well.
1525    ///
1526    /// In the following example, the closure is called three times with the
1527    /// arguments `&['a', 'b']`, `&['b', 'c']` and `&['c', 'd']` respectively.
1528    ///
1529    /// ```
1530    /// #![feature(iter_map_windows)]
1531    ///
1532    /// let strings = "abcd".chars()
1533    ///     .map_windows(|[x, y]| format!("{}+{}", x, y))
1534    ///     .collect::<Vec<String>>();
1535    ///
1536    /// assert_eq!(strings, vec!["a+b", "b+c", "c+d"]);
1537    /// ```
1538    ///
1539    /// Note that the const parameter `N` is usually inferred by the
1540    /// destructured argument in the closure.
1541    ///
1542    /// The returned iterator yields 𝑘 − `N` + 1 items (where 𝑘 is the number of
1543    /// items yielded by `self`). If 𝑘 is less than `N`, this method yields an
1544    /// empty iterator.
1545    ///
1546    /// The returned iterator implements [`FusedIterator`], because once `self`
1547    /// returns `None`, even if it returns a `Some(T)` again in the next iterations,
1548    /// we cannot put it into a contiguous array buffer, and thus the returned iterator
1549    /// should be fused.
1550    ///
1551    /// [`slice::windows()`]: slice::windows
1552    /// [`FusedIterator`]: crate::iter::FusedIterator
1553    ///
1554    /// # Panics
1555    ///
1556    /// Panics if `N` is zero. This check will most probably get changed to a
1557    /// compile time error before this method gets stabilized.
1558    ///
1559    /// ```should_panic
1560    /// #![feature(iter_map_windows)]
1561    ///
1562    /// let iter = std::iter::repeat(0).map_windows(|&[]| ());
1563    /// ```
1564    ///
1565    /// # Examples
1566    ///
1567    /// Building the sums of neighboring numbers.
1568    ///
1569    /// ```
1570    /// #![feature(iter_map_windows)]
1571    ///
1572    /// let mut it = [1, 3, 8, 1].iter().map_windows(|&[a, b]| a + b);
1573    /// assert_eq!(it.next(), Some(4));  // 1 + 3
1574    /// assert_eq!(it.next(), Some(11)); // 3 + 8
1575    /// assert_eq!(it.next(), Some(9));  // 8 + 1
1576    /// assert_eq!(it.next(), None);
1577    /// ```
1578    ///
1579    /// Since the elements in the following example implement `Copy`, we can
1580    /// just copy the array and get an iterator over the windows.
1581    ///
1582    /// ```
1583    /// #![feature(iter_map_windows)]
1584    ///
1585    /// let mut it = "ferris".chars().map_windows(|w: &[_; 3]| *w);
1586    /// assert_eq!(it.next(), Some(['f', 'e', 'r']));
1587    /// assert_eq!(it.next(), Some(['e', 'r', 'r']));
1588    /// assert_eq!(it.next(), Some(['r', 'r', 'i']));
1589    /// assert_eq!(it.next(), Some(['r', 'i', 's']));
1590    /// assert_eq!(it.next(), None);
1591    /// ```
1592    ///
1593    /// You can also use this function to check the sortedness of an iterator.
1594    /// For the simple case, rather use [`Iterator::is_sorted`].
1595    ///
1596    /// ```
1597    /// #![feature(iter_map_windows)]
1598    ///
1599    /// let mut it = [0.5, 1.0, 3.5, 3.0, 8.5, 8.5, f32::NAN].iter()
1600    ///     .map_windows(|[a, b]| a <= b);
1601    ///
1602    /// assert_eq!(it.next(), Some(true));  // 0.5 <= 1.0
1603    /// assert_eq!(it.next(), Some(true));  // 1.0 <= 3.5
1604    /// assert_eq!(it.next(), Some(false)); // 3.5 <= 3.0
1605    /// assert_eq!(it.next(), Some(true));  // 3.0 <= 8.5
1606    /// assert_eq!(it.next(), Some(true));  // 8.5 <= 8.5
1607    /// assert_eq!(it.next(), Some(false)); // 8.5 <= NAN
1608    /// assert_eq!(it.next(), None);
1609    /// ```
1610    ///
1611    /// For non-fused iterators, they are fused after `map_windows`.
1612    ///
1613    /// ```
1614    /// #![feature(iter_map_windows)]
1615    ///
1616    /// #[derive(Default)]
1617    /// struct NonFusedIterator {
1618    ///     state: i32,
1619    /// }
1620    ///
1621    /// impl Iterator for NonFusedIterator {
1622    ///     type Item = i32;
1623    ///
1624    ///     fn next(&mut self) -> Option<i32> {
1625    ///         let val = self.state;
1626    ///         self.state = self.state + 1;
1627    ///
1628    ///         // yields `0..5` first, then only even numbers since `6..`.
1629    ///         if val < 5 || val % 2 == 0 {
1630    ///             Some(val)
1631    ///         } else {
1632    ///             None
1633    ///         }
1634    ///     }
1635    /// }
1636    ///
1637    ///
1638    /// let mut iter = NonFusedIterator::default();
1639    ///
1640    /// // yields 0..5 first.
1641    /// assert_eq!(iter.next(), Some(0));
1642    /// assert_eq!(iter.next(), Some(1));
1643    /// assert_eq!(iter.next(), Some(2));
1644    /// assert_eq!(iter.next(), Some(3));
1645    /// assert_eq!(iter.next(), Some(4));
1646    /// // then we can see our iterator going back and forth
1647    /// assert_eq!(iter.next(), None);
1648    /// assert_eq!(iter.next(), Some(6));
1649    /// assert_eq!(iter.next(), None);
1650    /// assert_eq!(iter.next(), Some(8));
1651    /// assert_eq!(iter.next(), None);
1652    ///
1653    /// // however, with `.map_windows()`, it is fused.
1654    /// let mut iter = NonFusedIterator::default()
1655    ///     .map_windows(|arr: &[_; 2]| *arr);
1656    ///
1657    /// assert_eq!(iter.next(), Some([0, 1]));
1658    /// assert_eq!(iter.next(), Some([1, 2]));
1659    /// assert_eq!(iter.next(), Some([2, 3]));
1660    /// assert_eq!(iter.next(), Some([3, 4]));
1661    /// assert_eq!(iter.next(), None);
1662    ///
1663    /// // it will always return `None` after the first time.
1664    /// assert_eq!(iter.next(), None);
1665    /// assert_eq!(iter.next(), None);
1666    /// assert_eq!(iter.next(), None);
1667    /// ```
1668    #[inline]
1669    #[unstable(feature = "iter_map_windows", reason = "recently added", issue = "87155")]
1670    fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
1671    where
1672        Self: Sized,
1673        F: FnMut(&[Self::Item; N]) -> R,
1674    {
1675        MapWindows::new(self, f)
1676    }
1677
1678    /// Creates an iterator which ends after the first [`None`].
1679    ///
1680    /// After an iterator returns [`None`], future calls may or may not yield
1681    /// [`Some(T)`] again. `fuse()` adapts an iterator, ensuring that after a
1682    /// [`None`] is given, it will always return [`None`] forever.
1683    ///
1684    /// Note that the [`Fuse`] wrapper is a no-op on iterators that implement
1685    /// the [`FusedIterator`] trait. `fuse()` may therefore behave incorrectly
1686    /// if the [`FusedIterator`] trait is improperly implemented.
1687    ///
1688    /// [`Some(T)`]: Some
1689    /// [`FusedIterator`]: crate::iter::FusedIterator
1690    ///
1691    /// # Examples
1692    ///
1693    /// ```
1694    /// // an iterator which alternates between Some and None
1695    /// struct Alternate {
1696    ///     state: i32,
1697    /// }
1698    ///
1699    /// impl Iterator for Alternate {
1700    ///     type Item = i32;
1701    ///
1702    ///     fn next(&mut self) -> Option<i32> {
1703    ///         let val = self.state;
1704    ///         self.state = self.state + 1;
1705    ///
1706    ///         // if it's even, Some(i32), else None
1707    ///         (val % 2 == 0).then_some(val)
1708    ///     }
1709    /// }
1710    ///
1711    /// let mut iter = Alternate { state: 0 };
1712    ///
1713    /// // we can see our iterator going back and forth
1714    /// assert_eq!(iter.next(), Some(0));
1715    /// assert_eq!(iter.next(), None);
1716    /// assert_eq!(iter.next(), Some(2));
1717    /// assert_eq!(iter.next(), None);
1718    ///
1719    /// // however, once we fuse it...
1720    /// let mut iter = iter.fuse();
1721    ///
1722    /// assert_eq!(iter.next(), Some(4));
1723    /// assert_eq!(iter.next(), None);
1724    ///
1725    /// // it will always return `None` after the first time.
1726    /// assert_eq!(iter.next(), None);
1727    /// assert_eq!(iter.next(), None);
1728    /// assert_eq!(iter.next(), None);
1729    /// ```
1730    #[inline]
1731    #[stable(feature = "rust1", since = "1.0.0")]
1732    fn fuse(self) -> Fuse<Self>
1733    where
1734        Self: Sized,
1735    {
1736        Fuse::new(self)
1737    }
1738
1739    /// Does something with each element of an iterator, passing the value on.
1740    ///
1741    /// When using iterators, you'll often chain several of them together.
1742    /// While working on such code, you might want to check out what's
1743    /// happening at various parts in the pipeline. To do that, insert
1744    /// a call to `inspect()`.
1745    ///
1746    /// It's more common for `inspect()` to be used as a debugging tool than to
1747    /// exist in your final code, but applications may find it useful in certain
1748    /// situations when errors need to be logged before being discarded.
1749    ///
1750    /// # Examples
1751    ///
1752    /// Basic usage:
1753    ///
1754    /// ```
1755    /// let a = [1, 4, 2, 3];
1756    ///
1757    /// // this iterator sequence is complex.
1758    /// let sum = a.iter()
1759    ///     .cloned()
1760    ///     .filter(|x| x % 2 == 0)
1761    ///     .fold(0, |sum, i| sum + i);
1762    ///
1763    /// println!("{sum}");
1764    ///
1765    /// // let's add some inspect() calls to investigate what's happening
1766    /// let sum = a.iter()
1767    ///     .cloned()
1768    ///     .inspect(|x| println!("about to filter: {x}"))
1769    ///     .filter(|x| x % 2 == 0)
1770    ///     .inspect(|x| println!("made it through filter: {x}"))
1771    ///     .fold(0, |sum, i| sum + i);
1772    ///
1773    /// println!("{sum}");
1774    /// ```
1775    ///
1776    /// This will print:
1777    ///
1778    /// ```text
1779    /// 6
1780    /// about to filter: 1
1781    /// about to filter: 4
1782    /// made it through filter: 4
1783    /// about to filter: 2
1784    /// made it through filter: 2
1785    /// about to filter: 3
1786    /// 6
1787    /// ```
1788    ///
1789    /// Logging errors before discarding them:
1790    ///
1791    /// ```
1792    /// let lines = ["1", "2", "a"];
1793    ///
1794    /// let sum: i32 = lines
1795    ///     .iter()
1796    ///     .map(|line| line.parse::<i32>())
1797    ///     .inspect(|num| {
1798    ///         if let Err(ref e) = *num {
1799    ///             println!("Parsing error: {e}");
1800    ///         }
1801    ///     })
1802    ///     .filter_map(Result::ok)
1803    ///     .sum();
1804    ///
1805    /// println!("Sum: {sum}");
1806    /// ```
1807    ///
1808    /// This will print:
1809    ///
1810    /// ```text
1811    /// Parsing error: invalid digit found in string
1812    /// Sum: 3
1813    /// ```
1814    #[inline]
1815    #[stable(feature = "rust1", since = "1.0.0")]
1816    fn inspect<F>(self, f: F) -> Inspect<Self, F>
1817    where
1818        Self: Sized,
1819        F: FnMut(&Self::Item),
1820    {
1821        Inspect::new(self, f)
1822    }
1823
1824    /// Creates a "by reference" adapter for this instance of `Iterator`.
1825    ///
1826    /// Consuming method calls (direct or indirect calls to `next`)
1827    /// on the "by reference" adapter will consume the original iterator,
1828    /// but ownership-taking methods (those with a `self` parameter)
1829    /// only take ownership of the "by reference" iterator.
1830    ///
1831    /// This is useful for applying ownership-taking methods
1832    /// (such as `take` in the example below)
1833    /// without giving up ownership of the original iterator,
1834    /// so you can use the original iterator afterwards.
1835    ///
1836    /// Uses [impl<I: Iterator + ?Sized> Iterator for &mut I { type Item = I::Item; ...}](https://doc.rust-lang.org/nightly/std/iter/trait.Iterator.html#impl-Iterator-for-%26mut+I).
1837    ///
1838    /// # Examples
1839    ///
1840    /// ```
1841    /// let mut words = ["hello", "world", "of", "Rust"].into_iter();
1842    ///
1843    /// // Take the first two words.
1844    /// let hello_world: Vec<_> = words.by_ref().take(2).collect();
1845    /// assert_eq!(hello_world, vec!["hello", "world"]);
1846    ///
1847    /// // Collect the rest of the words.
1848    /// // We can only do this because we used `by_ref` earlier.
1849    /// let of_rust: Vec<_> = words.collect();
1850    /// assert_eq!(of_rust, vec!["of", "Rust"]);
1851    /// ```
1852    #[stable(feature = "rust1", since = "1.0.0")]
1853    fn by_ref(&mut self) -> &mut Self
1854    where
1855        Self: Sized,
1856    {
1857        self
1858    }
1859
1860    /// Transforms an iterator into a collection.
1861    ///
1862    /// `collect()` can take anything iterable, and turn it into a relevant
1863    /// collection. This is one of the more powerful methods in the standard
1864    /// library, used in a variety of contexts.
1865    ///
1866    /// The most basic pattern in which `collect()` is used is to turn one
1867    /// collection into another. You take a collection, call [`iter`] on it,
1868    /// do a bunch of transformations, and then `collect()` at the end.
1869    ///
1870    /// `collect()` can also create instances of types that are not typical
1871    /// collections. For example, a [`String`] can be built from [`char`]s,
1872    /// and an iterator of [`Result<T, E>`][`Result`] items can be collected
1873    /// into `Result<Collection<T>, E>`. See the examples below for more.
1874    ///
1875    /// Because `collect()` is so general, it can cause problems with type
1876    /// inference. As such, `collect()` is one of the few times you'll see
1877    /// the syntax affectionately known as the 'turbofish': `::<>`. This
1878    /// helps the inference algorithm understand specifically which collection
1879    /// you're trying to collect into.
1880    ///
1881    /// # Examples
1882    ///
1883    /// Basic usage:
1884    ///
1885    /// ```
1886    /// let a = [1, 2, 3];
1887    ///
1888    /// let doubled: Vec<i32> = a.iter()
1889    ///                          .map(|&x| x * 2)
1890    ///                          .collect();
1891    ///
1892    /// assert_eq!(vec![2, 4, 6], doubled);
1893    /// ```
1894    ///
1895    /// Note that we needed the `: Vec<i32>` on the left-hand side. This is because
1896    /// we could collect into, for example, a [`VecDeque<T>`] instead:
1897    ///
1898    /// [`VecDeque<T>`]: ../../std/collections/struct.VecDeque.html
1899    ///
1900    /// ```
1901    /// use std::collections::VecDeque;
1902    ///
1903    /// let a = [1, 2, 3];
1904    ///
1905    /// let doubled: VecDeque<i32> = a.iter().map(|&x| x * 2).collect();
1906    ///
1907    /// assert_eq!(2, doubled[0]);
1908    /// assert_eq!(4, doubled[1]);
1909    /// assert_eq!(6, doubled[2]);
1910    /// ```
1911    ///
1912    /// Using the 'turbofish' instead of annotating `doubled`:
1913    ///
1914    /// ```
1915    /// let a = [1, 2, 3];
1916    ///
1917    /// let doubled = a.iter().map(|x| x * 2).collect::<Vec<i32>>();
1918    ///
1919    /// assert_eq!(vec![2, 4, 6], doubled);
1920    /// ```
1921    ///
1922    /// Because `collect()` only cares about what you're collecting into, you can
1923    /// still use a partial type hint, `_`, with the turbofish:
1924    ///
1925    /// ```
1926    /// let a = [1, 2, 3];
1927    ///
1928    /// let doubled = a.iter().map(|x| x * 2).collect::<Vec<_>>();
1929    ///
1930    /// assert_eq!(vec![2, 4, 6], doubled);
1931    /// ```
1932    ///
1933    /// Using `collect()` to make a [`String`]:
1934    ///
1935    /// ```
1936    /// let chars = ['g', 'd', 'k', 'k', 'n'];
1937    ///
1938    /// let hello: String = chars.iter()
1939    ///     .map(|&x| x as u8)
1940    ///     .map(|x| (x + 1) as char)
1941    ///     .collect();
1942    ///
1943    /// assert_eq!("hello", hello);
1944    /// ```
1945    ///
1946    /// If you have a list of [`Result<T, E>`][`Result`]s, you can use `collect()` to
1947    /// see if any of them failed:
1948    ///
1949    /// ```
1950    /// let results = [Ok(1), Err("nope"), Ok(3), Err("bad")];
1951    ///
1952    /// let result: Result<Vec<_>, &str> = results.iter().cloned().collect();
1953    ///
1954    /// // gives us the first error
1955    /// assert_eq!(Err("nope"), result);
1956    ///
1957    /// let results = [Ok(1), Ok(3)];
1958    ///
1959    /// let result: Result<Vec<_>, &str> = results.iter().cloned().collect();
1960    ///
1961    /// // gives us the list of answers
1962    /// assert_eq!(Ok(vec![1, 3]), result);
1963    /// ```
1964    ///
1965    /// [`iter`]: Iterator::next
1966    /// [`String`]: ../../std/string/struct.String.html
1967    /// [`char`]: type@char
1968    #[inline]
1969    #[stable(feature = "rust1", since = "1.0.0")]
1970    #[must_use = "if you really need to exhaust the iterator, consider `.for_each(drop)` instead"]
1971    #[rustc_diagnostic_item = "iterator_collect_fn"]
1972    fn collect<B: FromIterator<Self::Item>>(self) -> B
1973    where
1974        Self: Sized,
1975    {
1976        // This is too aggressive to turn on for everything all the time, but PR#137908
1977        // accidentally noticed that some rustc iterators had malformed `size_hint`s,
1978        // so this will help catch such things in debug-assertions-std runners,
1979        // even if users won't actually ever see it.
1980        if cfg!(debug_assertions) {
1981            let hint = self.size_hint();
1982            assert!(hint.1.is_none_or(|high| high >= hint.0), "Malformed size_hint {hint:?}");
1983        }
1984
1985        FromIterator::from_iter(self)
1986    }
1987
1988    /// Fallibly transforms an iterator into a collection, short circuiting if
1989    /// a failure is encountered.
1990    ///
1991    /// `try_collect()` is a variation of [`collect()`][`collect`] that allows fallible
1992    /// conversions during collection. Its main use case is simplifying conversions from
1993    /// iterators yielding [`Option<T>`][`Option`] into `Option<Collection<T>>`, or similarly for other [`Try`]
1994    /// types (e.g. [`Result`]).
1995    ///
1996    /// Importantly, `try_collect()` doesn't require that the outer [`Try`] type also implements [`FromIterator`];
1997    /// only the inner type produced on `Try::Output` must implement it. Concretely,
1998    /// this means that collecting into `ControlFlow<_, Vec<i32>>` is valid because `Vec<i32>` implements
1999    /// [`FromIterator`], even though [`ControlFlow`] doesn't.
2000    ///
2001    /// Also, if a failure is encountered during `try_collect()`, the iterator is still valid and
2002    /// may continue to be used, in which case it will continue iterating starting after the element that
2003    /// triggered the failure. See the last example below for an example of how this works.
2004    ///
2005    /// # Examples
2006    /// Successfully collecting an iterator of `Option<i32>` into `Option<Vec<i32>>`:
2007    /// ```
2008    /// #![feature(iterator_try_collect)]
2009    ///
2010    /// let u = vec![Some(1), Some(2), Some(3)];
2011    /// let v = u.into_iter().try_collect::<Vec<i32>>();
2012    /// assert_eq!(v, Some(vec![1, 2, 3]));
2013    /// ```
2014    ///
2015    /// Failing to collect in the same way:
2016    /// ```
2017    /// #![feature(iterator_try_collect)]
2018    ///
2019    /// let u = vec![Some(1), Some(2), None, Some(3)];
2020    /// let v = u.into_iter().try_collect::<Vec<i32>>();
2021    /// assert_eq!(v, None);
2022    /// ```
2023    ///
2024    /// A similar example, but with `Result`:
2025    /// ```
2026    /// #![feature(iterator_try_collect)]
2027    ///
2028    /// let u: Vec<Result<i32, ()>> = vec![Ok(1), Ok(2), Ok(3)];
2029    /// let v = u.into_iter().try_collect::<Vec<i32>>();
2030    /// assert_eq!(v, Ok(vec![1, 2, 3]));
2031    ///
2032    /// let u = vec![Ok(1), Ok(2), Err(()), Ok(3)];
2033    /// let v = u.into_iter().try_collect::<Vec<i32>>();
2034    /// assert_eq!(v, Err(()));
2035    /// ```
2036    ///
2037    /// Finally, even [`ControlFlow`] works, despite the fact that it
2038    /// doesn't implement [`FromIterator`]. Note also that the iterator can
2039    /// continue to be used, even if a failure is encountered:
2040    ///
2041    /// ```
2042    /// #![feature(iterator_try_collect)]
2043    ///
2044    /// use core::ops::ControlFlow::{Break, Continue};
2045    ///
2046    /// let u = [Continue(1), Continue(2), Break(3), Continue(4), Continue(5)];
2047    /// let mut it = u.into_iter();
2048    ///
2049    /// let v = it.try_collect::<Vec<_>>();
2050    /// assert_eq!(v, Break(3));
2051    ///
2052    /// let v = it.try_collect::<Vec<_>>();
2053    /// assert_eq!(v, Continue(vec![4, 5]));
2054    /// ```
2055    ///
2056    /// [`collect`]: Iterator::collect
2057    #[inline]
2058    #[unstable(feature = "iterator_try_collect", issue = "94047")]
2059    fn try_collect<B>(&mut self) -> ChangeOutputType<Self::Item, B>
2060    where
2061        Self: Sized,
2062        Self::Item: Try<Residual: Residual<B>>,
2063        B: FromIterator<<Self::Item as Try>::Output>,
2064    {
2065        try_process(ByRefSized(self), |i| i.collect())
2066    }
2067
2068    /// Collects all the items from an iterator into a collection.
2069    ///
2070    /// This method consumes the iterator and adds all its items to the
2071    /// passed collection. The collection is then returned, so the call chain
2072    /// can be continued.
2073    ///
2074    /// This is useful when you already have a collection and want to add
2075    /// the iterator items to it.
2076    ///
2077    /// This method is a convenience method to call [Extend::extend](trait.Extend.html),
2078    /// but instead of being called on a collection, it's called on an iterator.
2079    ///
2080    /// # Examples
2081    ///
2082    /// Basic usage:
2083    ///
2084    /// ```
2085    /// #![feature(iter_collect_into)]
2086    ///
2087    /// let a = [1, 2, 3];
2088    /// let mut vec: Vec::<i32> = vec![0, 1];
2089    ///
2090    /// a.iter().map(|&x| x * 2).collect_into(&mut vec);
2091    /// a.iter().map(|&x| x * 10).collect_into(&mut vec);
2092    ///
2093    /// assert_eq!(vec, vec![0, 1, 2, 4, 6, 10, 20, 30]);
2094    /// ```
2095    ///
2096    /// `Vec` can have a manual set capacity to avoid reallocating it:
2097    ///
2098    /// ```
2099    /// #![feature(iter_collect_into)]
2100    ///
2101    /// let a = [1, 2, 3];
2102    /// let mut vec: Vec::<i32> = Vec::with_capacity(6);
2103    ///
2104    /// a.iter().map(|&x| x * 2).collect_into(&mut vec);
2105    /// a.iter().map(|&x| x * 10).collect_into(&mut vec);
2106    ///
2107    /// assert_eq!(6, vec.capacity());
2108    /// assert_eq!(vec, vec![2, 4, 6, 10, 20, 30]);
2109    /// ```
2110    ///
2111    /// The returned mutable reference can be used to continue the call chain:
2112    ///
2113    /// ```
2114    /// #![feature(iter_collect_into)]
2115    ///
2116    /// let a = [1, 2, 3];
2117    /// let mut vec: Vec::<i32> = Vec::with_capacity(6);
2118    ///
2119    /// let count = a.iter().collect_into(&mut vec).iter().count();
2120    ///
2121    /// assert_eq!(count, vec.len());
2122    /// assert_eq!(vec, vec![1, 2, 3]);
2123    ///
2124    /// let count = a.iter().collect_into(&mut vec).iter().count();
2125    ///
2126    /// assert_eq!(count, vec.len());
2127    /// assert_eq!(vec, vec![1, 2, 3, 1, 2, 3]);
2128    /// ```
2129    #[inline]
2130    #[unstable(feature = "iter_collect_into", reason = "new API", issue = "94780")]
2131    fn collect_into<E: Extend<Self::Item>>(self, collection: &mut E) -> &mut E
2132    where
2133        Self: Sized,
2134    {
2135        collection.extend(self);
2136        collection
2137    }
2138
2139    /// Consumes an iterator, creating two collections from it.
2140    ///
2141    /// The predicate passed to `partition()` can return `true`, or `false`.
2142    /// `partition()` returns a pair, all of the elements for which it returned
2143    /// `true`, and all of the elements for which it returned `false`.
2144    ///
2145    /// See also [`is_partitioned()`] and [`partition_in_place()`].
2146    ///
2147    /// [`is_partitioned()`]: Iterator::is_partitioned
2148    /// [`partition_in_place()`]: Iterator::partition_in_place
2149    ///
2150    /// # Examples
2151    ///
2152    /// ```
2153    /// let a = [1, 2, 3];
2154    ///
2155    /// let (even, odd): (Vec<_>, Vec<_>) = a
2156    ///     .into_iter()
2157    ///     .partition(|n| n % 2 == 0);
2158    ///
2159    /// assert_eq!(even, vec![2]);
2160    /// assert_eq!(odd, vec![1, 3]);
2161    /// ```
2162    #[stable(feature = "rust1", since = "1.0.0")]
2163    fn partition<B, F>(self, f: F) -> (B, B)
2164    where
2165        Self: Sized,
2166        B: Default + Extend<Self::Item>,
2167        F: FnMut(&Self::Item) -> bool,
2168    {
2169        #[inline]
2170        fn extend<'a, T, B: Extend<T>>(
2171            mut f: impl FnMut(&T) -> bool + 'a,
2172            left: &'a mut B,
2173            right: &'a mut B,
2174        ) -> impl FnMut((), T) + 'a {
2175            move |(), x| {
2176                if f(&x) {
2177                    left.extend_one(x);
2178                } else {
2179                    right.extend_one(x);
2180                }
2181            }
2182        }
2183
2184        let mut left: B = Default::default();
2185        let mut right: B = Default::default();
2186
2187        self.fold((), extend(f, &mut left, &mut right));
2188
2189        (left, right)
2190    }
2191
2192    /// Reorders the elements of this iterator *in-place* according to the given predicate,
2193    /// such that all those that return `true` precede all those that return `false`.
2194    /// Returns the number of `true` elements found.
2195    ///
2196    /// The relative order of partitioned items is not maintained.
2197    ///
2198    /// # Current implementation
2199    ///
2200    /// The current algorithm tries to find the first element for which the predicate evaluates
2201    /// to false and the last element for which it evaluates to true, and repeatedly swaps them.
2202    ///
2203    /// Time complexity: *O*(*n*)
2204    ///
2205    /// See also [`is_partitioned()`] and [`partition()`].
2206    ///
2207    /// [`is_partitioned()`]: Iterator::is_partitioned
2208    /// [`partition()`]: Iterator::partition
2209    ///
2210    /// # Examples
2211    ///
2212    /// ```
2213    /// #![feature(iter_partition_in_place)]
2214    ///
2215    /// let mut a = [1, 2, 3, 4, 5, 6, 7];
2216    ///
2217    /// // Partition in-place between evens and odds
2218    /// let i = a.iter_mut().partition_in_place(|&n| n % 2 == 0);
2219    ///
2220    /// assert_eq!(i, 3);
2221    /// assert!(a[..i].iter().all(|&n| n % 2 == 0)); // evens
2222    /// assert!(a[i..].iter().all(|&n| n % 2 == 1)); // odds
2223    /// ```
2224    #[unstable(feature = "iter_partition_in_place", reason = "new API", issue = "62543")]
2225    fn partition_in_place<'a, T: 'a, P>(mut self, ref mut predicate: P) -> usize
2226    where
2227        Self: Sized + DoubleEndedIterator<Item = &'a mut T>,
2228        P: FnMut(&T) -> bool,
2229    {
2230        // FIXME: should we worry about the count overflowing? The only way to have more than
2231        // `usize::MAX` mutable references is with ZSTs, which aren't useful to partition...
2232
2233        // These closure "factory" functions exist to avoid genericity in `Self`.
2234
2235        #[inline]
2236        fn is_false<'a, T>(
2237            predicate: &'a mut impl FnMut(&T) -> bool,
2238            true_count: &'a mut usize,
2239        ) -> impl FnMut(&&mut T) -> bool + 'a {
2240            move |x| {
2241                let p = predicate(&**x);
2242                *true_count += p as usize;
2243                !p
2244            }
2245        }
2246
2247        #[inline]
2248        fn is_true<T>(predicate: &mut impl FnMut(&T) -> bool) -> impl FnMut(&&mut T) -> bool + '_ {
2249            move |x| predicate(&**x)
2250        }
2251
2252        // Repeatedly find the first `false` and swap it with the last `true`.
2253        let mut true_count = 0;
2254        while let Some(head) = self.find(is_false(predicate, &mut true_count)) {
2255            if let Some(tail) = self.rfind(is_true(predicate)) {
2256                crate::mem::swap(head, tail);
2257                true_count += 1;
2258            } else {
2259                break;
2260            }
2261        }
2262        true_count
2263    }
2264
2265    /// Checks if the elements of this iterator are partitioned according to the given predicate,
2266    /// such that all those that return `true` precede all those that return `false`.
2267    ///
2268    /// See also [`partition()`] and [`partition_in_place()`].
2269    ///
2270    /// [`partition()`]: Iterator::partition
2271    /// [`partition_in_place()`]: Iterator::partition_in_place
2272    ///
2273    /// # Examples
2274    ///
2275    /// ```
2276    /// #![feature(iter_is_partitioned)]
2277    ///
2278    /// assert!("Iterator".chars().is_partitioned(char::is_uppercase));
2279    /// assert!(!"IntoIterator".chars().is_partitioned(char::is_uppercase));
2280    /// ```
2281    #[unstable(feature = "iter_is_partitioned", reason = "new API", issue = "62544")]
2282    fn is_partitioned<P>(mut self, mut predicate: P) -> bool
2283    where
2284        Self: Sized,
2285        P: FnMut(Self::Item) -> bool,
2286    {
2287        // Either all items test `true`, or the first clause stops at `false`
2288        // and we check that there are no more `true` items after that.
2289        self.all(&mut predicate) || !self.any(predicate)
2290    }
2291
2292    /// An iterator method that applies a function as long as it returns
2293    /// successfully, producing a single, final value.
2294    ///
2295    /// `try_fold()` takes two arguments: an initial value, and a closure with
2296    /// two arguments: an 'accumulator', and an element. The closure either
2297    /// returns successfully, with the value that the accumulator should have
2298    /// for the next iteration, or it returns failure, with an error value that
2299    /// is propagated back to the caller immediately (short-circuiting).
2300    ///
2301    /// The initial value is the value the accumulator will have on the first
2302    /// call. If applying the closure succeeded against every element of the
2303    /// iterator, `try_fold()` returns the final accumulator as success.
2304    ///
2305    /// Folding is useful whenever you have a collection of something, and want
2306    /// to produce a single value from it.
2307    ///
2308    /// # Note to Implementors
2309    ///
2310    /// Several of the other (forward) methods have default implementations in
2311    /// terms of this one, so try to implement this explicitly if it can
2312    /// do something better than the default `for` loop implementation.
2313    ///
2314    /// In particular, try to have this call `try_fold()` on the internal parts
2315    /// from which this iterator is composed. If multiple calls are needed,
2316    /// the `?` operator may be convenient for chaining the accumulator value
2317    /// along, but beware any invariants that need to be upheld before those
2318    /// early returns. This is a `&mut self` method, so iteration needs to be
2319    /// resumable after hitting an error here.
2320    ///
2321    /// # Examples
2322    ///
2323    /// Basic usage:
2324    ///
2325    /// ```
2326    /// let a = [1, 2, 3];
2327    ///
2328    /// // the checked sum of all of the elements of the array
2329    /// let sum = a.iter().try_fold(0i8, |acc, &x| acc.checked_add(x));
2330    ///
2331    /// assert_eq!(sum, Some(6));
2332    /// ```
2333    ///
2334    /// Short-circuiting:
2335    ///
2336    /// ```
2337    /// let a = [10, 20, 30, 100, 40, 50];
2338    /// let mut it = a.iter();
2339    ///
2340    /// // This sum overflows when adding the 100 element
2341    /// let sum = it.try_fold(0i8, |acc, &x| acc.checked_add(x));
2342    /// assert_eq!(sum, None);
2343    ///
2344    /// // Because it short-circuited, the remaining elements are still
2345    /// // available through the iterator.
2346    /// assert_eq!(it.len(), 2);
2347    /// assert_eq!(it.next(), Some(&40));
2348    /// ```
2349    ///
2350    /// While you cannot `break` from a closure, the [`ControlFlow`] type allows
2351    /// a similar idea:
2352    ///
2353    /// ```
2354    /// use std::ops::ControlFlow;
2355    ///
2356    /// let triangular = (1..30).try_fold(0_i8, |prev, x| {
2357    ///     if let Some(next) = prev.checked_add(x) {
2358    ///         ControlFlow::Continue(next)
2359    ///     } else {
2360    ///         ControlFlow::Break(prev)
2361    ///     }
2362    /// });
2363    /// assert_eq!(triangular, ControlFlow::Break(120));
2364    ///
2365    /// let triangular = (1..30).try_fold(0_u64, |prev, x| {
2366    ///     if let Some(next) = prev.checked_add(x) {
2367    ///         ControlFlow::Continue(next)
2368    ///     } else {
2369    ///         ControlFlow::Break(prev)
2370    ///     }
2371    /// });
2372    /// assert_eq!(triangular, ControlFlow::Continue(435));
2373    /// ```
2374    #[inline]
2375    #[stable(feature = "iterator_try_fold", since = "1.27.0")]
2376    fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R
2377    where
2378        Self: Sized,
2379        F: FnMut(B, Self::Item) -> R,
2380        R: Try<Output = B>,
2381    {
2382        let mut accum = init;
2383        while let Some(x) = self.next() {
2384            accum = f(accum, x)?;
2385        }
2386        try { accum }
2387    }
2388
2389    /// An iterator method that applies a fallible function to each item in the
2390    /// iterator, stopping at the first error and returning that error.
2391    ///
2392    /// This can also be thought of as the fallible form of [`for_each()`]
2393    /// or as the stateless version of [`try_fold()`].
2394    ///
2395    /// [`for_each()`]: Iterator::for_each
2396    /// [`try_fold()`]: Iterator::try_fold
2397    ///
2398    /// # Examples
2399    ///
2400    /// ```
2401    /// use std::fs::rename;
2402    /// use std::io::{stdout, Write};
2403    /// use std::path::Path;
2404    ///
2405    /// let data = ["no_tea.txt", "stale_bread.json", "torrential_rain.png"];
2406    ///
2407    /// let res = data.iter().try_for_each(|x| writeln!(stdout(), "{x}"));
2408    /// assert!(res.is_ok());
2409    ///
2410    /// let mut it = data.iter().cloned();
2411    /// let res = it.try_for_each(|x| rename(x, Path::new(x).with_extension("old")));
2412    /// assert!(res.is_err());
2413    /// // It short-circuited, so the remaining items are still in the iterator:
2414    /// assert_eq!(it.next(), Some("stale_bread.json"));
2415    /// ```
2416    ///
2417    /// The [`ControlFlow`] type can be used with this method for the situations
2418    /// in which you'd use `break` and `continue` in a normal loop:
2419    ///
2420    /// ```
2421    /// use std::ops::ControlFlow;
2422    ///
2423    /// let r = (2..100).try_for_each(|x| {
2424    ///     if 323 % x == 0 {
2425    ///         return ControlFlow::Break(x)
2426    ///     }
2427    ///
2428    ///     ControlFlow::Continue(())
2429    /// });
2430    /// assert_eq!(r, ControlFlow::Break(17));
2431    /// ```
2432    #[inline]
2433    #[stable(feature = "iterator_try_fold", since = "1.27.0")]
2434    fn try_for_each<F, R>(&mut self, f: F) -> R
2435    where
2436        Self: Sized,
2437        F: FnMut(Self::Item) -> R,
2438        R: Try<Output = ()>,
2439    {
2440        #[inline]
2441        fn call<T, R>(mut f: impl FnMut(T) -> R) -> impl FnMut((), T) -> R {
2442            move |(), x| f(x)
2443        }
2444
2445        self.try_fold((), call(f))
2446    }
2447
2448    /// Folds every element into an accumulator by applying an operation,
2449    /// returning the final result.
2450    ///
2451    /// `fold()` takes two arguments: an initial value, and a closure with two
2452    /// arguments: an 'accumulator', and an element. The closure returns the value that
2453    /// the accumulator should have for the next iteration.
2454    ///
2455    /// The initial value is the value the accumulator will have on the first
2456    /// call.
2457    ///
2458    /// After applying this closure to every element of the iterator, `fold()`
2459    /// returns the accumulator.
2460    ///
2461    /// This operation is sometimes called 'reduce' or 'inject'.
2462    ///
2463    /// Folding is useful whenever you have a collection of something, and want
2464    /// to produce a single value from it.
2465    ///
2466    /// Note: `fold()`, and similar methods that traverse the entire iterator,
2467    /// might not terminate for infinite iterators, even on traits for which a
2468    /// result is determinable in finite time.
2469    ///
2470    /// Note: [`reduce()`] can be used to use the first element as the initial
2471    /// value, if the accumulator type and item type is the same.
2472    ///
2473    /// Note: `fold()` combines elements in a *left-associative* fashion. For associative
2474    /// operators like `+`, the order the elements are combined in is not important, but for non-associative
2475    /// operators like `-` the order will affect the final result.
2476    /// For a *right-associative* version of `fold()`, see [`DoubleEndedIterator::rfold()`].
2477    ///
2478    /// # Note to Implementors
2479    ///
2480    /// Several of the other (forward) methods have default implementations in
2481    /// terms of this one, so try to implement this explicitly if it can
2482    /// do something better than the default `for` loop implementation.
2483    ///
2484    /// In particular, try to have this call `fold()` on the internal parts
2485    /// from which this iterator is composed.
2486    ///
2487    /// # Examples
2488    ///
2489    /// Basic usage:
2490    ///
2491    /// ```
2492    /// let a = [1, 2, 3];
2493    ///
2494    /// // the sum of all of the elements of the array
2495    /// let sum = a.iter().fold(0, |acc, x| acc + x);
2496    ///
2497    /// assert_eq!(sum, 6);
2498    /// ```
2499    ///
2500    /// Let's walk through each step of the iteration here:
2501    ///
2502    /// | element | acc | x | result |
2503    /// |---------|-----|---|--------|
2504    /// |         | 0   |   |        |
2505    /// | 1       | 0   | 1 | 1      |
2506    /// | 2       | 1   | 2 | 3      |
2507    /// | 3       | 3   | 3 | 6      |
2508    ///
2509    /// And so, our final result, `6`.
2510    ///
2511    /// This example demonstrates the left-associative nature of `fold()`:
2512    /// it builds a string, starting with an initial value
2513    /// and continuing with each element from the front until the back:
2514    ///
2515    /// ```
2516    /// let numbers = [1, 2, 3, 4, 5];
2517    ///
2518    /// let zero = "0".to_string();
2519    ///
2520    /// let result = numbers.iter().fold(zero, |acc, &x| {
2521    ///     format!("({acc} + {x})")
2522    /// });
2523    ///
2524    /// assert_eq!(result, "(((((0 + 1) + 2) + 3) + 4) + 5)");
2525    /// ```
2526    /// It's common for people who haven't used iterators a lot to
2527    /// use a `for` loop with a list of things to build up a result. Those
2528    /// can be turned into `fold()`s:
2529    ///
2530    /// [`for`]: ../../book/ch03-05-control-flow.html#looping-through-a-collection-with-for
2531    ///
2532    /// ```
2533    /// let numbers = [1, 2, 3, 4, 5];
2534    ///
2535    /// let mut result = 0;
2536    ///
2537    /// // for loop:
2538    /// for i in &numbers {
2539    ///     result = result + i;
2540    /// }
2541    ///
2542    /// // fold:
2543    /// let result2 = numbers.iter().fold(0, |acc, &x| acc + x);
2544    ///
2545    /// // they're the same
2546    /// assert_eq!(result, result2);
2547    /// ```
2548    ///
2549    /// [`reduce()`]: Iterator::reduce
2550    #[doc(alias = "inject", alias = "foldl")]
2551    #[inline]
2552    #[stable(feature = "rust1", since = "1.0.0")]
2553    fn fold<B, F>(mut self, init: B, mut f: F) -> B
2554    where
2555        Self: Sized,
2556        F: FnMut(B, Self::Item) -> B,
2557    {
2558        let mut accum = init;
2559        while let Some(x) = self.next() {
2560            accum = f(accum, x);
2561        }
2562        accum
2563    }
2564
2565    /// Reduces the elements to a single one, by repeatedly applying a reducing
2566    /// operation.
2567    ///
2568    /// If the iterator is empty, returns [`None`]; otherwise, returns the
2569    /// result of the reduction.
2570    ///
2571    /// The reducing function is a closure with two arguments: an 'accumulator', and an element.
2572    /// For iterators with at least one element, this is the same as [`fold()`]
2573    /// with the first element of the iterator as the initial accumulator value, folding
2574    /// every subsequent element into it.
2575    ///
2576    /// [`fold()`]: Iterator::fold
2577    ///
2578    /// # Example
2579    ///
2580    /// ```
2581    /// let reduced: i32 = (1..10).reduce(|acc, e| acc + e).unwrap_or(0);
2582    /// assert_eq!(reduced, 45);
2583    ///
2584    /// // Which is equivalent to doing it with `fold`:
2585    /// let folded: i32 = (1..10).fold(0, |acc, e| acc + e);
2586    /// assert_eq!(reduced, folded);
2587    /// ```
2588    #[inline]
2589    #[stable(feature = "iterator_fold_self", since = "1.51.0")]
2590    fn reduce<F>(mut self, f: F) -> Option<Self::Item>
2591    where
2592        Self: Sized,
2593        F: FnMut(Self::Item, Self::Item) -> Self::Item,
2594    {
2595        let first = self.next()?;
2596        Some(self.fold(first, f))
2597    }
2598
2599    /// Reduces the elements to a single one by repeatedly applying a reducing operation. If the
2600    /// closure returns a failure, the failure is propagated back to the caller immediately.
2601    ///
2602    /// The return type of this method depends on the return type of the closure. If the closure
2603    /// returns `Result<Self::Item, E>`, then this function will return `Result<Option<Self::Item>,
2604    /// E>`. If the closure returns `Option<Self::Item>`, then this function will return
2605    /// `Option<Option<Self::Item>>`.
2606    ///
2607    /// When called on an empty iterator, this function will return either `Some(None)` or
2608    /// `Ok(None)` depending on the type of the provided closure.
2609    ///
2610    /// For iterators with at least one element, this is essentially the same as calling
2611    /// [`try_fold()`] with the first element of the iterator as the initial accumulator value.
2612    ///
2613    /// [`try_fold()`]: Iterator::try_fold
2614    ///
2615    /// # Examples
2616    ///
2617    /// Safely calculate the sum of a series of numbers:
2618    ///
2619    /// ```
2620    /// #![feature(iterator_try_reduce)]
2621    ///
2622    /// let numbers: Vec<usize> = vec![10, 20, 5, 23, 0];
2623    /// let sum = numbers.into_iter().try_reduce(|x, y| x.checked_add(y));
2624    /// assert_eq!(sum, Some(Some(58)));
2625    /// ```
2626    ///
2627    /// Determine when a reduction short circuited:
2628    ///
2629    /// ```
2630    /// #![feature(iterator_try_reduce)]
2631    ///
2632    /// let numbers = vec![1, 2, 3, usize::MAX, 4, 5];
2633    /// let sum = numbers.into_iter().try_reduce(|x, y| x.checked_add(y));
2634    /// assert_eq!(sum, None);
2635    /// ```
2636    ///
2637    /// Determine when a reduction was not performed because there are no elements:
2638    ///
2639    /// ```
2640    /// #![feature(iterator_try_reduce)]
2641    ///
2642    /// let numbers: Vec<usize> = Vec::new();
2643    /// let sum = numbers.into_iter().try_reduce(|x, y| x.checked_add(y));
2644    /// assert_eq!(sum, Some(None));
2645    /// ```
2646    ///
2647    /// Use a [`Result`] instead of an [`Option`]:
2648    ///
2649    /// ```
2650    /// #![feature(iterator_try_reduce)]
2651    ///
2652    /// let numbers = vec!["1", "2", "3", "4", "5"];
2653    /// let max: Result<Option<_>, <usize as std::str::FromStr>::Err> =
2654    ///     numbers.into_iter().try_reduce(|x, y| {
2655    ///         if x.parse::<usize>()? > y.parse::<usize>()? { Ok(x) } else { Ok(y) }
2656    ///     });
2657    /// assert_eq!(max, Ok(Some("5")));
2658    /// ```
2659    #[inline]
2660    #[unstable(feature = "iterator_try_reduce", reason = "new API", issue = "87053")]
2661    fn try_reduce<R>(
2662        &mut self,
2663        f: impl FnMut(Self::Item, Self::Item) -> R,
2664    ) -> ChangeOutputType<R, Option<R::Output>>
2665    where
2666        Self: Sized,
2667        R: Try<Output = Self::Item, Residual: Residual<Option<Self::Item>>>,
2668    {
2669        let first = match self.next() {
2670            Some(i) => i,
2671            None => return Try::from_output(None),
2672        };
2673
2674        match self.try_fold(first, f).branch() {
2675            ControlFlow::Break(r) => FromResidual::from_residual(r),
2676            ControlFlow::Continue(i) => Try::from_output(Some(i)),
2677        }
2678    }
2679
2680    /// Tests if every element of the iterator matches a predicate.
2681    ///
2682    /// `all()` takes a closure that returns `true` or `false`. It applies
2683    /// this closure to each element of the iterator, and if they all return
2684    /// `true`, then so does `all()`. If any of them return `false`, it
2685    /// returns `false`.
2686    ///
2687    /// `all()` is short-circuiting; in other words, it will stop processing
2688    /// as soon as it finds a `false`, given that no matter what else happens,
2689    /// the result will also be `false`.
2690    ///
2691    /// An empty iterator returns `true`.
2692    ///
2693    /// # Examples
2694    ///
2695    /// Basic usage:
2696    ///
2697    /// ```
2698    /// let a = [1, 2, 3];
2699    ///
2700    /// assert!(a.iter().all(|&x| x > 0));
2701    ///
2702    /// assert!(!a.iter().all(|&x| x > 2));
2703    /// ```
2704    ///
2705    /// Stopping at the first `false`:
2706    ///
2707    /// ```
2708    /// let a = [1, 2, 3];
2709    ///
2710    /// let mut iter = a.iter();
2711    ///
2712    /// assert!(!iter.all(|&x| x != 2));
2713    ///
2714    /// // we can still use `iter`, as there are more elements.
2715    /// assert_eq!(iter.next(), Some(&3));
2716    /// ```
2717    #[inline]
2718    #[stable(feature = "rust1", since = "1.0.0")]
2719    fn all<F>(&mut self, f: F) -> bool
2720    where
2721        Self: Sized,
2722        F: FnMut(Self::Item) -> bool,
2723    {
2724        #[inline]
2725        fn check<T>(mut f: impl FnMut(T) -> bool) -> impl FnMut((), T) -> ControlFlow<()> {
2726            move |(), x| {
2727                if f(x) { ControlFlow::Continue(()) } else { ControlFlow::Break(()) }
2728            }
2729        }
2730        self.try_fold((), check(f)) == ControlFlow::Continue(())
2731    }
2732
2733    /// Tests if any element of the iterator matches a predicate.
2734    ///
2735    /// `any()` takes a closure that returns `true` or `false`. It applies
2736    /// this closure to each element of the iterator, and if any of them return
2737    /// `true`, then so does `any()`. If they all return `false`, it
2738    /// returns `false`.
2739    ///
2740    /// `any()` is short-circuiting; in other words, it will stop processing
2741    /// as soon as it finds a `true`, given that no matter what else happens,
2742    /// the result will also be `true`.
2743    ///
2744    /// An empty iterator returns `false`.
2745    ///
2746    /// # Examples
2747    ///
2748    /// Basic usage:
2749    ///
2750    /// ```
2751    /// let a = [1, 2, 3];
2752    ///
2753    /// assert!(a.iter().any(|&x| x > 0));
2754    ///
2755    /// assert!(!a.iter().any(|&x| x > 5));
2756    /// ```
2757    ///
2758    /// Stopping at the first `true`:
2759    ///
2760    /// ```
2761    /// let a = [1, 2, 3];
2762    ///
2763    /// let mut iter = a.iter();
2764    ///
2765    /// assert!(iter.any(|&x| x != 2));
2766    ///
2767    /// // we can still use `iter`, as there are more elements.
2768    /// assert_eq!(iter.next(), Some(&2));
2769    /// ```
2770    #[inline]
2771    #[stable(feature = "rust1", since = "1.0.0")]
2772    fn any<F>(&mut self, f: F) -> bool
2773    where
2774        Self: Sized,
2775        F: FnMut(Self::Item) -> bool,
2776    {
2777        #[inline]
2778        fn check<T>(mut f: impl FnMut(T) -> bool) -> impl FnMut((), T) -> ControlFlow<()> {
2779            move |(), x| {
2780                if f(x) { ControlFlow::Break(()) } else { ControlFlow::Continue(()) }
2781            }
2782        }
2783
2784        self.try_fold((), check(f)) == ControlFlow::Break(())
2785    }
2786
2787    /// Searches for an element of an iterator that satisfies a predicate.
2788    ///
2789    /// `find()` takes a closure that returns `true` or `false`. It applies
2790    /// this closure to each element of the iterator, and if any of them return
2791    /// `true`, then `find()` returns [`Some(element)`]. If they all return
2792    /// `false`, it returns [`None`].
2793    ///
2794    /// `find()` is short-circuiting; in other words, it will stop processing
2795    /// as soon as the closure returns `true`.
2796    ///
2797    /// Because `find()` takes a reference, and many iterators iterate over
2798    /// references, this leads to a possibly confusing situation where the
2799    /// argument is a double reference. You can see this effect in the
2800    /// examples below, with `&&x`.
2801    ///
2802    /// If you need the index of the element, see [`position()`].
2803    ///
2804    /// [`Some(element)`]: Some
2805    /// [`position()`]: Iterator::position
2806    ///
2807    /// # Examples
2808    ///
2809    /// Basic usage:
2810    ///
2811    /// ```
2812    /// let a = [1, 2, 3];
2813    ///
2814    /// assert_eq!(a.iter().find(|&&x| x == 2), Some(&2));
2815    ///
2816    /// assert_eq!(a.iter().find(|&&x| x == 5), None);
2817    /// ```
2818    ///
2819    /// Stopping at the first `true`:
2820    ///
2821    /// ```
2822    /// let a = [1, 2, 3];
2823    ///
2824    /// let mut iter = a.iter();
2825    ///
2826    /// assert_eq!(iter.find(|&&x| x == 2), Some(&2));
2827    ///
2828    /// // we can still use `iter`, as there are more elements.
2829    /// assert_eq!(iter.next(), Some(&3));
2830    /// ```
2831    ///
2832    /// Note that `iter.find(f)` is equivalent to `iter.filter(f).next()`.
2833    #[inline]
2834    #[stable(feature = "rust1", since = "1.0.0")]
2835    fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
2836    where
2837        Self: Sized,
2838        P: FnMut(&Self::Item) -> bool,
2839    {
2840        #[inline]
2841        fn check<T>(mut predicate: impl FnMut(&T) -> bool) -> impl FnMut((), T) -> ControlFlow<T> {
2842            move |(), x| {
2843                if predicate(&x) { ControlFlow::Break(x) } else { ControlFlow::Continue(()) }
2844            }
2845        }
2846
2847        self.try_fold((), check(predicate)).break_value()
2848    }
2849
2850    /// Applies function to the elements of iterator and returns
2851    /// the first non-none result.
2852    ///
2853    /// `iter.find_map(f)` is equivalent to `iter.filter_map(f).next()`.
2854    ///
2855    /// # Examples
2856    ///
2857    /// ```
2858    /// let a = ["lol", "NaN", "2", "5"];
2859    ///
2860    /// let first_number = a.iter().find_map(|s| s.parse().ok());
2861    ///
2862    /// assert_eq!(first_number, Some(2));
2863    /// ```
2864    #[inline]
2865    #[stable(feature = "iterator_find_map", since = "1.30.0")]
2866    fn find_map<B, F>(&mut self, f: F) -> Option<B>
2867    where
2868        Self: Sized,
2869        F: FnMut(Self::Item) -> Option<B>,
2870    {
2871        #[inline]
2872        fn check<T, B>(mut f: impl FnMut(T) -> Option<B>) -> impl FnMut((), T) -> ControlFlow<B> {
2873            move |(), x| match f(x) {
2874                Some(x) => ControlFlow::Break(x),
2875                None => ControlFlow::Continue(()),
2876            }
2877        }
2878
2879        self.try_fold((), check(f)).break_value()
2880    }
2881
2882    /// Applies function to the elements of iterator and returns
2883    /// the first true result or the first error.
2884    ///
2885    /// The return type of this method depends on the return type of the closure.
2886    /// If you return `Result<bool, E>` from the closure, you'll get a `Result<Option<Self::Item>, E>`.
2887    /// If you return `Option<bool>` from the closure, you'll get an `Option<Option<Self::Item>>`.
2888    ///
2889    /// # Examples
2890    ///
2891    /// ```
2892    /// #![feature(try_find)]
2893    ///
2894    /// let a = ["1", "2", "lol", "NaN", "5"];
2895    ///
2896    /// let is_my_num = |s: &str, search: i32| -> Result<bool, std::num::ParseIntError> {
2897    ///     Ok(s.parse::<i32>()?  == search)
2898    /// };
2899    ///
2900    /// let result = a.iter().try_find(|&&s| is_my_num(s, 2));
2901    /// assert_eq!(result, Ok(Some(&"2")));
2902    ///
2903    /// let result = a.iter().try_find(|&&s| is_my_num(s, 5));
2904    /// assert!(result.is_err());
2905    /// ```
2906    ///
2907    /// This also supports other types which implement [`Try`], not just [`Result`].
2908    ///
2909    /// ```
2910    /// #![feature(try_find)]
2911    ///
2912    /// use std::num::NonZero;
2913    ///
2914    /// let a = [3, 5, 7, 4, 9, 0, 11u32];
2915    /// let result = a.iter().try_find(|&&x| NonZero::new(x).map(|y| y.is_power_of_two()));
2916    /// assert_eq!(result, Some(Some(&4)));
2917    /// let result = a.iter().take(3).try_find(|&&x| NonZero::new(x).map(|y| y.is_power_of_two()));
2918    /// assert_eq!(result, Some(None));
2919    /// let result = a.iter().rev().try_find(|&&x| NonZero::new(x).map(|y| y.is_power_of_two()));
2920    /// assert_eq!(result, None);
2921    /// ```
2922    #[inline]
2923    #[unstable(feature = "try_find", reason = "new API", issue = "63178")]
2924    fn try_find<R>(
2925        &mut self,
2926        f: impl FnMut(&Self::Item) -> R,
2927    ) -> ChangeOutputType<R, Option<Self::Item>>
2928    where
2929        Self: Sized,
2930        R: Try<Output = bool, Residual: Residual<Option<Self::Item>>>,
2931    {
2932        #[inline]
2933        fn check<I, V, R>(
2934            mut f: impl FnMut(&I) -> V,
2935        ) -> impl FnMut((), I) -> ControlFlow<R::TryType>
2936        where
2937            V: Try<Output = bool, Residual = R>,
2938            R: Residual<Option<I>>,
2939        {
2940            move |(), x| match f(&x).branch() {
2941                ControlFlow::Continue(false) => ControlFlow::Continue(()),
2942                ControlFlow::Continue(true) => ControlFlow::Break(Try::from_output(Some(x))),
2943                ControlFlow::Break(r) => ControlFlow::Break(FromResidual::from_residual(r)),
2944            }
2945        }
2946
2947        match self.try_fold((), check(f)) {
2948            ControlFlow::Break(x) => x,
2949            ControlFlow::Continue(()) => Try::from_output(None),
2950        }
2951    }
2952
2953    /// Searches for an element in an iterator, returning its index.
2954    ///
2955    /// `position()` takes a closure that returns `true` or `false`. It applies
2956    /// this closure to each element of the iterator, and if one of them
2957    /// returns `true`, then `position()` returns [`Some(index)`]. If all of
2958    /// them return `false`, it returns [`None`].
2959    ///
2960    /// `position()` is short-circuiting; in other words, it will stop
2961    /// processing as soon as it finds a `true`.
2962    ///
2963    /// # Overflow Behavior
2964    ///
2965    /// The method does no guarding against overflows, so if there are more
2966    /// than [`usize::MAX`] non-matching elements, it either produces the wrong
2967    /// result or panics. If debug assertions are enabled, a panic is
2968    /// guaranteed.
2969    ///
2970    /// # Panics
2971    ///
2972    /// This function might panic if the iterator has more than `usize::MAX`
2973    /// non-matching elements.
2974    ///
2975    /// [`Some(index)`]: Some
2976    ///
2977    /// # Examples
2978    ///
2979    /// Basic usage:
2980    ///
2981    /// ```
2982    /// let a = [1, 2, 3];
2983    ///
2984    /// assert_eq!(a.iter().position(|&x| x == 2), Some(1));
2985    ///
2986    /// assert_eq!(a.iter().position(|&x| x == 5), None);
2987    /// ```
2988    ///
2989    /// Stopping at the first `true`:
2990    ///
2991    /// ```
2992    /// let a = [1, 2, 3, 4];
2993    ///
2994    /// let mut iter = a.iter();
2995    ///
2996    /// assert_eq!(iter.position(|&x| x >= 2), Some(1));
2997    ///
2998    /// // we can still use `iter`, as there are more elements.
2999    /// assert_eq!(iter.next(), Some(&3));
3000    ///
3001    /// // The returned index depends on iterator state
3002    /// assert_eq!(iter.position(|&x| x == 4), Some(0));
3003    ///
3004    /// ```
3005    #[inline]
3006    #[stable(feature = "rust1", since = "1.0.0")]
3007    fn position<P>(&mut self, predicate: P) -> Option<usize>
3008    where
3009        Self: Sized,
3010        P: FnMut(Self::Item) -> bool,
3011    {
3012        #[inline]
3013        fn check<'a, T>(
3014            mut predicate: impl FnMut(T) -> bool + 'a,
3015            acc: &'a mut usize,
3016        ) -> impl FnMut((), T) -> ControlFlow<usize, ()> + 'a {
3017            #[rustc_inherit_overflow_checks]
3018            move |_, x| {
3019                if predicate(x) {
3020                    ControlFlow::Break(*acc)
3021                } else {
3022                    *acc += 1;
3023                    ControlFlow::Continue(())
3024                }
3025            }
3026        }
3027
3028        let mut acc = 0;
3029        self.try_fold((), check(predicate, &mut acc)).break_value()
3030    }
3031
3032    /// Searches for an element in an iterator from the right, returning its
3033    /// index.
3034    ///
3035    /// `rposition()` takes a closure that returns `true` or `false`. It applies
3036    /// this closure to each element of the iterator, starting from the end,
3037    /// and if one of them returns `true`, then `rposition()` returns
3038    /// [`Some(index)`]. If all of them return `false`, it returns [`None`].
3039    ///
3040    /// `rposition()` is short-circuiting; in other words, it will stop
3041    /// processing as soon as it finds a `true`.
3042    ///
3043    /// [`Some(index)`]: Some
3044    ///
3045    /// # Examples
3046    ///
3047    /// Basic usage:
3048    ///
3049    /// ```
3050    /// let a = [1, 2, 3];
3051    ///
3052    /// assert_eq!(a.iter().rposition(|&x| x == 3), Some(2));
3053    ///
3054    /// assert_eq!(a.iter().rposition(|&x| x == 5), None);
3055    /// ```
3056    ///
3057    /// Stopping at the first `true`:
3058    ///
3059    /// ```
3060    /// let a = [-1, 2, 3, 4];
3061    ///
3062    /// let mut iter = a.iter();
3063    ///
3064    /// assert_eq!(iter.rposition(|&x| x >= 2), Some(3));
3065    ///
3066    /// // we can still use `iter`, as there are more elements.
3067    /// assert_eq!(iter.next(), Some(&-1));
3068    /// assert_eq!(iter.next_back(), Some(&3));
3069    /// ```
3070    #[inline]
3071    #[stable(feature = "rust1", since = "1.0.0")]
3072    fn rposition<P>(&mut self, predicate: P) -> Option<usize>
3073    where
3074        P: FnMut(Self::Item) -> bool,
3075        Self: Sized + ExactSizeIterator + DoubleEndedIterator,
3076    {
3077        // No need for an overflow check here, because `ExactSizeIterator`
3078        // implies that the number of elements fits into a `usize`.
3079        #[inline]
3080        fn check<T>(
3081            mut predicate: impl FnMut(T) -> bool,
3082        ) -> impl FnMut(usize, T) -> ControlFlow<usize, usize> {
3083            move |i, x| {
3084                let i = i - 1;
3085                if predicate(x) { ControlFlow::Break(i) } else { ControlFlow::Continue(i) }
3086            }
3087        }
3088
3089        let n = self.len();
3090        self.try_rfold(n, check(predicate)).break_value()
3091    }
3092
3093    /// Returns the maximum element of an iterator.
3094    ///
3095    /// If several elements are equally maximum, the last element is
3096    /// returned. If the iterator is empty, [`None`] is returned.
3097    ///
3098    /// Note that [`f32`]/[`f64`] doesn't implement [`Ord`] due to NaN being
3099    /// incomparable. You can work around this by using [`Iterator::reduce`]:
3100    /// ```
3101    /// assert_eq!(
3102    ///     [2.4, f32::NAN, 1.3]
3103    ///         .into_iter()
3104    ///         .reduce(f32::max)
3105    ///         .unwrap_or(0.),
3106    ///     2.4
3107    /// );
3108    /// ```
3109    ///
3110    /// # Examples
3111    ///
3112    /// ```
3113    /// let a = [1, 2, 3];
3114    /// let b: Vec<u32> = Vec::new();
3115    ///
3116    /// assert_eq!(a.iter().max(), Some(&3));
3117    /// assert_eq!(b.iter().max(), None);
3118    /// ```
3119    #[inline]
3120    #[stable(feature = "rust1", since = "1.0.0")]
3121    fn max(self) -> Option<Self::Item>
3122    where
3123        Self: Sized,
3124        Self::Item: Ord,
3125    {
3126        self.max_by(Ord::cmp)
3127    }
3128
3129    /// Returns the minimum element of an iterator.
3130    ///
3131    /// If several elements are equally minimum, the first element is returned.
3132    /// If the iterator is empty, [`None`] is returned.
3133    ///
3134    /// Note that [`f32`]/[`f64`] doesn't implement [`Ord`] due to NaN being
3135    /// incomparable. You can work around this by using [`Iterator::reduce`]:
3136    /// ```
3137    /// assert_eq!(
3138    ///     [2.4, f32::NAN, 1.3]
3139    ///         .into_iter()
3140    ///         .reduce(f32::min)
3141    ///         .unwrap_or(0.),
3142    ///     1.3
3143    /// );
3144    /// ```
3145    ///
3146    /// # Examples
3147    ///
3148    /// ```
3149    /// let a = [1, 2, 3];
3150    /// let b: Vec<u32> = Vec::new();
3151    ///
3152    /// assert_eq!(a.iter().min(), Some(&1));
3153    /// assert_eq!(b.iter().min(), None);
3154    /// ```
3155    #[inline]
3156    #[stable(feature = "rust1", since = "1.0.0")]
3157    fn min(self) -> Option<Self::Item>
3158    where
3159        Self: Sized,
3160        Self::Item: Ord,
3161    {
3162        self.min_by(Ord::cmp)
3163    }
3164
3165    /// Returns the element that gives the maximum value from the
3166    /// specified function.
3167    ///
3168    /// If several elements are equally maximum, the last element is
3169    /// returned. If the iterator is empty, [`None`] is returned.
3170    ///
3171    /// # Examples
3172    ///
3173    /// ```
3174    /// let a = [-3_i32, 0, 1, 5, -10];
3175    /// assert_eq!(*a.iter().max_by_key(|x| x.abs()).unwrap(), -10);
3176    /// ```
3177    #[inline]
3178    #[stable(feature = "iter_cmp_by_key", since = "1.6.0")]
3179    fn max_by_key<B: Ord, F>(self, f: F) -> Option<Self::Item>
3180    where
3181        Self: Sized,
3182        F: FnMut(&Self::Item) -> B,
3183    {
3184        #[inline]
3185        fn key<T, B>(mut f: impl FnMut(&T) -> B) -> impl FnMut(T) -> (B, T) {
3186            move |x| (f(&x), x)
3187        }
3188
3189        #[inline]
3190        fn compare<T, B: Ord>((x_p, _): &(B, T), (y_p, _): &(B, T)) -> Ordering {
3191            x_p.cmp(y_p)
3192        }
3193
3194        let (_, x) = self.map(key(f)).max_by(compare)?;
3195        Some(x)
3196    }
3197
3198    /// Returns the element that gives the maximum value with respect to the
3199    /// specified comparison function.
3200    ///
3201    /// If several elements are equally maximum, the last element is
3202    /// returned. If the iterator is empty, [`None`] is returned.
3203    ///
3204    /// # Examples
3205    ///
3206    /// ```
3207    /// let a = [-3_i32, 0, 1, 5, -10];
3208    /// assert_eq!(*a.iter().max_by(|x, y| x.cmp(y)).unwrap(), 5);
3209    /// ```
3210    #[inline]
3211    #[stable(feature = "iter_max_by", since = "1.15.0")]
3212    fn max_by<F>(self, compare: F) -> Option<Self::Item>
3213    where
3214        Self: Sized,
3215        F: FnMut(&Self::Item, &Self::Item) -> Ordering,
3216    {
3217        #[inline]
3218        fn fold<T>(mut compare: impl FnMut(&T, &T) -> Ordering) -> impl FnMut(T, T) -> T {
3219            move |x, y| cmp::max_by(x, y, &mut compare)
3220        }
3221
3222        self.reduce(fold(compare))
3223    }
3224
3225    /// Returns the element that gives the minimum value from the
3226    /// specified function.
3227    ///
3228    /// If several elements are equally minimum, the first element is
3229    /// returned. If the iterator is empty, [`None`] is returned.
3230    ///
3231    /// # Examples
3232    ///
3233    /// ```
3234    /// let a = [-3_i32, 0, 1, 5, -10];
3235    /// assert_eq!(*a.iter().min_by_key(|x| x.abs()).unwrap(), 0);
3236    /// ```
3237    #[inline]
3238    #[stable(feature = "iter_cmp_by_key", since = "1.6.0")]
3239    fn min_by_key<B: Ord, F>(self, f: F) -> Option<Self::Item>
3240    where
3241        Self: Sized,
3242        F: FnMut(&Self::Item) -> B,
3243    {
3244        #[inline]
3245        fn key<T, B>(mut f: impl FnMut(&T) -> B) -> impl FnMut(T) -> (B, T) {
3246            move |x| (f(&x), x)
3247        }
3248
3249        #[inline]
3250        fn compare<T, B: Ord>((x_p, _): &(B, T), (y_p, _): &(B, T)) -> Ordering {
3251            x_p.cmp(y_p)
3252        }
3253
3254        let (_, x) = self.map(key(f)).min_by(compare)?;
3255        Some(x)
3256    }
3257
3258    /// Returns the element that gives the minimum value with respect to the
3259    /// specified comparison function.
3260    ///
3261    /// If several elements are equally minimum, the first element is
3262    /// returned. If the iterator is empty, [`None`] is returned.
3263    ///
3264    /// # Examples
3265    ///
3266    /// ```
3267    /// let a = [-3_i32, 0, 1, 5, -10];
3268    /// assert_eq!(*a.iter().min_by(|x, y| x.cmp(y)).unwrap(), -10);
3269    /// ```
3270    #[inline]
3271    #[stable(feature = "iter_min_by", since = "1.15.0")]
3272    fn min_by<F>(self, compare: F) -> Option<Self::Item>
3273    where
3274        Self: Sized,
3275        F: FnMut(&Self::Item, &Self::Item) -> Ordering,
3276    {
3277        #[inline]
3278        fn fold<T>(mut compare: impl FnMut(&T, &T) -> Ordering) -> impl FnMut(T, T) -> T {
3279            move |x, y| cmp::min_by(x, y, &mut compare)
3280        }
3281
3282        self.reduce(fold(compare))
3283    }
3284
3285    /// Reverses an iterator's direction.
3286    ///
3287    /// Usually, iterators iterate from left to right. After using `rev()`,
3288    /// an iterator will instead iterate from right to left.
3289    ///
3290    /// This is only possible if the iterator has an end, so `rev()` only
3291    /// works on [`DoubleEndedIterator`]s.
3292    ///
3293    /// # Examples
3294    ///
3295    /// ```
3296    /// let a = [1, 2, 3];
3297    ///
3298    /// let mut iter = a.iter().rev();
3299    ///
3300    /// assert_eq!(iter.next(), Some(&3));
3301    /// assert_eq!(iter.next(), Some(&2));
3302    /// assert_eq!(iter.next(), Some(&1));
3303    ///
3304    /// assert_eq!(iter.next(), None);
3305    /// ```
3306    #[inline]
3307    #[doc(alias = "reverse")]
3308    #[stable(feature = "rust1", since = "1.0.0")]
3309    fn rev(self) -> Rev<Self>
3310    where
3311        Self: Sized + DoubleEndedIterator,
3312    {
3313        Rev::new(self)
3314    }
3315
3316    /// Converts an iterator of pairs into a pair of containers.
3317    ///
3318    /// `unzip()` consumes an entire iterator of pairs, producing two
3319    /// collections: one from the left elements of the pairs, and one
3320    /// from the right elements.
3321    ///
3322    /// This function is, in some sense, the opposite of [`zip`].
3323    ///
3324    /// [`zip`]: Iterator::zip
3325    ///
3326    /// # Examples
3327    ///
3328    /// ```
3329    /// let a = [(1, 2), (3, 4), (5, 6)];
3330    ///
3331    /// let (left, right): (Vec<_>, Vec<_>) = a.iter().cloned().unzip();
3332    ///
3333    /// assert_eq!(left, [1, 3, 5]);
3334    /// assert_eq!(right, [2, 4, 6]);
3335    ///
3336    /// // you can also unzip multiple nested tuples at once
3337    /// let a = [(1, (2, 3)), (4, (5, 6))];
3338    ///
3339    /// let (x, (y, z)): (Vec<_>, (Vec<_>, Vec<_>)) = a.iter().cloned().unzip();
3340    /// assert_eq!(x, [1, 4]);
3341    /// assert_eq!(y, [2, 5]);
3342    /// assert_eq!(z, [3, 6]);
3343    /// ```
3344    #[stable(feature = "rust1", since = "1.0.0")]
3345    fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
3346    where
3347        FromA: Default + Extend<A>,
3348        FromB: Default + Extend<B>,
3349        Self: Sized + Iterator<Item = (A, B)>,
3350    {
3351        let mut unzipped: (FromA, FromB) = Default::default();
3352        unzipped.extend(self);
3353        unzipped
3354    }
3355
3356    /// Creates an iterator which copies all of its elements.
3357    ///
3358    /// This is useful when you have an iterator over `&T`, but you need an
3359    /// iterator over `T`.
3360    ///
3361    /// # Examples
3362    ///
3363    /// ```
3364    /// let a = [1, 2, 3];
3365    ///
3366    /// let v_copied: Vec<_> = a.iter().copied().collect();
3367    ///
3368    /// // copied is the same as .map(|&x| x)
3369    /// let v_map: Vec<_> = a.iter().map(|&x| x).collect();
3370    ///
3371    /// assert_eq!(v_copied, vec![1, 2, 3]);
3372    /// assert_eq!(v_map, vec![1, 2, 3]);
3373    /// ```
3374    #[stable(feature = "iter_copied", since = "1.36.0")]
3375    #[rustc_diagnostic_item = "iter_copied"]
3376    fn copied<'a, T: 'a>(self) -> Copied<Self>
3377    where
3378        Self: Sized + Iterator<Item = &'a T>,
3379        T: Copy,
3380    {
3381        Copied::new(self)
3382    }
3383
3384    /// Creates an iterator which [`clone`]s all of its elements.
3385    ///
3386    /// This is useful when you have an iterator over `&T`, but you need an
3387    /// iterator over `T`.
3388    ///
3389    /// There is no guarantee whatsoever about the `clone` method actually
3390    /// being called *or* optimized away. So code should not depend on
3391    /// either.
3392    ///
3393    /// [`clone`]: Clone::clone
3394    ///
3395    /// # Examples
3396    ///
3397    /// Basic usage:
3398    ///
3399    /// ```
3400    /// let a = [1, 2, 3];
3401    ///
3402    /// let v_cloned: Vec<_> = a.iter().cloned().collect();
3403    ///
3404    /// // cloned is the same as .map(|&x| x), for integers
3405    /// let v_map: Vec<_> = a.iter().map(|&x| x).collect();
3406    ///
3407    /// assert_eq!(v_cloned, vec![1, 2, 3]);
3408    /// assert_eq!(v_map, vec![1, 2, 3]);
3409    /// ```
3410    ///
3411    /// To get the best performance, try to clone late:
3412    ///
3413    /// ```
3414    /// let a = [vec![0_u8, 1, 2], vec![3, 4], vec![23]];
3415    /// // don't do this:
3416    /// let slower: Vec<_> = a.iter().cloned().filter(|s| s.len() == 1).collect();
3417    /// assert_eq!(&[vec![23]], &slower[..]);
3418    /// // instead call `cloned` late
3419    /// let faster: Vec<_> = a.iter().filter(|s| s.len() == 1).cloned().collect();
3420    /// assert_eq!(&[vec![23]], &faster[..]);
3421    /// ```
3422    #[stable(feature = "rust1", since = "1.0.0")]
3423    #[rustc_diagnostic_item = "iter_cloned"]
3424    fn cloned<'a, T: 'a>(self) -> Cloned<Self>
3425    where
3426        Self: Sized + Iterator<Item = &'a T>,
3427        T: Clone,
3428    {
3429        Cloned::new(self)
3430    }
3431
3432    /// Repeats an iterator endlessly.
3433    ///
3434    /// Instead of stopping at [`None`], the iterator will instead start again,
3435    /// from the beginning. After iterating again, it will start at the
3436    /// beginning again. And again. And again. Forever. Note that in case the
3437    /// original iterator is empty, the resulting iterator will also be empty.
3438    ///
3439    /// # Examples
3440    ///
3441    /// ```
3442    /// let a = [1, 2, 3];
3443    ///
3444    /// let mut it = a.iter().cycle();
3445    ///
3446    /// assert_eq!(it.next(), Some(&1));
3447    /// assert_eq!(it.next(), Some(&2));
3448    /// assert_eq!(it.next(), Some(&3));
3449    /// assert_eq!(it.next(), Some(&1));
3450    /// assert_eq!(it.next(), Some(&2));
3451    /// assert_eq!(it.next(), Some(&3));
3452    /// assert_eq!(it.next(), Some(&1));
3453    /// ```
3454    #[stable(feature = "rust1", since = "1.0.0")]
3455    #[inline]
3456    fn cycle(self) -> Cycle<Self>
3457    where
3458        Self: Sized + Clone,
3459    {
3460        Cycle::new(self)
3461    }
3462
3463    /// Returns an iterator over `N` elements of the iterator at a time.
3464    ///
3465    /// The chunks do not overlap. If `N` does not divide the length of the
3466    /// iterator, then the last up to `N-1` elements will be omitted and can be
3467    /// retrieved from the [`.into_remainder()`][ArrayChunks::into_remainder]
3468    /// function of the iterator.
3469    ///
3470    /// # Panics
3471    ///
3472    /// Panics if `N` is zero.
3473    ///
3474    /// # Examples
3475    ///
3476    /// Basic usage:
3477    ///
3478    /// ```
3479    /// #![feature(iter_array_chunks)]
3480    ///
3481    /// let mut iter = "lorem".chars().array_chunks();
3482    /// assert_eq!(iter.next(), Some(['l', 'o']));
3483    /// assert_eq!(iter.next(), Some(['r', 'e']));
3484    /// assert_eq!(iter.next(), None);
3485    /// assert_eq!(iter.into_remainder().unwrap().as_slice(), &['m']);
3486    /// ```
3487    ///
3488    /// ```
3489    /// #![feature(iter_array_chunks)]
3490    ///
3491    /// let data = [1, 1, 2, -2, 6, 0, 3, 1];
3492    /// //          ^-----^  ^------^
3493    /// for [x, y, z] in data.iter().array_chunks() {
3494    ///     assert_eq!(x + y + z, 4);
3495    /// }
3496    /// ```
3497    #[track_caller]
3498    #[unstable(feature = "iter_array_chunks", reason = "recently added", issue = "100450")]
3499    fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
3500    where
3501        Self: Sized,
3502    {
3503        ArrayChunks::new(self)
3504    }
3505
3506    /// Sums the elements of an iterator.
3507    ///
3508    /// Takes each element, adds them together, and returns the result.
3509    ///
3510    /// An empty iterator returns the *additive identity* ("zero") of the type,
3511    /// which is `0` for integers and `-0.0` for floats.
3512    ///
3513    /// `sum()` can be used to sum any type implementing [`Sum`][`core::iter::Sum`],
3514    /// including [`Option`][`Option::sum`] and [`Result`][`Result::sum`].
3515    ///
3516    /// # Panics
3517    ///
3518    /// When calling `sum()` and a primitive integer type is being returned, this
3519    /// method will panic if the computation overflows and debug assertions are
3520    /// enabled.
3521    ///
3522    /// # Examples
3523    ///
3524    /// ```
3525    /// let a = [1, 2, 3];
3526    /// let sum: i32 = a.iter().sum();
3527    ///
3528    /// assert_eq!(sum, 6);
3529    ///
3530    /// let b: Vec<f32> = vec![];
3531    /// let sum: f32 = b.iter().sum();
3532    /// assert_eq!(sum, -0.0_f32);
3533    /// ```
3534    #[stable(feature = "iter_arith", since = "1.11.0")]
3535    fn sum<S>(self) -> S
3536    where
3537        Self: Sized,
3538        S: Sum<Self::Item>,
3539    {
3540        Sum::sum(self)
3541    }
3542
3543    /// Iterates over the entire iterator, multiplying all the elements
3544    ///
3545    /// An empty iterator returns the one value of the type.
3546    ///
3547    /// `product()` can be used to multiply any type implementing [`Product`][`core::iter::Product`],
3548    /// including [`Option`][`Option::product`] and [`Result`][`Result::product`].
3549    ///
3550    /// # Panics
3551    ///
3552    /// When calling `product()` and a primitive integer type is being returned,
3553    /// method will panic if the computation overflows and debug assertions are
3554    /// enabled.
3555    ///
3556    /// # Examples
3557    ///
3558    /// ```
3559    /// fn factorial(n: u32) -> u32 {
3560    ///     (1..=n).product()
3561    /// }
3562    /// assert_eq!(factorial(0), 1);
3563    /// assert_eq!(factorial(1), 1);
3564    /// assert_eq!(factorial(5), 120);
3565    /// ```
3566    #[stable(feature = "iter_arith", since = "1.11.0")]
3567    fn product<P>(self) -> P
3568    where
3569        Self: Sized,
3570        P: Product<Self::Item>,
3571    {
3572        Product::product(self)
3573    }
3574
3575    /// [Lexicographically](Ord#lexicographical-comparison) compares the elements of this [`Iterator`] with those
3576    /// of another.
3577    ///
3578    /// # Examples
3579    ///
3580    /// ```
3581    /// use std::cmp::Ordering;
3582    ///
3583    /// assert_eq!([1].iter().cmp([1].iter()), Ordering::Equal);
3584    /// assert_eq!([1].iter().cmp([1, 2].iter()), Ordering::Less);
3585    /// assert_eq!([1, 2].iter().cmp([1].iter()), Ordering::Greater);
3586    /// ```
3587    #[stable(feature = "iter_order", since = "1.5.0")]
3588    fn cmp<I>(self, other: I) -> Ordering
3589    where
3590        I: IntoIterator<Item = Self::Item>,
3591        Self::Item: Ord,
3592        Self: Sized,
3593    {
3594        self.cmp_by(other, |x, y| x.cmp(&y))
3595    }
3596
3597    /// [Lexicographically](Ord#lexicographical-comparison) compares the elements of this [`Iterator`] with those
3598    /// of another with respect to the specified comparison function.
3599    ///
3600    /// # Examples
3601    ///
3602    /// ```
3603    /// #![feature(iter_order_by)]
3604    ///
3605    /// use std::cmp::Ordering;
3606    ///
3607    /// let xs = [1, 2, 3, 4];
3608    /// let ys = [1, 4, 9, 16];
3609    ///
3610    /// assert_eq!(xs.iter().cmp_by(&ys, |&x, &y| x.cmp(&y)), Ordering::Less);
3611    /// assert_eq!(xs.iter().cmp_by(&ys, |&x, &y| (x * x).cmp(&y)), Ordering::Equal);
3612    /// assert_eq!(xs.iter().cmp_by(&ys, |&x, &y| (2 * x).cmp(&y)), Ordering::Greater);
3613    /// ```
3614    #[unstable(feature = "iter_order_by", issue = "64295")]
3615    fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
3616    where
3617        Self: Sized,
3618        I: IntoIterator,
3619        F: FnMut(Self::Item, I::Item) -> Ordering,
3620    {
3621        #[inline]
3622        fn compare<X, Y, F>(mut cmp: F) -> impl FnMut(X, Y) -> ControlFlow<Ordering>
3623        where
3624            F: FnMut(X, Y) -> Ordering,
3625        {
3626            move |x, y| match cmp(x, y) {
3627                Ordering::Equal => ControlFlow::Continue(()),
3628                non_eq => ControlFlow::Break(non_eq),
3629            }
3630        }
3631
3632        match iter_compare(self, other.into_iter(), compare(cmp)) {
3633            ControlFlow::Continue(ord) => ord,
3634            ControlFlow::Break(ord) => ord,
3635        }
3636    }
3637
3638    /// [Lexicographically](Ord#lexicographical-comparison) compares the [`PartialOrd`] elements of
3639    /// this [`Iterator`] with those of another. The comparison works like short-circuit
3640    /// evaluation, returning a result without comparing the remaining elements.
3641    /// As soon as an order can be determined, the evaluation stops and a result is returned.
3642    ///
3643    /// # Examples
3644    ///
3645    /// ```
3646    /// use std::cmp::Ordering;
3647    ///
3648    /// assert_eq!([1.].iter().partial_cmp([1.].iter()), Some(Ordering::Equal));
3649    /// assert_eq!([1.].iter().partial_cmp([1., 2.].iter()), Some(Ordering::Less));
3650    /// assert_eq!([1., 2.].iter().partial_cmp([1.].iter()), Some(Ordering::Greater));
3651    /// ```
3652    ///
3653    /// For floating-point numbers, NaN does not have a total order and will result
3654    /// in `None` when compared:
3655    ///
3656    /// ```
3657    /// assert_eq!([f64::NAN].iter().partial_cmp([1.].iter()), None);
3658    /// ```
3659    ///
3660    /// The results are determined by the order of evaluation.
3661    ///
3662    /// ```
3663    /// use std::cmp::Ordering;
3664    ///
3665    /// assert_eq!([1.0, f64::NAN].iter().partial_cmp([2.0, f64::NAN].iter()), Some(Ordering::Less));
3666    /// assert_eq!([2.0, f64::NAN].iter().partial_cmp([1.0, f64::NAN].iter()), Some(Ordering::Greater));
3667    /// assert_eq!([f64::NAN, 1.0].iter().partial_cmp([f64::NAN, 2.0].iter()), None);
3668    /// ```
3669    ///
3670    #[stable(feature = "iter_order", since = "1.5.0")]
3671    fn partial_cmp<I>(self, other: I) -> Option<Ordering>
3672    where
3673        I: IntoIterator,
3674        Self::Item: PartialOrd<I::Item>,
3675        Self: Sized,
3676    {
3677        self.partial_cmp_by(other, |x, y| x.partial_cmp(&y))
3678    }
3679
3680    /// [Lexicographically](Ord#lexicographical-comparison) compares the elements of this [`Iterator`] with those
3681    /// of another with respect to the specified comparison function.
3682    ///
3683    /// # Examples
3684    ///
3685    /// ```
3686    /// #![feature(iter_order_by)]
3687    ///
3688    /// use std::cmp::Ordering;
3689    ///
3690    /// let xs = [1.0, 2.0, 3.0, 4.0];
3691    /// let ys = [1.0, 4.0, 9.0, 16.0];
3692    ///
3693    /// assert_eq!(
3694    ///     xs.iter().partial_cmp_by(&ys, |&x, &y| x.partial_cmp(&y)),
3695    ///     Some(Ordering::Less)
3696    /// );
3697    /// assert_eq!(
3698    ///     xs.iter().partial_cmp_by(&ys, |&x, &y| (x * x).partial_cmp(&y)),
3699    ///     Some(Ordering::Equal)
3700    /// );
3701    /// assert_eq!(
3702    ///     xs.iter().partial_cmp_by(&ys, |&x, &y| (2.0 * x).partial_cmp(&y)),
3703    ///     Some(Ordering::Greater)
3704    /// );
3705    /// ```
3706    #[unstable(feature = "iter_order_by", issue = "64295")]
3707    fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
3708    where
3709        Self: Sized,
3710        I: IntoIterator,
3711        F: FnMut(Self::Item, I::Item) -> Option<Ordering>,
3712    {
3713        #[inline]
3714        fn compare<X, Y, F>(mut partial_cmp: F) -> impl FnMut(X, Y) -> ControlFlow<Option<Ordering>>
3715        where
3716            F: FnMut(X, Y) -> Option<Ordering>,
3717        {
3718            move |x, y| match partial_cmp(x, y) {
3719                Some(Ordering::Equal) => ControlFlow::Continue(()),
3720                non_eq => ControlFlow::Break(non_eq),
3721            }
3722        }
3723
3724        match iter_compare(self, other.into_iter(), compare(partial_cmp)) {
3725            ControlFlow::Continue(ord) => Some(ord),
3726            ControlFlow::Break(ord) => ord,
3727        }
3728    }
3729
3730    /// Determines if the elements of this [`Iterator`] are equal to those of
3731    /// another.
3732    ///
3733    /// # Examples
3734    ///
3735    /// ```
3736    /// assert_eq!([1].iter().eq([1].iter()), true);
3737    /// assert_eq!([1].iter().eq([1, 2].iter()), false);
3738    /// ```
3739    #[stable(feature = "iter_order", since = "1.5.0")]
3740    fn eq<I>(self, other: I) -> bool
3741    where
3742        I: IntoIterator,
3743        Self::Item: PartialEq<I::Item>,
3744        Self: Sized,
3745    {
3746        self.eq_by(other, |x, y| x == y)
3747    }
3748
3749    /// Determines if the elements of this [`Iterator`] are equal to those of
3750    /// another with respect to the specified equality function.
3751    ///
3752    /// # Examples
3753    ///
3754    /// ```
3755    /// #![feature(iter_order_by)]
3756    ///
3757    /// let xs = [1, 2, 3, 4];
3758    /// let ys = [1, 4, 9, 16];
3759    ///
3760    /// assert!(xs.iter().eq_by(&ys, |&x, &y| x * x == y));
3761    /// ```
3762    #[unstable(feature = "iter_order_by", issue = "64295")]
3763    fn eq_by<I, F>(self, other: I, eq: F) -> bool
3764    where
3765        Self: Sized,
3766        I: IntoIterator,
3767        F: FnMut(Self::Item, I::Item) -> bool,
3768    {
3769        #[inline]
3770        fn compare<X, Y, F>(mut eq: F) -> impl FnMut(X, Y) -> ControlFlow<()>
3771        where
3772            F: FnMut(X, Y) -> bool,
3773        {
3774            move |x, y| {
3775                if eq(x, y) { ControlFlow::Continue(()) } else { ControlFlow::Break(()) }
3776            }
3777        }
3778
3779        match iter_compare(self, other.into_iter(), compare(eq)) {
3780            ControlFlow::Continue(ord) => ord == Ordering::Equal,
3781            ControlFlow::Break(()) => false,
3782        }
3783    }
3784
3785    /// Determines if the elements of this [`Iterator`] are not equal to those of
3786    /// another.
3787    ///
3788    /// # Examples
3789    ///
3790    /// ```
3791    /// assert_eq!([1].iter().ne([1].iter()), false);
3792    /// assert_eq!([1].iter().ne([1, 2].iter()), true);
3793    /// ```
3794    #[stable(feature = "iter_order", since = "1.5.0")]
3795    fn ne<I>(self, other: I) -> bool
3796    where
3797        I: IntoIterator,
3798        Self::Item: PartialEq<I::Item>,
3799        Self: Sized,
3800    {
3801        !self.eq(other)
3802    }
3803
3804    /// Determines if the elements of this [`Iterator`] are [lexicographically](Ord#lexicographical-comparison)
3805    /// less than those of another.
3806    ///
3807    /// # Examples
3808    ///
3809    /// ```
3810    /// assert_eq!([1].iter().lt([1].iter()), false);
3811    /// assert_eq!([1].iter().lt([1, 2].iter()), true);
3812    /// assert_eq!([1, 2].iter().lt([1].iter()), false);
3813    /// assert_eq!([1, 2].iter().lt([1, 2].iter()), false);
3814    /// ```
3815    #[stable(feature = "iter_order", since = "1.5.0")]
3816    fn lt<I>(self, other: I) -> bool
3817    where
3818        I: IntoIterator,
3819        Self::Item: PartialOrd<I::Item>,
3820        Self: Sized,
3821    {
3822        self.partial_cmp(other) == Some(Ordering::Less)
3823    }
3824
3825    /// Determines if the elements of this [`Iterator`] are [lexicographically](Ord#lexicographical-comparison)
3826    /// less or equal to those of another.
3827    ///
3828    /// # Examples
3829    ///
3830    /// ```
3831    /// assert_eq!([1].iter().le([1].iter()), true);
3832    /// assert_eq!([1].iter().le([1, 2].iter()), true);
3833    /// assert_eq!([1, 2].iter().le([1].iter()), false);
3834    /// assert_eq!([1, 2].iter().le([1, 2].iter()), true);
3835    /// ```
3836    #[stable(feature = "iter_order", since = "1.5.0")]
3837    fn le<I>(self, other: I) -> bool
3838    where
3839        I: IntoIterator,
3840        Self::Item: PartialOrd<I::Item>,
3841        Self: Sized,
3842    {
3843        matches!(self.partial_cmp(other), Some(Ordering::Less | Ordering::Equal))
3844    }
3845
3846    /// Determines if the elements of this [`Iterator`] are [lexicographically](Ord#lexicographical-comparison)
3847    /// greater than those of another.
3848    ///
3849    /// # Examples
3850    ///
3851    /// ```
3852    /// assert_eq!([1].iter().gt([1].iter()), false);
3853    /// assert_eq!([1].iter().gt([1, 2].iter()), false);
3854    /// assert_eq!([1, 2].iter().gt([1].iter()), true);
3855    /// assert_eq!([1, 2].iter().gt([1, 2].iter()), false);
3856    /// ```
3857    #[stable(feature = "iter_order", since = "1.5.0")]
3858    fn gt<I>(self, other: I) -> bool
3859    where
3860        I: IntoIterator,
3861        Self::Item: PartialOrd<I::Item>,
3862        Self: Sized,
3863    {
3864        self.partial_cmp(other) == Some(Ordering::Greater)
3865    }
3866
3867    /// Determines if the elements of this [`Iterator`] are [lexicographically](Ord#lexicographical-comparison)
3868    /// greater than or equal to those of another.
3869    ///
3870    /// # Examples
3871    ///
3872    /// ```
3873    /// assert_eq!([1].iter().ge([1].iter()), true);
3874    /// assert_eq!([1].iter().ge([1, 2].iter()), false);
3875    /// assert_eq!([1, 2].iter().ge([1].iter()), true);
3876    /// assert_eq!([1, 2].iter().ge([1, 2].iter()), true);
3877    /// ```
3878    #[stable(feature = "iter_order", since = "1.5.0")]
3879    fn ge<I>(self, other: I) -> bool
3880    where
3881        I: IntoIterator,
3882        Self::Item: PartialOrd<I::Item>,
3883        Self: Sized,
3884    {
3885        matches!(self.partial_cmp(other), Some(Ordering::Greater | Ordering::Equal))
3886    }
3887
3888    /// Checks if the elements of this iterator are sorted.
3889    ///
3890    /// That is, for each element `a` and its following element `b`, `a <= b` must hold. If the
3891    /// iterator yields exactly zero or one element, `true` is returned.
3892    ///
3893    /// Note that if `Self::Item` is only `PartialOrd`, but not `Ord`, the above definition
3894    /// implies that this function returns `false` if any two consecutive items are not
3895    /// comparable.
3896    ///
3897    /// # Examples
3898    ///
3899    /// ```
3900    /// assert!([1, 2, 2, 9].iter().is_sorted());
3901    /// assert!(![1, 3, 2, 4].iter().is_sorted());
3902    /// assert!([0].iter().is_sorted());
3903    /// assert!(std::iter::empty::<i32>().is_sorted());
3904    /// assert!(![0.0, 1.0, f32::NAN].iter().is_sorted());
3905    /// ```
3906    #[inline]
3907    #[stable(feature = "is_sorted", since = "1.82.0")]
3908    fn is_sorted(self) -> bool
3909    where
3910        Self: Sized,
3911        Self::Item: PartialOrd,
3912    {
3913        self.is_sorted_by(|a, b| a <= b)
3914    }
3915
3916    /// Checks if the elements of this iterator are sorted using the given comparator function.
3917    ///
3918    /// Instead of using `PartialOrd::partial_cmp`, this function uses the given `compare`
3919    /// function to determine whether two elements are to be considered in sorted order.
3920    ///
3921    /// # Examples
3922    ///
3923    /// ```
3924    /// assert!([1, 2, 2, 9].iter().is_sorted_by(|a, b| a <= b));
3925    /// assert!(![1, 2, 2, 9].iter().is_sorted_by(|a, b| a < b));
3926    ///
3927    /// assert!([0].iter().is_sorted_by(|a, b| true));
3928    /// assert!([0].iter().is_sorted_by(|a, b| false));
3929    ///
3930    /// assert!(std::iter::empty::<i32>().is_sorted_by(|a, b| false));
3931    /// assert!(std::iter::empty::<i32>().is_sorted_by(|a, b| true));
3932    /// ```
3933    #[stable(feature = "is_sorted", since = "1.82.0")]
3934    fn is_sorted_by<F>(mut self, compare: F) -> bool
3935    where
3936        Self: Sized,
3937        F: FnMut(&Self::Item, &Self::Item) -> bool,
3938    {
3939        #[inline]
3940        fn check<'a, T>(
3941            last: &'a mut T,
3942            mut compare: impl FnMut(&T, &T) -> bool + 'a,
3943        ) -> impl FnMut(T) -> bool + 'a {
3944            move |curr| {
3945                if !compare(&last, &curr) {
3946                    return false;
3947                }
3948                *last = curr;
3949                true
3950            }
3951        }
3952
3953        let mut last = match self.next() {
3954            Some(e) => e,
3955            None => return true,
3956        };
3957
3958        self.all(check(&mut last, compare))
3959    }
3960
3961    /// Checks if the elements of this iterator are sorted using the given key extraction
3962    /// function.
3963    ///
3964    /// Instead of comparing the iterator's elements directly, this function compares the keys of
3965    /// the elements, as determined by `f`. Apart from that, it's equivalent to [`is_sorted`]; see
3966    /// its documentation for more information.
3967    ///
3968    /// [`is_sorted`]: Iterator::is_sorted
3969    ///
3970    /// # Examples
3971    ///
3972    /// ```
3973    /// assert!(["c", "bb", "aaa"].iter().is_sorted_by_key(|s| s.len()));
3974    /// assert!(![-2i32, -1, 0, 3].iter().is_sorted_by_key(|n| n.abs()));
3975    /// ```
3976    #[inline]
3977    #[stable(feature = "is_sorted", since = "1.82.0")]
3978    fn is_sorted_by_key<F, K>(self, f: F) -> bool
3979    where
3980        Self: Sized,
3981        F: FnMut(Self::Item) -> K,
3982        K: PartialOrd,
3983    {
3984        self.map(f).is_sorted()
3985    }
3986
3987    /// See [TrustedRandomAccess][super::super::TrustedRandomAccess]
3988    // The unusual name is to avoid name collisions in method resolution
3989    // see #76479.
3990    #[inline]
3991    #[doc(hidden)]
3992    #[unstable(feature = "trusted_random_access", issue = "none")]
3993    unsafe fn __iterator_get_unchecked(&mut self, _idx: usize) -> Self::Item
3994    where
3995        Self: TrustedRandomAccessNoCoerce,
3996    {
3997        unreachable!("Always specialized");
3998    }
3999}
4000
4001/// Compares two iterators element-wise using the given function.
4002///
4003/// If `ControlFlow::Continue(())` is returned from the function, the comparison moves on to the next
4004/// elements of both iterators. Returning `ControlFlow::Break(x)` short-circuits the iteration and
4005/// returns `ControlFlow::Break(x)`. If one of the iterators runs out of elements,
4006/// `ControlFlow::Continue(ord)` is returned where `ord` is the result of comparing the lengths of
4007/// the iterators.
4008///
4009/// Isolates the logic shared by ['cmp_by'](Iterator::cmp_by),
4010/// ['partial_cmp_by'](Iterator::partial_cmp_by), and ['eq_by'](Iterator::eq_by).
4011#[inline]
4012fn iter_compare<A, B, F, T>(mut a: A, mut b: B, f: F) -> ControlFlow<T, Ordering>
4013where
4014    A: Iterator,
4015    B: Iterator,
4016    F: FnMut(A::Item, B::Item) -> ControlFlow<T>,
4017{
4018    #[inline]
4019    fn compare<'a, B, X, T>(
4020        b: &'a mut B,
4021        mut f: impl FnMut(X, B::Item) -> ControlFlow<T> + 'a,
4022    ) -> impl FnMut(X) -> ControlFlow<ControlFlow<T, Ordering>> + 'a
4023    where
4024        B: Iterator,
4025    {
4026        move |x| match b.next() {
4027            None => ControlFlow::Break(ControlFlow::Continue(Ordering::Greater)),
4028            Some(y) => f(x, y).map_break(ControlFlow::Break),
4029        }
4030    }
4031
4032    match a.try_for_each(compare(&mut b, f)) {
4033        ControlFlow::Continue(()) => ControlFlow::Continue(match b.next() {
4034            None => Ordering::Equal,
4035            Some(_) => Ordering::Less,
4036        }),
4037        ControlFlow::Break(x) => x,
4038    }
4039}
4040
4041/// Implements `Iterator` for mutable references to iterators, such as those produced by [`Iterator::by_ref`].
4042///
4043/// This implementation passes all method calls on to the original iterator.
4044#[stable(feature = "rust1", since = "1.0.0")]
4045impl<I: Iterator + ?Sized> Iterator for &mut I {
4046    type Item = I::Item;
4047    #[inline]
4048    fn next(&mut self) -> Option<I::Item> {
4049        (**self).next()
4050    }
4051    fn size_hint(&self) -> (usize, Option<usize>) {
4052        (**self).size_hint()
4053    }
4054    fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>> {
4055        (**self).advance_by(n)
4056    }
4057    fn nth(&mut self, n: usize) -> Option<Self::Item> {
4058        (**self).nth(n)
4059    }
4060    fn fold<B, F>(self, init: B, f: F) -> B
4061    where
4062        F: FnMut(B, Self::Item) -> B,
4063    {
4064        self.spec_fold(init, f)
4065    }
4066    fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
4067    where
4068        F: FnMut(B, Self::Item) -> R,
4069        R: Try<Output = B>,
4070    {
4071        self.spec_try_fold(init, f)
4072    }
4073}
4074
4075/// Helper trait to specialize `fold` and `try_fold` for `&mut I where I: Sized`
4076trait IteratorRefSpec: Iterator {
4077    fn spec_fold<B, F>(self, init: B, f: F) -> B
4078    where
4079        F: FnMut(B, Self::Item) -> B;
4080
4081    fn spec_try_fold<B, F, R>(&mut self, init: B, f: F) -> R
4082    where
4083        F: FnMut(B, Self::Item) -> R,
4084        R: Try<Output = B>;
4085}
4086
4087impl<I: Iterator + ?Sized> IteratorRefSpec for &mut I {
4088    default fn spec_fold<B, F>(self, init: B, mut f: F) -> B
4089    where
4090        F: FnMut(B, Self::Item) -> B,
4091    {
4092        let mut accum = init;
4093        while let Some(x) = self.next() {
4094            accum = f(accum, x);
4095        }
4096        accum
4097    }
4098
4099    default fn spec_try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R
4100    where
4101        F: FnMut(B, Self::Item) -> R,
4102        R: Try<Output = B>,
4103    {
4104        let mut accum = init;
4105        while let Some(x) = self.next() {
4106            accum = f(accum, x)?;
4107        }
4108        try { accum }
4109    }
4110}
4111
4112impl<I: Iterator> IteratorRefSpec for &mut I {
4113    impl_fold_via_try_fold! { spec_fold -> spec_try_fold }
4114
4115    fn spec_try_fold<B, F, R>(&mut self, init: B, f: F) -> R
4116    where
4117        F: FnMut(B, Self::Item) -> R,
4118        R: Try<Output = B>,
4119    {
4120        (**self).try_fold(init, f)
4121    }
4122}
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy