clawgo/internal/routing/queue/queue.go
2026-01-04 18:26:33 +01:00

59 lines
730 B
Go

package queue
import (
"context"
"sync"
)
type Task func(context.Context) error
type Queue struct {
mu sync.Mutex
closed bool
ch chan Task
}
func New(size int) *Queue {
if size < 1 {
size = 1
}
return &Queue{ch: make(chan Task, size)}
}
func (q *Queue) Start(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
case task, ok := <-q.ch:
if !ok {
return
}
if task != nil {
_ = task(ctx)
}
}
}
}
func (q *Queue) Enqueue(task Task) bool {
q.mu.Lock()
defer q.mu.Unlock()
if q.closed {
return false
}
q.ch <- task
return true
}
func (q *Queue) Close() {
q.mu.Lock()
if q.closed {
q.mu.Unlock()
return
}
q.closed = true
close(q.ch)
q.mu.Unlock()
}