mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09: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