fix: align slice/set equality and harden queue API

This commit is contained in:
2026-03-17 14:37:35 +03:00
parent 4232591fcc
commit 156fa3153c
6 changed files with 153 additions and 29 deletions

View File

@@ -6,6 +6,7 @@ import (
)
var QueueFullErr = errors.New("queue full")
var QueueEmptyErr = errors.New("queue empty")
type Queue[T any] struct {
size uint64
@@ -27,37 +28,48 @@ func (q *Queue[T]) IsFull() bool { return q.Len() == q.size }
func (q *Queue[T]) Size() uint64 { return q.size }
func (q *Queue[T]) Enqueue(el T) error {
if q.IsFull() {
q.mu.Lock()
defer q.mu.Unlock()
if uint64(len(q.queue)) == q.size {
return QueueFullErr
}
q.queue = q.queue.Push(el)
return nil
}
func (q *Queue[T]) Dequeue() T {
q.mu.RLock()
el := q.queue.Get(0)
q.mu.RUnlock()
func (q *Queue[T]) Dequeue() (T, error) {
q.mu.Lock()
defer q.mu.Unlock()
if q.Len() == 1 {
q.mu.Lock()
q.queue = make(Slice[T], 0)
q.mu.Unlock()
return el
var zero T
if len(q.queue) == 0 {
return zero, QueueEmptyErr
}
q.mu.Lock()
q.queue = q.queue.Pop(0)
q.mu.Unlock()
return el
el := q.queue[0]
copy(q.queue, q.queue[1:])
q.queue[len(q.queue)-1] = zero
q.queue = q.queue[:len(q.queue)-1]
return el, nil
}
func (q *Queue[T]) Peak() T {
func (q *Queue[T]) Peak() (T, error) {
q.mu.RLock()
defer q.mu.RUnlock()
return q.queue.Get(0)
var zero T
if len(q.queue) == 0 {
return zero, QueueEmptyErr
}
return q.queue[0], nil
}
func (q *Queue[T]) Raw() Slice[T] {
return q.queue
q.mu.RLock()
defer q.mu.RUnlock()
return NewSliceFrom(q.queue)
}