go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/stringutil/runesets.go (about)

     1  /*
     2  
     3  Copyright (c) 2023 - Present. Will Charczuk. All rights reserved.
     4  Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository.
     5  
     6  */
     7  
     8  package stringutil
     9  
    10  import (
    11  	"math/rand"
    12  	"time"
    13  )
    14  
    15  var (
    16  	// LowerLetters is a runset of lowercase letters.
    17  	LowerLetters Runeset = []rune(`abcdefghijklmnopqrstuvwxyz`)
    18  
    19  	// UpperLetters is a runset of uppercase letters.
    20  	UpperLetters Runeset = []rune(`ABCDEFGHIJKLMNOPQRSTUVWXYZ`)
    21  
    22  	// Letters is a runset of both lower and uppercase letters.
    23  	Letters = append(LowerLetters, UpperLetters...)
    24  
    25  	// Numbers is a runset of numeric characters.
    26  	Numbers Runeset = []rune(`0123456789`)
    27  
    28  	// LettersAndNumbers is a runset of letters and numeric characters.
    29  	LettersAndNumbers = append(Letters, Numbers...)
    30  
    31  	// Symbols is a runset of symbol characters.
    32  	Symbols Runeset = []rune(`!@#$%^&*()_+-=[]{}\|:;`)
    33  
    34  	// LettersNumbersAndSymbols is a runset of letters, numbers and symbols.
    35  	LettersNumbersAndSymbols = append(LettersAndNumbers, Symbols...)
    36  )
    37  
    38  // Runeset is a set of runes
    39  type Runeset []rune
    40  
    41  // Len implements part of sorter.
    42  func (rs Runeset) Len() int {
    43  	return len(rs)
    44  }
    45  
    46  // Swap implements part of sorter.
    47  func (rs Runeset) Swap(i, j int) {
    48  	rs[i], rs[j] = rs[j], rs[i]
    49  }
    50  
    51  // Less implements part of sorter.
    52  func (rs Runeset) Less(i, j int) bool {
    53  	return uint16(rs[i]) < uint16(rs[j])
    54  }
    55  
    56  var (
    57  	_provider = rand.New(rand.NewSource(time.Now().UnixNano()))
    58  )
    59  
    60  // Random returns a random selection of runes from the set.
    61  func (rs Runeset) Random(length int) string {
    62  	runes := make([]rune, length)
    63  	for index := range runes {
    64  		runes[index] = rs[_provider.Intn(len(rs)-1)]
    65  	}
    66  	return string(runes)
    67  }
    68  
    69  // RandomProvider returns a random selection of runes from the set.
    70  func (rs Runeset) RandomProvider(provider *rand.Rand, length int) string {
    71  	runes := make([]rune, length)
    72  	for index := range runes {
    73  		runes[index] = rs[provider.Intn(len(rs)-1)]
    74  	}
    75  	return string(runes)
    76  }