diff options
| author | bors <bors@rust-lang.org> | 2015-10-14 07:24:36 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-10-14 07:24:36 +0000 |
| commit | 294ef5b158601b09e2a3ca49af124c63a9cf9528 (patch) | |
| tree | 953903e5f926818305cbd3558f119e9baee5d1db /src/libcore | |
| parent | 293966694c3c8e0c7028e8f54340fbc328d85bff (diff) | |
| parent | 66b58d19bdeceba7aa3f4043fefd796f8c8b426c (diff) | |
| download | rust-294ef5b158601b09e2a3ca49af124c63a9cf9528.tar.gz rust-294ef5b158601b09e2a3ca49af124c63a9cf9528.zip | |
Auto merge of #29039 - Manishearth:rollup, r=Manishearth
- Successful merges: #28991, #29004, #29006, #29013, #29016, #29024, #29027, #29028, #29029, #29032, #29035 - Failed merges:
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/iter.rs | 110 |
1 files changed, 109 insertions, 1 deletions
diff --git a/src/libcore/iter.rs b/src/libcore/iter.rs index 2f12579d674..834ba91a828 100644 --- a/src/libcore/iter.rs +++ b/src/libcore/iter.rs @@ -3032,7 +3032,52 @@ impl<A: Clone> DoubleEndedIterator for Repeat<A> { fn next_back(&mut self) -> Option<A> { Some(self.element.clone()) } } -/// Creates a new iterator that endlessly repeats the element `elt`. +/// 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 +/// +/// # 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<T: Clone>(elt: T) -> Repeat<T> { @@ -3089,6 +3134,19 @@ impl<T> Default for Empty<T> { } /// Creates an iterator that yields nothing. +/// +/// # Exampes +/// +/// Basic usage: +/// +/// ``` +/// use std::iter; +/// +/// // this could have been an iterator over i32, but alas, it's just not. +/// let mut nope = iter::empty::<i32>(); +/// +/// assert_eq!(None, nope.next()); +/// ``` #[stable(feature = "iter_empty", since = "1.2.0")] pub fn empty<T>() -> Empty<T> { Empty(marker::PhantomData) @@ -3129,6 +3187,56 @@ impl<T> ExactSizeIterator for Once<T> { } /// 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<T>(value: T) -> Once<T> { Once { inner: Some(value).into_iter() } |
