| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package persistent |
| |
| import "golang.org/x/tools/gopls/internal/util/constraints" |
| |
| // Set is a collection of elements of type K. |
| // |
| // It uses immutable data structures internally, so that sets can be cloned in |
| // constant time. |
| // |
| // The zero value is a valid empty set. |
| type Set[K constraints.Ordered] struct { |
| impl *Map[K, struct{}] |
| } |
| |
| // Clone creates a copy of the receiver. |
| func (s *Set[K]) Clone() *Set[K] { |
| clone := new(Set[K]) |
| if s.impl != nil { |
| clone.impl = s.impl.Clone() |
| } |
| return clone |
| } |
| |
| // Destroy destroys the set. |
| // |
| // After Destroy, the Set should not be used again. |
| func (s *Set[K]) Destroy() { |
| if s.impl != nil { |
| s.impl.Destroy() |
| } |
| } |
| |
| // Contains reports whether s contains the given key. |
| func (s *Set[K]) Contains(key K) bool { |
| if s.impl == nil { |
| return false |
| } |
| _, ok := s.impl.Get(key) |
| return ok |
| } |
| |
| // Range calls f sequentially in ascending key order for all entries in the set. |
| func (s *Set[K]) Range(f func(key K)) { |
| if s.impl != nil { |
| s.impl.Range(func(key K, _ struct{}) { |
| f(key) |
| }) |
| } |
| } |
| |
| // AddAll adds all elements from other to the receiver set. |
| func (s *Set[K]) AddAll(other *Set[K]) { |
| if other.impl != nil { |
| if s.impl == nil { |
| s.impl = new(Map[K, struct{}]) |
| } |
| s.impl.SetAll(other.impl) |
| } |
| } |
| |
| // Add adds an element to the set. |
| func (s *Set[K]) Add(key K) { |
| if s.impl == nil { |
| s.impl = new(Map[K, struct{}]) |
| } |
| s.impl.Set(key, struct{}{}, nil) |
| } |
| |
| // Remove removes an element from the set. |
| func (s *Set[K]) Remove(key K) { |
| if s.impl != nil { |
| s.impl.Delete(key) |
| } |
| } |