diff --git a/library/core/src/slice/iter.rs b/library/core/src/slice/iter.rs index 22662f7d18d07..98dd1521d0e85 100644 --- a/library/core/src/slice/iter.rs +++ b/library/core/src/slice/iter.rs @@ -358,6 +358,20 @@ impl<'a, T: 'a, P: FnMut(&T) -> bool> Split<'a, T, P> { pub(super) fn new(slice: &'a [T], pred: P) -> Self { Self { v: slice, pred, finished: false } } + /// Returns a slice which contains items not yet handled by split. + /// # Example + /// + /// ``` + /// #![feature(split_as_slice)] + /// let slice = [1,2,3,4,5]; + /// let mut split = slice.split(|v| v % 2 == 0); + /// assert!(split.next().is_some()); + /// assert_eq!(split.as_slice(), &[3,4,5]); + /// ``` + #[unstable(feature = "split_as_slice", issue = "96137")] + pub fn as_slice(&self) -> &'a [T] { + if self.finished { &[] } else { &self.v } + } } #[stable(feature = "core_impl_debug", since = "1.9.0")] diff --git a/library/core/tests/lib.rs b/library/core/tests/lib.rs index 447a6fcf7567e..485fa305c00e1 100644 --- a/library/core/tests/lib.rs +++ b/library/core/tests/lib.rs @@ -46,6 +46,7 @@ #![feature(sort_internals)] #![feature(slice_take)] #![feature(slice_from_ptr_range)] +#![feature(split_as_slice)] #![feature(maybe_uninit_uninit_array)] #![feature(maybe_uninit_array_assume_init)] #![feature(maybe_uninit_write_slice)] diff --git a/library/core/tests/slice.rs b/library/core/tests/slice.rs index ada479147db95..872786ed1bd80 100644 --- a/library/core/tests/slice.rs +++ b/library/core/tests/slice.rs @@ -2339,6 +2339,18 @@ fn slice_rsplit_array_mut() { } } +#[test] +fn split_as_slice() { + let arr = [1, 2, 3, 4, 5, 6]; + let mut split = arr.split(|v| v % 2 == 0); + assert_eq!(split.as_slice(), &[1, 2, 3, 4, 5, 6]); + assert!(split.next().is_some()); + assert_eq!(split.as_slice(), &[3, 4, 5, 6]); + assert!(split.next().is_some()); + assert!(split.next().is_some()); + assert_eq!(split.as_slice(), &[]); +} + #[should_panic] #[test] fn slice_split_array_ref_out_of_bounds() {