github.com/gopherjs/gopherjs@v1.19.0-beta1.0.20240506212314-27071a8796e4/compiler/natives/src/unicode/unicode.go (about)

     1  //go:build js
     2  // +build js
     3  
     4  package unicode
     5  
     6  func to(_case int, r rune, caseRange []CaseRange) (mappedRune rune, foundMapping bool) {
     7  	if _case < 0 || MaxCase <= _case {
     8  		return ReplacementChar, false
     9  	}
    10  	lo := 0
    11  	hi := len(caseRange)
    12  	for lo < hi {
    13  		m := lo + (hi-lo)/2
    14  		cr := &caseRange[m] // performance critical for GopherJS: get address here instead of copying the CaseRange
    15  		if rune(cr.Lo) <= r && r <= rune(cr.Hi) {
    16  			delta := rune(cr.Delta[_case])
    17  			if delta > MaxRune {
    18  				return rune(cr.Lo) + ((r-rune(cr.Lo))&^1 | rune(_case&1)), true
    19  			}
    20  			return r + delta, true
    21  		}
    22  		if r < rune(cr.Lo) {
    23  			hi = m
    24  		} else {
    25  			lo = m + 1
    26  		}
    27  	}
    28  	return r, false
    29  }