github.com/grzegorz-zur/bm@v0.0.0-20240312214136-6fc133e3e2c0/at.go (about)

     1  package main
     2  
     3  import (
     4  	"unicode"
     5  )
     6  
     7  // AtFileStart checks if cursor is at file start.
     8  func (file *File) AtFileStart() bool {
     9  	return file.location == 0
    10  }
    11  
    12  // AtFileEnd checks if cursor is at file end.
    13  func (file *File) AtFileEnd() bool {
    14  	return file.location == len(file.content)
    15  }
    16  
    17  // AtLineStart checks if cursor is at line start.
    18  func (file *File) AtLineStart() bool {
    19  	if file.AtFileStart() {
    20  		return true
    21  	}
    22  	last, _ := file.last()
    23  	return last == EOL
    24  }
    25  
    26  // AtLineEnd checks if cursor is at line end.
    27  func (file *File) AtLineEnd() bool {
    28  	if file.AtFileEnd() {
    29  		return true
    30  	}
    31  	current, _ := file.current()
    32  	return current == EOL
    33  }
    34  
    35  // AtWord checks if cursor is at word.
    36  func (file *File) AtWord() bool {
    37  	if file.AtFileStart() || file.AtFileEnd() {
    38  		return true
    39  	}
    40  	last, _ := file.last()
    41  	current, _ := file.current()
    42  	return !(unicode.IsLetter(last) || unicode.IsDigit(last)) &&
    43  		(unicode.IsLetter(current) || unicode.IsDigit(current))
    44  }
    45  
    46  // AtParagraph checks if cursor is at paragraph.
    47  func (file *File) AtParagraph() bool {
    48  	if file.AtFileStart() || file.AtFileEnd() {
    49  		return true
    50  	}
    51  	last, size := file.last()
    52  	location := file.location - size
    53  	if location == 0 && last == EOL {
    54  		return true
    55  	}
    56  	previous, _ := file.previous(location)
    57  	return previous == EOL && last == EOL
    58  }