feat: optimize index build
This commit is contained in:
75
pkg/generic/queue.go
Normal file
75
pkg/generic/queue.go
Normal file
@ -0,0 +1,75 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user