| // +build go1.9 |
| |
| package swag |
| |
| import ( |
| "sort" |
| "sync" |
| ) |
| |
| // indexOfInitialisms is a thread-safe implementation of the sorted index of initialisms. |
| // Since go1.9, this may be implemented with sync.Map. |
| type indexOfInitialisms struct { |
| sortMutex *sync.Mutex |
| index *sync.Map |
| } |
| |
| func newIndexOfInitialisms() *indexOfInitialisms { |
| return &indexOfInitialisms{ |
| sortMutex: new(sync.Mutex), |
| index: new(sync.Map), |
| } |
| } |
| |
| func (m *indexOfInitialisms) load(initial map[string]bool) *indexOfInitialisms { |
| m.sortMutex.Lock() |
| defer m.sortMutex.Unlock() |
| for k, v := range initial { |
| m.index.Store(k, v) |
| } |
| return m |
| } |
| |
| func (m *indexOfInitialisms) isInitialism(key string) bool { |
| _, ok := m.index.Load(key) |
| return ok |
| } |
| |
| func (m *indexOfInitialisms) add(key string) *indexOfInitialisms { |
| m.index.Store(key, true) |
| return m |
| } |
| |
| func (m *indexOfInitialisms) sorted() (result []string) { |
| m.sortMutex.Lock() |
| defer m.sortMutex.Unlock() |
| m.index.Range(func(key, value interface{}) bool { |
| k := key.(string) |
| result = append(result, k) |
| return true |
| }) |
| sort.Sort(sort.Reverse(byLength(result))) |
| return |
| } |