1package queue
2
3type Job struct {
4 Run func() error
5 OnFail func(error)
6}
7
8type Queue struct {
9 jobs chan Job
10}
11
12func NewQueue(size int) *Queue {
13 return &Queue{
14 jobs: make(chan Job, size),
15 }
16}
17
18func (q *Queue) Enqueue(job Job) bool {
19 select {
20 case q.jobs <- job:
21 return true
22 default:
23 return false
24 }
25}
26
27func (q *Queue) StartRunner() {
28 go func() {
29 for job := range q.jobs {
30 if err := job.Run(); err != nil {
31 if job.OnFail != nil {
32 job.OnFail(err)
33 }
34 }
35 }
36 }()
37}