blob: 567680c793a7518255413d7ba415c61483da9c39 [file] [log] [blame]
Serge Bazanskicc25bdf2018-10-25 14:02:58 +02001// +build go1.9
2
3package swag
4
5import (
6 "sort"
7 "sync"
8)
9
10// indexOfInitialisms is a thread-safe implementation of the sorted index of initialisms.
11// Since go1.9, this may be implemented with sync.Map.
12type indexOfInitialisms struct {
13 sortMutex *sync.Mutex
14 index *sync.Map
15}
16
17func newIndexOfInitialisms() *indexOfInitialisms {
18 return &indexOfInitialisms{
19 sortMutex: new(sync.Mutex),
20 index: new(sync.Map),
21 }
22}
23
24func (m *indexOfInitialisms) load(initial map[string]bool) *indexOfInitialisms {
25 m.sortMutex.Lock()
26 defer m.sortMutex.Unlock()
27 for k, v := range initial {
28 m.index.Store(k, v)
29 }
30 return m
31}
32
33func (m *indexOfInitialisms) isInitialism(key string) bool {
34 _, ok := m.index.Load(key)
35 return ok
36}
37
38func (m *indexOfInitialisms) add(key string) *indexOfInitialisms {
39 m.index.Store(key, true)
40 return m
41}
42
43func (m *indexOfInitialisms) sorted() (result []string) {
44 m.sortMutex.Lock()
45 defer m.sortMutex.Unlock()
46 m.index.Range(func(key, value interface{}) bool {
47 k := key.(string)
48 result = append(result, k)
49 return true
50 })
51 sort.Sort(sort.Reverse(byLength(result)))
52 return
53}