package container type Queue[T any] struct { data []T len int } // New creates an empty queue func NewQueue[T any]() Queue[T] { q := Queue[T]{ []T{}, 0, } return q } // Enqueue adds an element to the end of the queue. // It appends the given value to the queue's data slice and increments the length of the queue. func (q *Queue[T]) Enqueue(v T) { q.data = append(q.data, v) q.len++ } // Dequeue removes and returns the element at the front of the queue. // It panics if the queue is empty. func (q *Queue[T]) Dequeue() T { if !q.HasElement() { panic("called Dequeue() on an empty queue") } value := q.data[0] var zeroValue T q.data[0] = zeroValue q.data = q.data[1:] q.len-- return value } // HasElement returns true if the queue has at least one element, otherwise false. func (q *Queue[T]) HasElement() bool { return q.len > 0 } // GetData returns the data stored in the queue. func (q *Queue[T]) GetData() []T { return q.data }