From c84f9b07b09e08b369d4061536f3d6ff9914353b Mon Sep 17 00:00:00 2001 From: Blake Mizerany Date: Sat, 6 Apr 2024 16:08:11 -0700 Subject: [PATCH] x/model: simplify Name.CompareFold --- x/model/name.go | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/x/model/name.go b/x/model/name.go index 685574d96..de5a91856 100644 --- a/x/model/name.go +++ b/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)