fix: align slice/set equality and harden queue API
This commit is contained in:
46
queue.go
46
queue.go
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user