mirror of
https://git.mills.io/prologic/msgbus.git
synced 2024-07-03 00:34:16 +00:00
80 lines
861 B
Go
80 lines
861 B
Go
|
package msgbus
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
)
|
||
|
|
||
|
// QueueNode ...
|
||
|
type QueueNode struct {
|
||
|
data interface{}
|
||
|
next *QueueNode
|
||
|
}
|
||
|
|
||
|
// Queue ...
|
||
|
type Queue struct {
|
||
|
sync.Mutex
|
||
|
|
||
|
head *QueueNode
|
||
|
tail *QueueNode
|
||
|
size int
|
||
|
}
|
||
|
|
||
|
// Len ...
|
||
|
func (q *Queue) Len() int {
|
||
|
q.Lock()
|
||
|
defer q.Unlock()
|
||
|
return q.size
|
||
|
}
|
||
|
|
||
|
// Push ...
|
||
|
func (q *Queue) Push(item interface{}) {
|
||
|
q.Lock()
|
||
|
defer q.Unlock()
|
||
|
|
||
|
n := &QueueNode{data: item}
|
||
|
|
||
|
if q.tail == nil {
|
||
|
q.tail = n
|
||
|
q.head = n
|
||
|
} else {
|
||
|
q.tail.next = n
|
||
|
q.tail = n
|
||
|
}
|
||
|
|
||
|
q.size++
|
||
|
}
|
||
|
|
||
|
// Pop ...
|
||
|
func (q *Queue) Pop() interface{} {
|
||
|
q.Lock()
|
||
|
defer q.Unlock()
|
||
|
|
||
|
if q.head == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
n := q.head
|
||
|
q.head = n.next
|
||
|
|
||
|
if q.head == nil {
|
||
|
q.tail = nil
|
||
|
}
|
||
|
|
||
|
q.size--
|
||
|
|
||
|
return n.data
|
||
|
}
|
||
|
|
||
|
// Peek ...
|
||
|
func (q *Queue) Peek() interface{} {
|
||
|
q.Lock()
|
||
|
defer q.Unlock()
|
||
|
|
||
|
n := q.head
|
||
|
if n == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
return n.data
|
||
|
}
|