use std::{fmt::Debug};
use crate::{linked_list::{iter::IntoIter, linked_list::LinkedList, traits::linked_list_traits::LinkedListTrait}, stack::{stack_error::StackError, traits::stack_traits::StackTrait}};
pub struct Stack<T:Clone> {
elements:LinkedList<T>
}
impl <T:Clone+PartialEq> StackTrait<T> for Stack<T> {
fn new()->Stack<T> {
return Stack { elements: LinkedList::new() }
}
fn from_vec(values: Vec<T>)->Stack<T> {
let mut stack = Stack::new();
for value in values{
stack.push(value);
}
stack
}
fn push(&mut self, value:T) {
self.elements.insert(value, 0).ok();
}
fn pop(&mut self)->Result<T, StackError> {
return self.elements.remove(0).map_err(|_| StackError::EmptyStack);
}
fn peek(&self)->Result<&T, StackError> {
if self.is_empty(){return Err(StackError::EmptyStack);}
let index = self.elements.size()-1;
return self.elements.get(index).map_err(|_| StackError::EmptyStack);
}
fn peek_mut(&mut self)->Result<&mut T, StackError> {
let index = self.elements.size()-1;
return self.elements.get_mut(index).map_err(|_| StackError::EmptyStack);
}
fn size(&self)->usize {
return self.elements.size();
}
fn is_empty(&self)->bool {
return self.size() == 0;
}
}
impl<T: Clone> IntoIterator for Stack<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
self.elements.into_iter()
}
}
impl <T:Debug + Clone> Debug for Stack<T>{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self.elements)?;
Ok(())
}
}