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 | |
} | |