use fmt; use marker; use usize; use super::{FusedIterator, TrustedLen}; /// An iterator that repeats an element endlessly. /// /// This `struct` is created by the [`repeat`] function. See its documentation for more. /// /// [`repeat`]: fn.repeat.html #[derive(Clone, Debug)] #[stable(feature = "rust1", since = "1.0.0")] pub struct Repeat { element: A } #[stable(feature = "rust1", since = "1.0.0")] impl Iterator for Repeat { type Item = A; #[inline] fn next(&mut self) -> Option { Some(self.element.clone()) } #[inline] fn size_hint(&self) -> (usize, Option) { (usize::MAX, None) } } #[stable(feature = "rust1", since = "1.0.0")] impl DoubleEndedIterator for Repeat { #[inline] fn next_back(&mut self) -> Option { Some(self.element.clone()) } } #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for Repeat {} #[unstable(feature = "trusted_len", issue = "37572")] unsafe impl TrustedLen for Repeat {} /// Creates a new iterator that endlessly repeats a single element. /// /// The `repeat()` function repeats a single value over and over and over and /// over and over and 🔁. /// /// Infinite iterators like `repeat()` are often used with adapters like /// [`take`], in order to make them finite. /// /// [`take`]: trait.Iterator.html#method.take /// /// If the element type of the iterator you need does not implement `Clone`, /// or if you do not want to keep the repeated element in memory, you can /// instead use the [`repeat_with`] function. /// /// [`repeat_with`]: fn.repeat_with.html /// /// # Examples /// /// Basic usage: /// /// ``` /// use std::iter; /// /// // the number four 4ever: /// let mut fours = iter::repeat(4); /// /// assert_eq!(Some(4), fours.next()); /// assert_eq!(Some(4), fours.next()); /// assert_eq!(Some(4), fours.next()); /// assert_eq!(Some(4), fours.next()); /// assert_eq!(Some(4), fours.next()); /// /// // yup, still four /// assert_eq!(Some(4), fours.next()); /// ``` /// /// Going finite with [`take`]: /// /// ``` /// use std::iter; /// /// // that last example was too many fours. Let's only have four fours. /// let mut four_fours = iter::repeat(4).take(4); /// /// assert_eq!(Some(4), four_fours.next()); /// assert_eq!(Some(4), four_fours.next()); /// assert_eq!(Some(4), four_fours.next()); /// assert_eq!(Some(4), four_fours.next()); /// /// // ... and now we're done /// assert_eq!(None, four_fours.next()); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn repeat(elt: T) -> Repeat { Repeat{element: elt} } /// An iterator that repeats elements of type `A` endlessly by /// applying the provided closure `F: FnMut() -> A`. /// /// This `struct` is created by the [`repeat_with`] function. /// See its documentation for more. /// /// [`repeat_with`]: fn.repeat_with.html #[derive(Copy, Clone, Debug)] #[stable(feature = "iterator_repeat_with", since = "1.28.0")] pub struct RepeatWith { repeater: F } #[stable(feature = "iterator_repeat_with", since = "1.28.0")] impl A> Iterator for RepeatWith { type Item = A; #[inline] fn next(&mut self) -> Option { Some((self.repeater)()) } #[inline] fn size_hint(&self) -> (usize, Option) { (usize::MAX, None) } } #[stable(feature = "iterator_repeat_with", since = "1.28.0")] impl A> FusedIterator for RepeatWith {} #[unstable(feature = "trusted_len", issue = "37572")] unsafe impl A> TrustedLen for RepeatWith {} /// Creates a new iterator that repeats elements of type `A` endlessly by /// applying the provided closure, the repeater, `F: FnMut() -> A`. /// /// The `repeat_with()` function calls the repeater over and over and over and /// over and over and 🔁. /// /// Infinite iterators like `repeat_with()` are often used with adapters like /// [`take`], in order to make them finite. /// /// [`take`]: trait.Iterator.html#method.take /// /// If the element type of the iterator you need implements `Clone`, and /// it is OK to keep the source element in memory, you should instead use /// the [`repeat`] function. /// /// [`repeat`]: fn.repeat.html /// /// An iterator produced by `repeat_with()` is not a `DoubleEndedIterator`. /// If you need `repeat_with()` to return a `DoubleEndedIterator`, /// please open a GitHub issue explaining your use case. /// /// # Examples /// /// Basic usage: /// /// ``` /// use std::iter; /// /// // let's assume we have some value of a type that is not `Clone` /// // or which don't want to have in memory just yet because it is expensive: /// #[derive(PartialEq, Debug)] /// struct Expensive; /// /// // a particular value forever: /// let mut things = iter::repeat_with(|| Expensive); /// /// assert_eq!(Some(Expensive), things.next()); /// assert_eq!(Some(Expensive), things.next()); /// assert_eq!(Some(Expensive), things.next()); /// assert_eq!(Some(Expensive), things.next()); /// assert_eq!(Some(Expensive), things.next()); /// ``` /// /// Using mutation and going finite: /// /// ```rust /// use std::iter; /// /// // From the zeroth to the third power of two: /// let mut curr = 1; /// let mut pow2 = iter::repeat_with(|| { let tmp = curr; curr *= 2; tmp }) /// .take(4); /// /// assert_eq!(Some(1), pow2.next()); /// assert_eq!(Some(2), pow2.next()); /// assert_eq!(Some(4), pow2.next()); /// assert_eq!(Some(8), pow2.next()); /// /// // ... and now we're done /// assert_eq!(None, pow2.next()); /// ``` #[inline] #[stable(feature = "iterator_repeat_with", since = "1.28.0")] pub fn repeat_with A>(repeater: F) -> RepeatWith { RepeatWith { repeater } } /// An iterator that yields nothing. /// /// This `struct` is created by the [`empty`] function. See its documentation for more. /// /// [`empty`]: fn.empty.html #[stable(feature = "iter_empty", since = "1.2.0")] pub struct Empty(marker::PhantomData); #[stable(feature = "core_impl_debug", since = "1.9.0")] impl fmt::Debug for Empty { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.pad("Empty") } } #[stable(feature = "iter_empty", since = "1.2.0")] impl Iterator for Empty { type Item = T; fn next(&mut self) -> Option { None } fn size_hint(&self) -> (usize, Option){ (0, Some(0)) } } #[stable(feature = "iter_empty", since = "1.2.0")] impl DoubleEndedIterator for Empty { fn next_back(&mut self) -> Option { None } } #[stable(feature = "iter_empty", since = "1.2.0")] impl ExactSizeIterator for Empty { fn len(&self) -> usize { 0 } } #[unstable(feature = "trusted_len", issue = "37572")] unsafe impl TrustedLen for Empty {} #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for Empty {} // not #[derive] because that adds a Clone bound on T, // which isn't necessary. #[stable(feature = "iter_empty", since = "1.2.0")] impl Clone for Empty { fn clone(&self) -> Empty { Empty(marker::PhantomData) } } // not #[derive] because that adds a Default bound on T, // which isn't necessary. #[stable(feature = "iter_empty", since = "1.2.0")] impl Default for Empty { fn default() -> Empty { Empty(marker::PhantomData) } } /// Creates an iterator that yields nothing. /// /// # Examples /// /// Basic usage: /// /// ``` /// use std::iter; /// /// // this could have been an iterator over i32, but alas, it's just not. /// let mut nope = iter::empty::(); /// /// assert_eq!(None, nope.next()); /// ``` #[stable(feature = "iter_empty", since = "1.2.0")] pub const fn empty() -> Empty { Empty(marker::PhantomData) } /// An iterator that yields an element exactly once. /// /// This `struct` is created by the [`once`] function. See its documentation for more. /// /// [`once`]: fn.once.html #[derive(Clone, Debug)] #[stable(feature = "iter_once", since = "1.2.0")] pub struct Once { inner: ::option::IntoIter } #[stable(feature = "iter_once", since = "1.2.0")] impl Iterator for Once { type Item = T; fn next(&mut self) -> Option { self.inner.next() } fn size_hint(&self) -> (usize, Option) { self.inner.size_hint() } } #[stable(feature = "iter_once", since = "1.2.0")] impl DoubleEndedIterator for Once { fn next_back(&mut self) -> Option { self.inner.next_back() } } #[stable(feature = "iter_once", since = "1.2.0")] impl ExactSizeIterator for Once { fn len(&self) -> usize { self.inner.len() } } #[unstable(feature = "trusted_len", issue = "37572")] unsafe impl TrustedLen for Once {} #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for Once {} /// Creates an iterator that yields an element exactly once. /// /// This is commonly used to adapt a single value into a [`chain`] of other /// kinds of iteration. Maybe you have an iterator that covers almost /// everything, but you need an extra special case. Maybe you have a function /// which works on iterators, but you only need to process one value. /// /// [`chain`]: trait.Iterator.html#method.chain /// /// # Examples /// /// Basic usage: /// /// ``` /// use std::iter; /// /// // one is the loneliest number /// let mut one = iter::once(1); /// /// assert_eq!(Some(1), one.next()); /// /// // just one, that's all we get /// assert_eq!(None, one.next()); /// ``` /// /// Chaining together with another iterator. Let's say that we want to iterate /// over each file of the `.foo` directory, but also a configuration file, /// `.foorc`: /// /// ```no_run /// use std::iter; /// use std::fs; /// use std::path::PathBuf; /// /// let dirs = fs::read_dir(".foo").unwrap(); /// /// // we need to convert from an iterator of DirEntry-s to an iterator of /// // PathBufs, so we use map /// let dirs = dirs.map(|file| file.unwrap().path()); /// /// // now, our iterator just for our config file /// let config = iter::once(PathBuf::from(".foorc")); /// /// // chain the two iterators together into one big iterator /// let files = dirs.chain(config); /// /// // this will give us all of the files in .foo as well as .foorc /// for f in files { /// println!("{:?}", f); /// } /// ``` #[stable(feature = "iter_once", since = "1.2.0")] pub fn once(value: T) -> Once { Once { inner: Some(value).into_iter() } } /// An iterator that repeats elements of type `A` endlessly by /// applying the provided closure `F: FnMut() -> A`. /// /// This `struct` is created by the [`once_with`] function. /// See its documentation for more. /// /// [`once_with`]: fn.once_with.html #[derive(Copy, Clone, Debug)] #[unstable(feature = "iter_once_with", issue = "57581")] pub struct OnceWith { gen: Option, } #[unstable(feature = "iter_once_with", issue = "57581")] impl A> Iterator for OnceWith { type Item = A; #[inline] fn next(&mut self) -> Option { self.gen.take().map(|f| f()) } #[inline] fn size_hint(&self) -> (usize, Option) { self.gen.iter().size_hint() } } #[unstable(feature = "iter_once_with", issue = "57581")] impl A> DoubleEndedIterator for OnceWith { fn next_back(&mut self) -> Option { self.next() } } #[unstable(feature = "iter_once_with", issue = "57581")] impl A> ExactSizeIterator for OnceWith { fn len(&self) -> usize { self.gen.iter().len() } } #[unstable(feature = "iter_once_with", issue = "57581")] impl A> FusedIterator for OnceWith {} #[unstable(feature = "iter_once_with", issue = "57581")] unsafe impl A> TrustedLen for OnceWith {} /// Creates an iterator that lazily generates a value exactly once by invoking /// the provided closure. /// /// This is commonly used to adapt a single value generator into a [`chain`] of /// other kinds of iteration. Maybe you have an iterator that covers almost /// everything, but you need an extra special case. Maybe you have a function /// which works on iterators, but you only need to process one value. /// /// Unlike [`once`], this function will lazily generate the value on request. /// /// [`once`]: fn.once.html /// [`chain`]: trait.Iterator.html#method.chain /// /// # Examples /// /// Basic usage: /// /// ``` /// #![feature(iter_once_with)] /// /// use std::iter; /// /// // one is the loneliest number /// let mut one = iter::once_with(|| 1); /// /// assert_eq!(Some(1), one.next()); /// /// // just one, that's all we get /// assert_eq!(None, one.next()); /// ``` /// /// Chaining together with another iterator. Let's say that we want to iterate /// over each file of the `.foo` directory, but also a configuration file, /// `.foorc`: /// /// ```no_run /// #![feature(iter_once_with)] /// /// use std::iter; /// use std::fs; /// use std::path::PathBuf; /// /// let dirs = fs::read_dir(".foo").unwrap(); /// /// // we need to convert from an iterator of DirEntry-s to an iterator of /// // PathBufs, so we use map /// let dirs = dirs.map(|file| file.unwrap().path()); /// /// // now, our iterator just for our config file /// let config = iter::once_with(|| PathBuf::from(".foorc")); /// /// // chain the two iterators together into one big iterator /// let files = dirs.chain(config); /// /// // this will give us all of the files in .foo as well as .foorc /// for f in files { /// println!("{:?}", f); /// } /// ``` #[inline] #[unstable(feature = "iter_once_with", issue = "57581")] pub fn once_with A>(gen: F) -> OnceWith { OnceWith { gen: Some(gen) } } /// Creates a new iterator where each iteration calls the provided closure /// `F: FnMut() -> Option`. /// /// This allows creating a custom iterator with any behavior /// without using the more verbose syntax of creating a dedicated type /// and implementing the `Iterator` trait for it. /// /// Note that the `FromFn` iterator doesn’t make assumptions about the behavior of the closure, /// and therefore conservatively does not implement [`FusedIterator`], /// or override [`Iterator::size_hint`] from its default `(0, None)`. /// /// [`FusedIterator`]: trait.FusedIterator.html /// [`Iterator::size_hint`]: trait.Iterator.html#method.size_hint /// /// The closure can use captures and its environment to track state across iterations. Depending on /// how the iterator is used, this may require specifying the `move` keyword on the closure. /// /// # Examples /// /// Let’s re-implement the counter iterator from [module-level documentation]: /// /// [module-level documentation]: index.html /// /// ``` /// #![feature(iter_unfold)] /// let mut count = 0; /// let counter = std::iter::from_fn(move || { /// // Increment our count. This is why we started at zero. /// count += 1; /// /// // Check to see if we've finished counting or not. /// if count < 6 { /// Some(count) /// } else { /// None /// } /// }); /// assert_eq!(counter.collect::>(), &[1, 2, 3, 4, 5]); /// ``` #[inline] #[unstable(feature = "iter_unfold", issue = "55977")] pub fn from_fn(f: F) -> FromFn where F: FnMut() -> Option { FromFn(f) } /// An iterator where each iteration calls the provided closure `F: FnMut() -> Option`. /// /// This `struct` is created by the [`iter::from_fn`] function. /// See its documentation for more. /// /// [`iter::from_fn`]: fn.from_fn.html #[derive(Clone)] #[unstable(feature = "iter_unfold", issue = "55977")] pub struct FromFn(F); #[unstable(feature = "iter_unfold", issue = "55977")] impl Iterator for FromFn where F: FnMut() -> Option { type Item = T; #[inline] fn next(&mut self) -> Option { (self.0)() } } #[unstable(feature = "iter_unfold", issue = "55977")] impl fmt::Debug for FromFn { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("FromFn").finish() } } /// Creates a new iterator where each successive item is computed based on the preceding one. /// /// The iterator starts with the given first item (if any) /// and calls the given `FnMut(&T) -> Option` closure to compute each item’s successor. /// /// ``` /// #![feature(iter_unfold)] /// use std::iter::successors; /// /// let powers_of_10 = successors(Some(1_u16), |n| n.checked_mul(10)); /// assert_eq!(powers_of_10.collect::>(), &[1, 10, 100, 1_000, 10_000]); /// ``` #[unstable(feature = "iter_unfold", issue = "55977")] pub fn successors(first: Option, succ: F) -> Successors where F: FnMut(&T) -> Option { // If this function returned `impl Iterator` // it could be based on `unfold` and not need a dedicated type. // However having a named `Successors` type allows it to be `Clone` when `T` and `F` are. Successors { next: first, succ, } } /// An new iterator where each successive item is computed based on the preceding one. /// /// This `struct` is created by the [`successors`] function. /// See its documentation for more. /// /// [`successors`]: fn.successors.html #[derive(Clone)] #[unstable(feature = "iter_unfold", issue = "55977")] pub struct Successors { next: Option, succ: F, } #[unstable(feature = "iter_unfold", issue = "55977")] impl Iterator for Successors where F: FnMut(&T) -> Option { type Item = T; #[inline] fn next(&mut self) -> Option { self.next.take().map(|item| { self.next = (self.succ)(&item); item }) } #[inline] fn size_hint(&self) -> (usize, Option) { if self.next.is_some() { (1, None) } else { (0, Some(0)) } } } #[unstable(feature = "iter_unfold", issue = "55977")] impl FusedIterator for Successors where F: FnMut(&T) -> Option {} #[unstable(feature = "iter_unfold", issue = "55977")] impl fmt::Debug for Successors { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("Successors") .field("next", &self.next) .finish() } }