diff options
| author | mo khan <mo@mokhan.ca> | 2025-05-14 13:18:54 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-05-14 13:18:54 -0600 |
| commit | 4b2d609a0efcc1d9b2f1a08f954d067ad1d9cd1e (patch) | |
| tree | 0afacf9217b0569130da6b97d4197331681bf119 /vendor/github.com/playwright-community/playwright-go/internal/safe/map.go | |
| parent | ab373d1fe698cd3f53258c09bc8515d88a6d0b9e (diff) | |
test: use playwright to test out an OIDC login
Diffstat (limited to 'vendor/github.com/playwright-community/playwright-go/internal/safe/map.go')
| -rw-r--r-- | vendor/github.com/playwright-community/playwright-go/internal/safe/map.go | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/vendor/github.com/playwright-community/playwright-go/internal/safe/map.go b/vendor/github.com/playwright-community/playwright-go/internal/safe/map.go new file mode 100644 index 0000000..93a8800 --- /dev/null +++ b/vendor/github.com/playwright-community/playwright-go/internal/safe/map.go @@ -0,0 +1,90 @@ +package safe + +import ( + "maps" + "sync" +) + +// SyncMap is a thread-safe map +type SyncMap[K comparable, V any] struct { + sync.RWMutex + m map[K]V +} + +// NewSyncMap creates a new thread-safe map +func NewSyncMap[K comparable, V any]() *SyncMap[K, V] { + return &SyncMap[K, V]{ + m: make(map[K]V), + } +} + +func (m *SyncMap[K, V]) Store(k K, v V) { + m.Lock() + defer m.Unlock() + m.m[k] = v +} + +func (m *SyncMap[K, V]) Load(k K) (v V, ok bool) { + m.RLock() + defer m.RUnlock() + v, ok = m.m[k] + return +} + +// LoadOrStore returns the existing value for the key if present. Otherwise, it stores and returns the given value. +func (m *SyncMap[K, V]) LoadOrStore(k K, v V) (actual V, loaded bool) { + m.Lock() + defer m.Unlock() + actual, loaded = m.m[k] + if loaded { + return + } + m.m[k] = v + return v, false +} + +// LoadAndDelete deletes the value for a key, and returns the previous value if any. +func (m *SyncMap[K, V]) LoadAndDelete(k K) (v V, loaded bool) { + m.Lock() + defer m.Unlock() + v, loaded = m.m[k] + if loaded { + delete(m.m, k) + } + return +} + +func (m *SyncMap[K, V]) Delete(k K) { + m.Lock() + defer m.Unlock() + delete(m.m, k) +} + +func (m *SyncMap[K, V]) Clear() { + m.Lock() + defer m.Unlock() + clear(m.m) +} + +func (m *SyncMap[K, V]) Len() int { + m.RLock() + defer m.RUnlock() + return len(m.m) +} + +func (m *SyncMap[K, V]) Clone() map[K]V { + m.RLock() + defer m.RUnlock() + return maps.Clone(m.m) +} + +func (m *SyncMap[K, V]) Range(f func(k K, v V) bool) { + m.RLock() + defer m.RUnlock() + + for k, v := range m.m { + if !f(k, v) { + break + } + } +} |
