// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build goexperiment.jsonv2

package json

import (
	
	
)

// foldName returns a folded string such that foldName(x) == foldName(y)
// is similar to strings.EqualFold(x, y), but ignores underscore and dashes.
// This allows foldName to match common naming conventions.
func foldName( []byte) []byte {
	// This is inlinable to take advantage of "function outlining".
	// See https://blog.filippo.io/efficient-go-apis-with-the-inliner/
	var  [32]byte // large enough for most JSON names
	return appendFoldedName([:0], )
}
func appendFoldedName(,  []byte) []byte {
	for  := 0;  < len(); {
		// Handle single-byte ASCII.
		if  := [];  < utf8.RuneSelf {
			if  != '_' &&  != '-' {
				if 'a' <=  &&  <= 'z' {
					 -= 'a' - 'A'
				}
				 = append(, )
			}
			++
			continue
		}
		// Handle multi-byte Unicode.
		,  := utf8.DecodeRune([:])
		 = utf8.AppendRune(, foldRune())
		 += 
	}
	return 
}

// foldRune is a variation on unicode.SimpleFold that returns the same rune
// for all runes in the same fold set.
//
// Invariant:
//
//	foldRune(x) == foldRune(y) ⇔ strings.EqualFold(string(x), string(y))
func foldRune( rune) rune {
	for {
		 := unicode.SimpleFold()
		if  <=  {
			return  // smallest character in the fold set
		}
		 = 
	}
}