Browse Source

x/model: simplify Name.CompareFold

Blake Mizerany 1 năm trước cách đây
mục cha
commit
c84f9b07b0
1 tập tin đã thay đổi với 8 bổ sung18 xóa
  1. 8 18
      x/model/name.go

+ 8 - 18
x/model/name.go

@@ -349,30 +349,20 @@ func (r Name) EqualFold(o Name) bool {
 //
 // For simple equality checks, use [Name.EqualFold].
 func (r Name) CompareFold(o Name) int {
-	for i := range r.parts {
-		if n := compareFold(r.parts[i], o.parts[i]); n != 0 {
-			return n
-		}
-	}
-	return 0
+	return slices.CompareFunc(r.parts[:], o.parts[:], compareFold)
 }
 
 func compareFold(a, b string) int {
-	// fast-path for unequal lengths
-	for i := 0; i < len(a) && i < len(b); i++ {
-		ca, cb := downcase(a[i]), downcase(b[i])
-		if n := cmp.Compare(ca, cb); n != 0 {
-			return n
-		}
-	}
-	return cmp.Compare(len(a), len(b))
+	return slices.CompareFunc([]rune(a), []rune(b), func(a, b rune) int {
+		return cmp.Compare(downcase(a), downcase(b))
+	})
 }
 
-func downcase(c byte) byte {
-	if c >= 'A' && c <= 'Z' {
-		return c + 'a' - 'A'
+func downcase(r rune) rune {
+	if r >= 'A' && r <= 'Z' {
+		return r - 'A' + 'a'
 	}
-	return c
+	return r
 }
 
 // TODO(bmizerany): driver.Value? (MarshalText etc should be enough)