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 }