Add function core::iter::chain
The addition of `core::iter::zip` (#82917) set a precedent for adding plain functions for iterator adaptors. Adding `chain` makes it a little easier to `chain` two iterators. ``` for (x, y) in chain(xs, ys) {} // vs. for (x, y) in xs.into_iter().chain(ys) {} ```
This commit is contained in:
parent
27529d5c25
commit
6a84995fae
5 changed files with 49 additions and 2 deletions
|
@ -4,8 +4,8 @@ use crate::ops::Try;
|
|||
|
||||
/// An iterator that links two iterators together, in a chain.
|
||||
///
|
||||
/// This `struct` is created by [`Iterator::chain`]. See its documentation
|
||||
/// for more.
|
||||
/// This `struct` is created by [`chain`] or [`Iterator::chain`]. See their
|
||||
/// documentation for more.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
@ -38,6 +38,39 @@ impl<A, B> Chain<A, B> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Converts the arguments to iterators and links them together, in a chain.
|
||||
///
|
||||
/// See the documentation of [`Iterator::chain`] for more.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(iter_chain)]
|
||||
///
|
||||
/// use std::iter::chain;
|
||||
///
|
||||
/// let a = [1, 2, 3];
|
||||
/// let b = [4, 5, 6];
|
||||
///
|
||||
/// let mut iter = chain(a, b);
|
||||
///
|
||||
/// assert_eq!(iter.next(), Some(1));
|
||||
/// assert_eq!(iter.next(), Some(2));
|
||||
/// assert_eq!(iter.next(), Some(3));
|
||||
/// assert_eq!(iter.next(), Some(4));
|
||||
/// assert_eq!(iter.next(), Some(5));
|
||||
/// assert_eq!(iter.next(), Some(6));
|
||||
/// assert_eq!(iter.next(), None);
|
||||
/// ```
|
||||
#[unstable(feature = "iter_chain", reason = "recently added", issue = "125964")]
|
||||
pub fn chain<A, B>(a: A, b: B) -> Chain<A::IntoIter, B::IntoIter>
|
||||
where
|
||||
A: IntoIterator,
|
||||
B: IntoIterator<Item = A::Item>,
|
||||
{
|
||||
Chain::new(a.into_iter(), b.into_iter())
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<A, B> Iterator for Chain<A, B>
|
||||
where
|
||||
|
|
|
@ -41,6 +41,9 @@ pub use self::array_chunks::ArrayChunks;
|
|||
#[unstable(feature = "std_internals", issue = "none")]
|
||||
pub use self::by_ref_sized::ByRefSized;
|
||||
|
||||
#[unstable(feature = "iter_chain", reason = "recently added", issue = "125964")]
|
||||
pub use self::chain::chain;
|
||||
|
||||
#[stable(feature = "iter_cloned", since = "1.1.0")]
|
||||
pub use self::cloned::Cloned;
|
||||
|
||||
|
|
|
@ -428,6 +428,8 @@ pub use self::traits::{
|
|||
DoubleEndedIterator, ExactSizeIterator, Extend, FromIterator, IntoIterator, Product, Sum,
|
||||
};
|
||||
|
||||
#[unstable(feature = "iter_chain", reason = "recently added", issue = "125964")]
|
||||
pub use self::adapters::chain;
|
||||
#[stable(feature = "iter_zip", since = "1.59.0")]
|
||||
pub use self::adapters::zip;
|
||||
#[unstable(feature = "iter_array_chunks", reason = "recently added", issue = "100450")]
|
||||
|
|
|
@ -2,6 +2,14 @@ use super::*;
|
|||
use core::iter::*;
|
||||
use core::num::NonZero;
|
||||
|
||||
#[test]
|
||||
fn test_chain() {
|
||||
let xs = [0, 1, 2, 3, 4, 5];
|
||||
let ys = [30, 40, 50, 60];
|
||||
let expected = [0, 1, 2, 3, 4, 5, 30, 40, 50, 60];
|
||||
assert_eq!(Vec::from_iter(chain(xs, ys)), expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_iterator_chain() {
|
||||
let xs = [0, 1, 2, 3, 4, 5];
|
||||
|
|
|
@ -75,6 +75,7 @@
|
|||
#![feature(ip)]
|
||||
#![feature(iter_advance_by)]
|
||||
#![feature(iter_array_chunks)]
|
||||
#![feature(iter_chain)]
|
||||
#![feature(iter_collect_into)]
|
||||
#![feature(iter_partition_in_place)]
|
||||
#![feature(iter_intersperse)]
|
||||
|
|
Loading…
Add table
Reference in a new issue