Spaces:
Paused
Paused
| package generic | |
| type Queue[T any] struct { | |
| queue []T | |
| } | |
| func NewQueue[T any]() *Queue[T] { | |
| return &Queue[T]{queue: make([]T, 0)} | |
| } | |
| func (q *Queue[T]) Push(v T) { | |
| q.queue = append(q.queue, v) | |
| } | |
| func (q *Queue[T]) Pop() T { | |
| v := q.queue[0] | |
| q.queue = q.queue[1:] | |
| return v | |
| } | |
| func (q *Queue[T]) Len() int { | |
| return len(q.queue) | |
| } | |
| func (q *Queue[T]) IsEmpty() bool { | |
| return len(q.queue) == 0 | |
| } | |
| func (q *Queue[T]) Clear() { | |
| q.queue = nil | |
| } | |
| func (q *Queue[T]) Peek() T { | |
| return q.queue[0] | |
| } | |
| func (q *Queue[T]) PeekN(n int) []T { | |
| return q.queue[:n] | |
| } | |
| func (q *Queue[T]) PopN(n int) []T { | |
| v := q.queue[:n] | |
| q.queue = q.queue[n:] | |
| return v | |
| } | |
| func (q *Queue[T]) PopAll() []T { | |
| v := q.queue | |
| q.queue = nil | |
| return v | |
| } | |
| func (q *Queue[T]) PopWhile(f func(T) bool) []T { | |
| var i int | |
| for i = 0; i < len(q.queue); i++ { | |
| if !f(q.queue[i]) { | |
| break | |
| } | |
| } | |
| v := q.queue[:i] | |
| q.queue = q.queue[i:] | |
| return v | |
| } | |
| func (q *Queue[T]) PopUntil(f func(T) bool) []T { | |
| var i int | |
| for i = 0; i < len(q.queue); i++ { | |
| if f(q.queue[i]) { | |
| break | |
| } | |
| } | |
| v := q.queue[:i] | |
| q.queue = q.queue[i:] | |
| return v | |
| } | |