Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/stdx/src/non_empty_vec.rs')
| -rw-r--r-- | crates/stdx/src/non_empty_vec.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/crates/stdx/src/non_empty_vec.rs b/crates/stdx/src/non_empty_vec.rs new file mode 100644 index 0000000000..199ee18b94 --- /dev/null +++ b/crates/stdx/src/non_empty_vec.rs @@ -0,0 +1,45 @@ +//! A [`Vec`] that is guaranteed to at least contain one element. + +pub struct NonEmptyVec<T>(Vec<T>); + +impl<T> NonEmptyVec<T> { + #[inline] + pub fn new(initial: T) -> Self { + NonEmptyVec(vec![initial]) + } + + #[inline] + pub fn last_mut(&mut self) -> &mut T { + match self.0.last_mut() { + Some(it) => it, + None => unreachable!(), + } + } + + #[inline] + pub fn pop(&mut self) -> Option<T> { + if self.0.len() <= 1 { + None + } else { + self.0.pop() + } + } + + #[inline] + pub fn push(&mut self, value: T) { + self.0.push(value) + } + + #[inline] + pub fn len(&self) -> usize { + self.0.len() + } + + #[inline] + pub fn into_first(mut self) -> T { + match self.0.pop() { + Some(it) => it, + None => unreachable!(), + } + } +} |