Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/pkg/generic/queue.go
1560 views
1
package generic
2
3
type Queue[T any] struct {
4
queue []T
5
}
6
7
func NewQueue[T any]() *Queue[T] {
8
return &Queue[T]{queue: make([]T, 0)}
9
}
10
11
func (q *Queue[T]) Push(v T) {
12
q.queue = append(q.queue, v)
13
}
14
15
func (q *Queue[T]) Pop() T {
16
v := q.queue[0]
17
q.queue = q.queue[1:]
18
return v
19
}
20
21
func (q *Queue[T]) Len() int {
22
return len(q.queue)
23
}
24
25
func (q *Queue[T]) IsEmpty() bool {
26
return len(q.queue) == 0
27
}
28
29
func (q *Queue[T]) Clear() {
30
q.queue = nil
31
}
32
33
func (q *Queue[T]) Peek() T {
34
return q.queue[0]
35
}
36
37
func (q *Queue[T]) PeekN(n int) []T {
38
return q.queue[:n]
39
}
40
41
func (q *Queue[T]) PopN(n int) []T {
42
v := q.queue[:n]
43
q.queue = q.queue[n:]
44
return v
45
}
46
47
func (q *Queue[T]) PopAll() []T {
48
v := q.queue
49
q.queue = nil
50
return v
51
}
52
53
func (q *Queue[T]) PopWhile(f func(T) bool) []T {
54
var i int
55
for i = 0; i < len(q.queue); i++ {
56
if !f(q.queue[i]) {
57
break
58
}
59
}
60
v := q.queue[:i]
61
q.queue = q.queue[i:]
62
return v
63
}
64
65
func (q *Queue[T]) PopUntil(f func(T) bool) []T {
66
var i int
67
for i = 0; i < len(q.queue); i++ {
68
if f(q.queue[i]) {
69
break
70
}
71
}
72
v := q.queue[:i]
73
q.queue = q.queue[i:]
74
return v
75
}
76
77