package lifo import "fmt" type LIFO[T any] []T func New[T any](items ...T) *LIFO[T] { l := LIFO[T](items) return &l } func (l *LIFO[T]) Push(item T) { *l = append(*l, item) } func (l *LIFO[T]) Empty() bool { return len(*l) == 0 } func (l *LIFO[T]) MustPop() T { var item T *l, item = (*l)[:len(*l)-1], (*l)[len(*l)-1] return item } func (l *LIFO[T]) Pop() (T, error) { var item T if l.Empty() { return item, fmt.Errorf("stack is exhausted") } return l.MustPop(), nil }