use crate::errors::{error::Error, error_kind::ErrorKind};
use std::fmt::Debug;
#[derive(Debug)]
pub struct Stack<T: Debug + PartialEq>(pub Vec<T>);
impl<T: Debug + PartialEq> Stack<T> {
pub fn new() -> Stack<T> {
Stack(vec![])
}
pub fn push(&mut self, value: T) {
self.0.push(value)
}
pub fn pop(&mut self, pos: usize) -> Result<T, Error> {
self.0
.pop()
.ok_or_else(|| Error::new(ErrorKind::EmptyStack, pos))
}
pub fn peek(&self) -> Option<&T> {
if self.0.is_empty() {
None
} else {
self.0.last()
}
}
pub fn peek_mut(&mut self) -> Option<&mut T> {
if self.0.is_empty() {
None
} else {
self.0.last_mut()
}
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
}