package main

import (
	"fmt"
	"unicode"
	"unicode/utf8"
)

func main() {

	// ExampleBytesSlice()
	// ExampleRune()
	ExampleUnicode()
}

func ExampleBytesSlice() {
	// Используем строку, которую конвертируем в []byte,
	// чтобы показать, как выглядит байтовый срез.
	bs := []byte("Это байтовый срез")

	// Печатаем байтовый срез.
	fmt.Printf("Так байтовый срез выглядит внутри: %v\n", bs)

	// Демонстрируем, что быйтовый срез можно изменять,
	// а затем выводи его в виде строки.
	for i := range bs {
		// Для четных байтов увеличиваем на 1, для нечетных уменьшаем на 1
		if bs[i]%2 == 0 {
			bs[i] = bs[i] + 1
		} else {
			bs[i] = bs[i] - 1
		}
	}

	// Печатаем измененный байтовый срез в виде строки.
	fmt.Printf("Измененный байтовый сред в виде строки: %s", bs)
}

func ExampleRune() {
	// Преобразуем строку в срез рун
	rs := []rune("Это срез рун")

	// Итерируемся по срезу рун и заменяем символ 'р' на '*'
	for i := range rs {
		// fmt.Println(rs[i])
		if rs[i] == 'р' {
			rs[i] = '*'
		}
	}

	// Выводит измененный срез в виде строки
	fmt.Printf("Измененный срез в виде строки: %s\n", string(rs))
}

func ExampleUnicode() {
	// функции ниже принимают на вход тип rune

	// проверка символа на цифру
	fmt.Println(unicode.IsDigit('1')) // true
	// проверка символа на букву
	fmt.Println(unicode.IsLetter('a')) // true
	// проверка символа на нижний регистр
	fmt.Println(unicode.IsLower('A')) // false
	// проверка символа на верхний регистр
	fmt.Println(unicode.IsUpper('A')) // true
	// проверка символа на пробел
	// пробел это не только ' ', но и:
	//  '\t', '\n', '\v', '\f', '\r' - подробнее читайте в документации
	fmt.Println(unicode.IsSpace('\t')) // true

	// С помощью функции Is можно проверять на кастомный RangeTable:
	// например, проверка на латиницу:
	fmt.Println(unicode.Is(unicode.Latin, 'ы')) // false

	// функции преобразований
	fmt.Println(string(unicode.ToLower('F'))) // f
	fmt.Println(string(unicode.ToUpper('f'))) // F

	var en = "english"
	var ru = "русский"
	fmt.Println(len(en), len(ru))
	fmt.Println(utf8.RuneCountInString(en), utf8.RuneCountInString(ru))
}
