use std::ops;
use value::Value;
use util::convert::{TryAsRef, TryAsMut};
mod iter;
pub use self::iter::{Iter, IterMut, IntoIter};
#[derive(Debug, Clone, PartialEq)]
pub struct List<'a> {
vec: Vec<Value<'a>>,
}
impl<'a> List<'a> {
pub fn new() -> List<'a> {
List {
vec: Vec::new(),
}
}
pub fn with_vec(vec: Vec<Value<'a>>) -> List<'a> {
List {
vec,
}
}
pub fn len(&self) -> usize {
self.vec.len()
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn clear(&mut self) {
self.vec.clear()
}
pub fn get<T>(&self, index: usize) -> Option<&T>
where
T: ?Sized,
Value<'a>: TryAsRef<T>,
{
self.vec.get(index)
.and_then(TryAsRef::try_as_ref)
}
pub fn get_mut<T>(&mut self, index: usize) -> Option<&mut T>
where
T: ?Sized,
Value<'a>: TryAsMut<T>,
{
self.vec.get_mut(index)
.and_then(TryAsMut::try_as_mut)
}
pub fn insert<T>(&mut self, index: usize, value: T)
where
Value<'a>: From<T>,
{
self.vec.insert(index, value.into());
}
pub fn remove(&mut self, index: usize) -> Value<'a> {
self.vec.remove(index)
}
pub fn push<T>(&mut self, value: T)
where
Value<'a>: From<T>,
{
self.vec.push(value.into())
}
pub fn pop(&mut self) -> Option<Value<'a>> {
self.vec.pop()
}
pub fn iter<'b>(&'b self) -> Iter<'a, 'b> {
self.into_iter()
}
pub fn iter_mut<'b>(&'b mut self) -> IterMut<'a, 'b> {
self.into_iter()
}
}
impl<'a> ops::Index<usize> for List<'a> {
type Output = Value<'a>;
fn index(&self, index: usize) -> &Self::Output {
self.get(index).unwrap()
}
}
impl<'a> ops::IndexMut<usize> for List<'a> {
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
self.get_mut(index).unwrap()
}
}
impl<'a> ops::Deref for List<'a> {
type Target = [Value<'a>];
fn deref(&self) -> &[Value<'a>] {
self.vec.deref()
}
}