1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- // Copyright 2022 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package container
-
- type Set[T comparable] map[T]struct{}
-
- // SetOf creates a set and adds the specified elements to it.
- func SetOf[T comparable](values ...T) Set[T] {
- s := make(Set[T], len(values))
- s.AddMultiple(values...)
- return s
- }
-
- // Add adds the specified element to a set.
- // Returns true if the element is added; false if the element is already present.
- func (s Set[T]) Add(value T) bool {
- if _, has := s[value]; !has {
- s[value] = struct{}{}
- return true
- }
- return false
- }
-
- // AddMultiple adds the specified elements to a set.
- func (s Set[T]) AddMultiple(values ...T) {
- for _, value := range values {
- s.Add(value)
- }
- }
-
- // Contains determines whether a set contains the specified element.
- // Returns true if the set contains the specified element; otherwise, false.
- func (s Set[T]) Contains(value T) bool {
- _, has := s[value]
- return has
- }
-
- // Remove removes the specified element.
- // Returns true if the element is successfully found and removed; otherwise, false.
- func (s Set[T]) Remove(value T) bool {
- if _, has := s[value]; has {
- delete(s, value)
- return true
- }
- return false
- }
-
- // Values gets a list of all elements in the set.
- func (s Set[T]) Values() []T {
- keys := make([]T, 0, len(s))
- for k := range s {
- keys = append(keys, k)
- }
- return keys
- }
|