gob/collection/queue.go

96 lines
1.7 KiB
Go
Raw Permalink Normal View History

2023-09-23 13:39:05 +00:00
package collection
import (
. "gitea.zaclys.com/bvaudour/gob/option"
)
// Queue représente une file délément.
// Une file est une collection où les éléments suivant la logique “premier arrivé, premier servi“.
type Queue[T any] struct {
first *chain[T]
last *chain[T]
size uint
}
// Len retourne le nombre déléments de la file.
func (q Queue[T]) Len() uint {
return q.size
}
func (q *Queue[T]) push(e T) {
var (
isEmpty = q.size == 0
oldLast Option[*chain[T]]
)
if !isEmpty {
oldLast = Some(q.last)
}
q.last = nextChain(e, oldLast)
if isEmpty {
q.first = q.last
}
q.size++
}
// Push ajoute tous les éléments dentrée dans la file.
func (q *Queue[T]) Push(elems ...T) {
for _, e := range elems {
q.push(e)
}
}
// Concatenate concatène deux files.
func (q1 *Queue[T]) Concatenate(q2 *Queue[T]) {
c, l := q2.first, q2.size
for i := uint(0); i < l; i++ {
q1.push(c.value)
c = c.next
}
}
// Pop dépile le premier élément de la file et le retourne.
func (q *Queue[T]) Pop() (e Option[T]) {
if q.size > 0 {
e = Some(q.first.value)
q.first = q.first.next
q.size--
if q.size == 0 {
q.last = q.first
}
}
return
}
// ToSlice convertit une file en slice.
func (q *Queue[T]) ToSlice() (sl []T) {
sl = make([]T, q.size)
c := q.first
for i := uint(0); i < q.size; i++ {
sl[i] = c.value
c = c.next
}
return
}
// ToStack convertit une file en pile.
func (q *Queue[T]) ToStack() (s *Stack[T]) {
s = &Stack[T]{
first: q.first,
size: q.size,
}
return
}
// NewQueue retourne une file initialisée à partir des données dentrées.
func NewQueue[T any](elems ...T) (q *Stack[T]) {
q = new(Stack[T])
q.Push(elems...)
return
}