Serge Bazanski | cc25bdf | 2018-10-25 14:02:58 +0200 | [diff] [blame] | 1 | // +build go1.9 |
| 2 | |
| 3 | package swag |
| 4 | |
| 5 | import ( |
| 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. |
| 12 | type indexOfInitialisms struct { |
| 13 | sortMutex *sync.Mutex |
| 14 | index *sync.Map |
| 15 | } |
| 16 | |
| 17 | func newIndexOfInitialisms() *indexOfInitialisms { |
| 18 | return &indexOfInitialisms{ |
| 19 | sortMutex: new(sync.Mutex), |
| 20 | index: new(sync.Map), |
| 21 | } |
| 22 | } |
| 23 | |
| 24 | func (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 | |
| 33 | func (m *indexOfInitialisms) isInitialism(key string) bool { |
| 34 | _, ok := m.index.Load(key) |
| 35 | return ok |
| 36 | } |
| 37 | |
| 38 | func (m *indexOfInitialisms) add(key string) *indexOfInitialisms { |
| 39 | m.index.Store(key, true) |
| 40 | return m |
| 41 | } |
| 42 | |
| 43 | func (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 | } |