nonempty_containers/
ne_vec.rs1use crate::errors::NonEmptyError;
28#[cfg(feature = "im")]
29use im::Vector;
30use std::collections::vec_deque::IntoIter;
31use std::collections::vec_deque::{Iter, IterMut};
32use std::collections::VecDeque;
33use std::ops::Index;
34
35#[derive(Debug, Eq, PartialEq, Clone, Hash)]
37pub struct NEVec<T>(VecDeque<T>);
38
39impl<T> NEVec<T> {
40 pub fn new(head: T, tail: Vec<T>) -> Self {
42 let mut vec = VecDeque::from(tail);
44 vec.push_front(head);
45 Self(vec)
46 }
47
48 pub fn singleton(value: T) -> Self {
56 let mut vec = VecDeque::new();
57 vec.push_back(value);
58 Self(vec)
59 }
60
61 pub fn head(&self) -> &T {
64 self.0.front().expect("[NonEmptyVec] invariant violated.")
65 }
66
67 pub fn init(&self) -> Iter<'_, T> {
70 self.0.range(..self.0.len() - 1)
71 }
72
73 pub fn tail(&self) -> Iter<'_, T> {
76 self.0.range(1..self.0.len())
77 }
78
79 pub fn last(&self) -> &T {
82 self.0.back().expect("[NonEmptyVec] invariant violated.")
83 }
84
85 pub fn from_vec(vec: Vec<T>) -> Result<Self, NonEmptyError> {
93 match vec.is_empty() {
94 true => Err(NonEmptyError::Empty),
95 false => Ok(Self(VecDeque::from(vec))),
96 }
97 }
98
99 pub fn from_deque(deque: VecDeque<T>) -> Result<Self, NonEmptyError> {
110 match deque.is_empty() {
111 true => Err(NonEmptyError::Empty),
112 false => Ok(Self(deque)),
113 }
114 }
115
116 #[cfg(feature = "im")]
127 pub fn from_vector(vector: Vector<T>) -> Result<Self, NonEmptyError>
128 where
129 T: Clone,
130 {
131 match vector.is_empty() {
132 true => Err(NonEmptyError::Empty),
133 false => Ok(Self(VecDeque::from_iter(vector.into_iter()))),
134 }
135 }
136
137 #[doc(hidden)]
140 pub fn __from_vec_unsafe(vec: Vec<T>) -> Self {
141 debug_assert!(!vec.is_empty());
142 Self::from_vec(vec).unwrap()
143 }
144
145 #[doc(hidden)]
148 pub fn __from_deque_unsafe(deque: VecDeque<T>) -> Self {
149 debug_assert!(!deque.is_empty());
150 Self::from_deque(deque).unwrap()
151 }
152
153 #[doc(hidden)]
156 #[cfg(feature = "im")]
157 pub fn __from_vector_unsafe(vector: Vector<T>) -> Self
158 where
159 T: Clone,
160 {
161 debug_assert!(!vector.is_empty());
162 Self::from_vector(vector).unwrap()
163 }
164
165 pub fn len(&self) -> usize {
167 self.0.len()
168 }
169
170 pub fn is_empty(&self) -> bool {
172 false
173 }
174
175 pub fn as_slice(&mut self) -> &[T] {
177 self.0.make_contiguous();
178 self.0.as_slices().0
179 }
180
181 pub fn push_front(&mut self, value: T) {
183 self.0.push_front(value);
184 }
185
186 pub fn push_back(&mut self, value: T) {
188 self.0.push_back(value);
189 }
190
191 pub fn pop_front(&mut self) -> Result<T, NonEmptyError> {
193 match self.0.len() {
194 0 => Err(NonEmptyError::Empty),
195 1 => Err(NonEmptyError::AlreadySingleton),
196 _ => Ok(self
197 .0
198 .pop_front()
199 .expect("[NonEmptyVec] invariant violated.")),
200 }
201 }
202
203 pub fn pop_back(&mut self) -> Result<T, NonEmptyError> {
205 match self.0.len() {
206 0 => Err(NonEmptyError::Empty),
207 1 => Err(NonEmptyError::AlreadySingleton),
208 _ => Ok(self
209 .0
210 .pop_back()
211 .expect("[NonEmptyVec] invariant violated.")),
212 }
213 }
214
215 pub fn split_first(&self) -> (&T, Iter<'_, T>) {
218 (self.head(), self.tail())
219 }
220
221 pub fn split_last(&self) -> (Iter<'_, T>, &T) {
225 (self.init(), self.last())
226 }
227
228 pub fn take_split_first(self) -> (T, IntoIter<T>) {
230 let mut iter = self.0.into_iter();
231 let head = iter.next().expect("[NonEmptyVec] invariant violated.");
232 (head, iter)
233 }
234
235 pub fn take_split_last(self) -> (IntoIter<T>, T) {
237 let mut iter = self.0.into_iter();
238 let last = iter.next_back().expect("[NonEmptyVec] invariant violated.");
239 (iter, last)
240 }
241
242 pub fn iter(&self) -> Iter<'_, T> {
244 self.0.iter()
245 }
246}
247
248impl<T> From<NEVec<T>> for Vec<T> {
249 fn from(ne: NEVec<T>) -> Self {
250 ne.0.into()
251 }
252}
253
254impl<T> From<NEVec<T>> for VecDeque<T> {
255 fn from(ne: NEVec<T>) -> Self {
256 ne.0
257 }
258}
259
260#[cfg(feature = "im")]
261impl<T> From<NEVec<T>> for Vector<T>
262where
263 T: Clone,
264{
265 fn from(ne: NEVec<T>) -> Self {
266 Vector::from_iter(ne.0.into_iter())
267 }
268}
269
270impl<T> TryFrom<Vec<T>> for NEVec<T> {
271 type Error = NonEmptyError;
272
273 fn try_from(vec: Vec<T>) -> Result<Self, Self::Error> {
274 NEVec::from_vec(vec)
275 }
276}
277
278impl<T> From<(T, Vec<T>)> for NEVec<T> {
279 fn from(value: (T, Vec<T>)) -> Self {
280 let (head, tail) = value;
281 Self::new(head, tail)
282 }
283}
284
285impl<T> From<(T, VecDeque<T>)> for NEVec<T> {
286 fn from(value: (T, VecDeque<T>)) -> Self {
287 let (head, tail) = value;
288 Self::new(head, Vec::from(tail))
289 }
290}
291
292#[cfg(feature = "im")]
293impl<T: Clone> From<(T, Vector<T>)> for NEVec<T> {
294 fn from(value: (T, Vector<T>)) -> Self {
295 let (head, tail) = value;
296 Self::new(head, Vec::from_iter(tail.into_iter()))
297 }
298}
299
300impl<T> From<T> for NEVec<T> {
301 fn from(value: T) -> Self {
302 Self::singleton(value)
303 }
304}
305
306impl<'a, T> IntoIterator for &'a NEVec<T> {
307 type Item = &'a T;
308 type IntoIter = Iter<'a, T>;
309
310 fn into_iter(self) -> Self::IntoIter {
311 self.0.iter()
312 }
313}
314
315impl<'a, T> IntoIterator for &'a mut NEVec<T> {
316 type Item = &'a mut T;
317 type IntoIter = IterMut<'a, T>;
318
319 fn into_iter(self) -> Self::IntoIter {
320 self.0.iter_mut()
321 }
322}
323
324impl<T> IntoIterator for NEVec<T> {
325 type Item = T;
326 type IntoIter = IntoIter<T>;
327
328 fn into_iter(self) -> Self::IntoIter {
329 self.0.into_iter()
330 }
331}
332
333impl<T> Index<usize> for NEVec<T> {
334 type Output = T;
335
336 fn index(&self, index: usize) -> &Self::Output {
337 &self.0[index]
338 }
339}