move sort.Uniq to dedicated package #327
| @@ -3,8 +3,6 @@ package tracer // import "go.unistack.org/micro/v3/tracer" | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" |  | ||||||
| 	"sort" |  | ||||||
|  |  | ||||||
| 	"go.unistack.org/micro/v3/logger" | 	"go.unistack.org/micro/v3/logger" | ||||||
| ) | ) | ||||||
| @@ -70,37 +68,3 @@ type Span interface { | |||||||
| 	// SpanID returns span id | 	// SpanID returns span id | ||||||
| 	SpanID() string | 	SpanID() string | ||||||
| } | } | ||||||
|  |  | ||||||
| // sort labels alphabeticaly by label name |  | ||||||
| type byKey []interface{} |  | ||||||
|  |  | ||||||
| func (k byKey) Len() int           { return len(k) / 2 } |  | ||||||
| func (k byKey) Less(i, j int) bool { return fmt.Sprintf("%s", k[i*2]) < fmt.Sprintf("%s", k[j*2]) } |  | ||||||
| func (k byKey) Swap(i, j int) { |  | ||||||
| 	k[i*2], k[j*2] = k[j*2], k[i*2] |  | ||||||
| 	k[i*2+1], k[j*2+1] = k[j*2+1], k[i*2+1] |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func UniqLabels(labels []interface{}) []interface{} { |  | ||||||
| 	if len(labels)%2 == 1 { |  | ||||||
| 		labels = labels[:len(labels)-1] |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if len(labels) > 2 { |  | ||||||
| 		sort.Sort(byKey(labels)) |  | ||||||
|  |  | ||||||
| 		idx := 0 |  | ||||||
| 		for { |  | ||||||
| 			if labels[idx] == labels[idx+2] { |  | ||||||
| 				copy(labels[idx:], labels[idx+2:]) |  | ||||||
| 				labels = labels[:len(labels)-2] |  | ||||||
| 			} else { |  | ||||||
| 				idx += 2 |  | ||||||
| 			} |  | ||||||
| 			if idx+2 >= len(labels) { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return labels |  | ||||||
| } |  | ||||||
|   | |||||||
							
								
								
									
										40
									
								
								util/sort/sort.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								util/sort/sort.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | |||||||
|  | package sort | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"sort" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // sort labels alphabeticaly by label name | ||||||
|  | type byKey []interface{} | ||||||
|  |  | ||||||
|  | func (k byKey) Len() int           { return len(k) / 2 } | ||||||
|  | func (k byKey) Less(i, j int) bool { return fmt.Sprintf("%s", k[i*2]) < fmt.Sprintf("%s", k[j*2]) } | ||||||
|  | func (k byKey) Swap(i, j int) { | ||||||
|  | 	k[i*2], k[j*2] = k[j*2], k[i*2] | ||||||
|  | 	k[i*2+1], k[j*2+1] = k[j*2+1], k[i*2+1] | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func Uniq(labels []interface{}) []interface{} { | ||||||
|  | 	if len(labels)%2 == 1 { | ||||||
|  | 		labels = labels[:len(labels)-1] | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if len(labels) > 2 { | ||||||
|  | 		sort.Sort(byKey(labels)) | ||||||
|  |  | ||||||
|  | 		idx := 0 | ||||||
|  | 		for { | ||||||
|  | 			if labels[idx] == labels[idx+2] { | ||||||
|  | 				copy(labels[idx:], labels[idx+2:]) | ||||||
|  | 				labels = labels[:len(labels)-2] | ||||||
|  | 			} else { | ||||||
|  | 				idx += 2 | ||||||
|  | 			} | ||||||
|  | 			if idx+2 >= len(labels) { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return labels | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user