package extypes import ( "errors" "sync" ) var QueueFullErr = errors.New("queue full") type Queue[T any] struct { size uint64 mu sync.RWMutex queue Slice[T] } func CreateQueue[T any](size uint64) *Queue[T] { return &Queue[T]{queue: make(Slice[T], 0, size), size: size} } func (q *Queue[T]) Len() uint64 { q.mu.RLock() defer q.mu.RUnlock() return uint64(q.queue.Len()) } func (q *Queue[T]) IsEmpty() bool { return q.Len() == 0 } 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() { 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() if q.Len() == 1 { q.mu.Lock() q.queue = make(Slice[T], 0) q.mu.Unlock() return el } q.mu.Lock() q.queue = q.queue.Pop(0) q.mu.Unlock() return el } func (q *Queue[T]) Peak() T { q.mu.RLock() defer q.mu.RUnlock() return q.queue.Get(0) } func (q *Queue[T]) Raw() Slice[T] { return q.queue }