mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Add generic set type (#21408)
This PR adds a generic set type to get rid of maps used as sets. Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		
							
								
								
									
										57
									
								
								modules/container/set.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								modules/container/set.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
// Copyright 2022 The Gitea Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user