gob/collection/stack.go

73 lines
1.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package collection
import (
. "gitea.zaclys.com/bvaudour/gob/option"
)
// Stack représente une pile délément.
// Une pile est une collection où les éléments suivant la logique “dernier arrivé, premier servi“.
type Stack[T any] struct {
first *chain[T]
size uint
}
// Len retourne le nombre déléments de la pile.
func (s Stack[T]) Len() uint {
return s.size
}
// Push ajoute tous les éléments dentrée dans la pile.
func (s *Stack[T]) Push(elems ...T) {
for _, e := range elems {
s.first = prevChain(e, s.first)
s.size++
}
}
// Pop dépile le premier élément de la pile et le retourne.
func (s *Stack[T]) Pop() (e Option[T]) {
if s.size > 0 {
e = Some(s.first.value)
s.first = s.first.next
s.size--
}
return
}
// ToSlice convertit une pile en slice.
func (s *Stack[T]) ToSlice() (sl []T) {
sl = make([]T, s.size)
c := s.first
for i := uint(0); i < s.size; i++ {
sl[i] = c.value
c = c.next
}
return
}
// ToQueue convertit une pile en file.
func (s *Stack[T]) ToQueue() (q *Queue[T]) {
q = &Queue[T]{
first: s.first,
size: s.size,
}
var c = s.first
for i := uint(1); i < s.size; i++ {
c = c.next
}
q.last = c
return
}
// NewStack retourne une pile initialisée à partir des données dentrées.
func NewStack[T any](elems ...T) (s *Stack[T]) {
s = new(Stack[T])
s.Push(elems...)
return
}