#![no_std]
extern crate alloc;
use alloc::vec::Vec;
use core::fmt::{self, Display, Formatter};
use core::ops::{Deref, DerefMut};
#[derive(Debug, PartialEq, Clone, Default)]
pub struct Veclite<T>(pub Vec<T>);
impl<T> Veclite<T> {
pub fn new() -> Self {
Veclite(Vec::new())
}
pub fn prepend(&mut self, value: T) {
self.0.insert(0, value);
}
}
impl<T: Display> Display for Veclite<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
for (i, item) in self.0.iter().enumerate() {
if i > 0 {
write!(f, " ")?;
}
item.fmt(f)?;
}
Ok(())
}
}
impl<T> Deref for Veclite<T> {
type Target = Vec<T>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T> DerefMut for Veclite<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl<T> From<Vec<T>> for Veclite<T> {
fn from(v: Vec<T>) -> Self {
Veclite(v)
}
}
impl<T> IntoIterator for Veclite<T> {
type Item = T;
type IntoIter = alloc::vec::IntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl<'a, T> IntoIterator for &'a Veclite<T> {
type Item = &'a T;
type IntoIter = alloc::slice::Iter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}
impl<'a, T> IntoIterator for &'a mut Veclite<T> {
type Item = &'a mut T;
type IntoIter = alloc::slice::IterMut<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter_mut()
}
}
pub type Vel<T> = Veclite<T>;
#[macro_export]
macro_rules! vel {
() => {
$crate::Vel::new()
};
($($x:expr),* $(,)?) => {
$crate::Vel::from(vec![$($x),*])
};
}