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