See also: How to iterate prefixes and suffixes of str or String in rust?
What works for a &[T]
(i.e. a slice) will also work for &Vec<T>
due to Deref coercion
To construct a range of indexes from 0 to slice.len() inclusive: 0..=slice.len()
std::ops::Range implements both Iterator and DoubleEndedIterator. This allows you to use the rev() method:
(0..=slice.len()).rev()
To get a prefix of a given length: &slice[..len]
To get a suffix without the first cut
items: &slice[cut..]
Putting it all together
To iterate from shortest to longest:
pub fn prefixes_asc<T>(slice: &[T]) -> impl Iterator<Item = &[T]> + DoubleEndedIterator {
(0..=slice.len()).map(move |len| &slice[..len])
}
pub fn suffixes_asc<T>(slice: &[T]) -> impl Iterator<Item = &[T]> + DoubleEndedIterator {
(0..=slice.len()).rev().map(move |cut| &slice[cut..])
}
To reverse just use .rev():
pub fn prefixes_desc<T>(slice: &[T]) -> impl Iterator<Item = &[T]> + DoubleEndedIterator {
prefixes_asc(slice).rev()
}
pub fn suffixes_desc<T>(slice: &[T]) -> impl Iterator<Item = &[T]> + DoubleEndedIterator {
suffixes_asc(slice).rev()
}
tests