diff --git a/library/core/src/array/mod.rs b/library/core/src/array/mod.rs index 1643842d60756..2c31366c8d424 100644 --- a/library/core/src/array/mod.rs +++ b/library/core/src/array/mod.rs @@ -961,3 +961,32 @@ fn iter_next_chunk_erased( mem::forget(guard); Ok(()) } + +/// Tries to create an array `[T; N]` from the items of `iter`. If and only if `iter` holds +/// `>= N` items it returns `OK([T; N])`. Otherwise, `Err(IntoIter)` is returned. +/// +/// # Arguments +/// +/// * `iter`: Type that implements `IntoIterator` where `Items = T`. +/// +/// # Example +/// +/// ```rust +/// #![feature(try_from_iter)] +/// let vec = vec![0, 1, 2, 3]; +/// let array = core::array::try_from_iter::<_, 4>(vec); +/// assert!(array.is_ok()); +/// assert_eq!(array.unwrap(), [0, 1, 2, 3]); +/// +/// let vec = vec![0, 1, 2]; +/// let array = core::array::try_from_iter::<_, 4>(vec); +/// assert!(array.is_err()); +/// ``` +#[unstable(feature = "try_from_iter", issue = "none")] +#[inline] +pub fn try_from_iter(iter: I) -> Result<[I::Item; N], IntoIter> +where + I: IntoIterator, +{ + iter.into_iter().next_chunk() +} diff --git a/library/core/tests/array.rs b/library/core/tests/array.rs index 5327e4f813925..ea32e0f967f7f 100644 --- a/library/core/tests/array.rs +++ b/library/core/tests/array.rs @@ -701,6 +701,18 @@ fn array_into_iter_rfold() { assert_eq!(s, 10432); } +#[test] +fn array_try_fill_from() { + let vec = vec![0, 1, 2, 3]; + let array = core::array::try_from_iter::<_, 4>(vec); + assert!(array.is_ok()); + assert_eq!(array.unwrap(), [0, 1, 2, 3]); + + let vec = vec![0, 1, 2]; + let array = core::array::try_from_iter::<_, 4>(vec); + assert!(array.is_err()); +} + #[cfg(not(panic = "abort"))] #[test] fn array_map_drops_unmapped_elements_on_panic() { diff --git a/library/core/tests/lib.rs b/library/core/tests/lib.rs index 42a26ae1675c1..17e57abed0c87 100644 --- a/library/core/tests/lib.rs +++ b/library/core/tests/lib.rs @@ -108,6 +108,7 @@ #![feature(utf8_chunks)] #![feature(is_ascii_octdigit)] #![feature(get_many_mut)] +#![feature(try_from_iter)] #![deny(unsafe_op_in_unsafe_fn)] #![deny(fuzzy_provenance_casts)]