module datatypes

pub struct Stack[T] {
mut:
	elements []T
}

// is_empty checks if the stack is empty
pub fn (stack Stack[T]) is_empty() bool {
	return stack.elements.len == 0
}

// len returns the length of the stack
pub fn (stack Stack[T]) len() int {
	return stack.elements.len
}

// peek returns the top of the stack
pub fn (stack Stack[T]) peek() !T {
	return if !stack.is_empty() { stack.elements.last() } else { error('Stack is empty') }
}

// push adds an element to the top of the stack
pub fn (mut stack Stack[T]) push(item T) {
	stack.elements << item
}

// pop removes the element at the top of the stack and returns it
pub fn (mut stack Stack[T]) pop() !T {
	return if !stack.is_empty() { stack.elements.pop() } else { error('Stack is empty') }
}

// str returns a string representation of the stack
pub fn (stack Stack[T]) str() string {
	return stack.elements.str()
}

// array returns a array representation of the stack
pub fn (stack Stack[T]) array() []T {
	return stack.elements
}
