github.com/jmigpin/editor@v1.6.0/util/iout/iorw/readrune.go (about)

     1  package iorw
     2  
     3  import (
     4  	"io"
     5  	"unicode/utf8"
     6  )
     7  
     8  //type RuneReaderAt interface {
     9  //	ReadRuneAt(i int) (r rune, size int, err error)
    10  //	ReadLastRuneAt(i int) (r rune, size int, err error)
    11  //}
    12  
    13  func ReadRuneAt(r ReaderAt, i int) (rune, int, error) {
    14  	n := utf8.UTFMax
    15  	b, err := r.ReadFastAt(i, n)
    16  	if err != nil {
    17  		return 0, 0, err
    18  	}
    19  	ru, size := utf8.DecodeRune(b)
    20  	if size == 0 {
    21  		return 0, 0, io.EOF
    22  	}
    23  	return ru, size, nil
    24  }
    25  
    26  func ReadLastRuneAt(r ReaderAt, i int) (rune, int, error) {
    27  	if i == 0 {
    28  		return 0, 0, io.EOF
    29  	}
    30  
    31  	// handle left limit
    32  	n := utf8.UTFMax
    33  	min := r.Min()
    34  	if i >= min && i-n < min {
    35  		n = i - min
    36  	}
    37  
    38  	b, err := r.ReadFastAt(i-n, n)
    39  	if err != nil {
    40  		return 0, 0, err
    41  	}
    42  	ru, size := utf8.DecodeLastRune(b)
    43  	if size == 0 {
    44  		return 0, 0, io.EOF
    45  	}
    46  	return ru, size, nil
    47  }