70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
package settingsdocument
|
|
|
|
import "sync"
|
|
|
|
type settingsQueue struct {
|
|
sync.Mutex
|
|
queued map[string]struct{}
|
|
deleted map[string]struct{}
|
|
}
|
|
|
|
func newSettingsQueue() *settingsQueue {
|
|
return &settingsQueue{
|
|
Mutex: sync.Mutex{},
|
|
queued: map[string]struct{}{},
|
|
deleted: map[string]struct{}{},
|
|
}
|
|
}
|
|
|
|
func (q *settingsQueue) add(ids []string) {
|
|
q.Lock()
|
|
defer q.Unlock()
|
|
for _, id := range ids {
|
|
if _, exists := q.deleted[id]; exists {
|
|
continue
|
|
}
|
|
if _, exists := q.queued[id]; exists {
|
|
continue
|
|
}
|
|
q.queued[id] = struct{}{}
|
|
}
|
|
}
|
|
|
|
func (q *settingsQueue) getQueued() (ids []string) {
|
|
q.Lock()
|
|
defer q.Unlock()
|
|
ids = make([]string, 0, len(q.queued))
|
|
for id := range q.queued {
|
|
ids = append(ids, id)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (q *settingsQueue) delete(id string) {
|
|
q.Lock()
|
|
defer q.Unlock()
|
|
delete(q.queued, id)
|
|
q.deleted[id] = struct{}{}
|
|
}
|
|
|
|
func (q *settingsQueue) queueIfDeleted(id string) {
|
|
q.Lock()
|
|
defer q.Unlock()
|
|
if _, exists := q.deleted[id]; exists {
|
|
delete(q.deleted, id)
|
|
q.queued[id] = struct{}{}
|
|
}
|
|
}
|
|
|
|
func (q *settingsQueue) exists(id string) bool {
|
|
q.Lock()
|
|
defer q.Unlock()
|
|
if _, exists := q.deleted[id]; exists {
|
|
return true
|
|
}
|
|
if _, exists := q.queued[id]; exists {
|
|
return true
|
|
}
|
|
return false
|
|
}
|