use std::{
collections::VecDeque,
ops::{Index, IndexMut},
};
type Capacity = crate::Capacity<1>;
#[macro_export]
macro_rules! vec {
($item:expr) => {{
unempty::Vec::new($item)
}};
($initial:expr, $( $additional:expr ),*) => {{
let mut v = unempty::Vec::new($initial);
$(
v.push($additional);
)*
v
}};
}
use crate::TryFromError;
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct Vec<T> {
first: T,
dynamic: std::vec::Vec<T>,
}
impl<T> Vec<T> {
pub fn new(first: T) -> Self {
Self {
first,
dynamic: Default::default(),
}
}
pub fn with_capacity(first: T, capacity: Capacity) -> Self {
let dynamic = std::vec::Vec::with_capacity(capacity.dynamic());
Self { first, dynamic }
}
pub fn capacity(&self) -> Capacity {
Capacity::new_dynamic(self.dynamic.capacity())
}
pub fn len(&self) -> usize {
self.dynamic.len() + 1
}
pub fn is_empty(&self) -> bool {
false
}
pub fn pop(mut self) -> (Option<Self>, T) {
if let Some(item) = self.dynamic.pop() {
(Some(self), item)
} else {
(None, self.first)
}
}
pub fn push(&mut self, item: T) {
self.dynamic.push(item);
}
}
impl<T> TryFrom<std::vec::Vec<T>> for Vec<T> {
type Error = TryFromError;
fn try_from(sv: std::vec::Vec<T>) -> Result<Self, Self::Error> {
let mut sv = VecDeque::from(sv);
if let Some(first) = sv.pop_front() {
let mut v = Self::new(first);
v.extend(sv.into_iter());
Ok(v)
} else {
Err(TryFromError::SourceEmpty)
}
}
}
impl<T> TryFrom<VecDeque<T>> for Vec<T> {
type Error = TryFromError;
fn try_from(mut sv: VecDeque<T>) -> Result<Self, Self::Error> {
if let Some(first) = sv.pop_front() {
let mut v = Self::new(first);
v.extend(sv.into_iter());
Ok(v)
} else {
Err(TryFromError::SourceEmpty)
}
}
}
impl<T> From<Vec<T>> for std::vec::Vec<T> {
fn from(sv: Vec<T>) -> Self {
let mut v = std::vec::Vec::with_capacity(sv.len());
v.push(sv.first);
v.extend(sv.dynamic.into_iter());
v
}
}
impl<T> From<Vec<T>> for VecDeque<T> {
fn from(sv: Vec<T>) -> Self {
let mut v = VecDeque::with_capacity(sv.len());
v.push_back(sv.first);
v.extend(sv.dynamic.into_iter());
v
}
}
impl<T> Extend<T> for Vec<T> {
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
self.dynamic.extend(iter);
}
}
impl<T> Index<usize> for Vec<T> {
type Output = T;
fn index(&self, index: usize) -> &Self::Output {
if index == 0 {
&self.first
} else {
&self.dynamic[index - 1]
}
}
}
impl<T> IndexMut<usize> for Vec<T> {
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
if index == 0 {
&mut self.first
} else {
&mut self.dynamic[index - 1]
}
}
}