/
queue.go
67 lines (51 loc) · 1.74 KB
/
queue.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package events
import (
"sync"
)
// region Queue ////////////////////////////////////////////////////////////////////////////////////////////////////////
// Queue represents an Event
type Queue struct {
queuedElements []*queueElement
queuedElementsMutex sync.Mutex
}
// NewQueue returns an empty Queue.
func NewQueue() *Queue {
return (&Queue{}).clear()
}
// Queue enqueues an Event to be triggered later (using the Trigger function).
func (q *Queue) Queue(event *Event, params ...interface{}) {
q.queuedElementsMutex.Lock()
defer q.queuedElementsMutex.Unlock()
q.queuedElements = append(q.queuedElements, &queueElement{
event: event,
params: params,
})
}
// Trigger triggers all queued Events and empties the Queue.
func (q *Queue) Trigger() {
q.queuedElementsMutex.Lock()
defer q.queuedElementsMutex.Unlock()
for _, queuedElement := range q.queuedElements {
queuedElement.event.Trigger(queuedElement.params...)
}
q.clear()
}
// Clear removes all elements from the Queue.
func (q *Queue) Clear() {
q.queuedElementsMutex.Lock()
defer q.queuedElementsMutex.Unlock()
q.clear()
}
// clear removes all elements from the Queue without locking it.
func (q *Queue) clear() *Queue {
q.queuedElements = make([]*queueElement, 0)
return q
}
// endregion ///////////////////////////////////////////////////////////////////////////////////////////////////////////
// region queueElement /////////////////////////////////////////////////////////////////////////////////////////////////
// queueElement is a struct that holds the information about a triggered Event.
type queueElement struct {
event *Event
params []interface{}
}
// endregion ///////////////////////////////////////////////////////////////////////////////////////////////////////////