use crate::core::{DSError, Result};
pub trait List<'a, T: 'a> {
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn head(&self) -> Option<&T>;
fn last(&self) -> Option<&T>;
fn get(&self, index: usize) -> Result<&'a T> {
self.iter().nth(index).ok_or(DSError::IndexOutOfBounds {
index,
len: self.len(),
})
}
fn get_mut(&mut self, index: usize) -> Result<&'a mut T> {
let list_size = self.len();
self.iter_mut().nth(index).ok_or(DSError::IndexOutOfBounds {
index,
len: list_size
})
}
fn iter(&self) -> impl Iterator<Item = &'a T>;
fn iter_mut(&mut self) -> impl Iterator<Item = &'a mut T>;
fn into_iter(self) -> impl Iterator<Item = T>;
fn push(&mut self, payload: T);
fn pop_back(&mut self) -> Option<T>;
fn pop_front(&mut self) -> Option<T>;
fn remove(&mut self, index: usize) -> Result<T>;
fn clear(&mut self) {
while self.len() != 0 {
let _ = self.pop_front();
}
}
fn find(&self, value: &T) -> Option<usize>
where T: PartialEq<T>
{
self.iter()
.enumerate()
.find(|(_, item)| *item == value)
.map(|(index, _)| index)
}
}