aboutsummaryrefslogtreecommitdiff
path: root/helix-core/src/position.rs
diff options
context:
space:
mode:
Diffstat (limited to 'helix-core/src/position.rs')
-rw-r--r--helix-core/src/position.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/helix-core/src/position.rs b/helix-core/src/position.rs
new file mode 100644
index 00000000..8bc48094
--- /dev/null
+++ b/helix-core/src/position.rs
@@ -0,0 +1,57 @@
+/// Represents a single point in a text buffer. Zero indexed.
+#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Position {
+ pub row: usize,
+ pub col: usize,
+}
+
+impl Position {
+ pub const fn new(row: usize, col: usize) -> Self {
+ Self { row, col }
+ }
+
+ pub const fn is_zero(self) -> bool {
+ self.row == 0 && self.col == 0
+ }
+
+ // TODO: generalize
+ pub fn traverse(self, text: &crate::Tendril) -> Self {
+ let Self { mut row, mut col } = self;
+ // TODO: there should be a better way here
+ for ch in text.chars() {
+ if ch == '\n' {
+ row += 1;
+ col = 0;
+ } else {
+ col += 1;
+ }
+ }
+ Self { row, col }
+ }
+}
+
+impl From<(usize, usize)> for Position {
+ fn from(tuple: (usize, usize)) -> Self {
+ Position {
+ row: tuple.0,
+ col: tuple.1,
+ }
+ }
+}
+
+impl Into<tree_sitter::Point> for Position {
+ fn into(self) -> tree_sitter::Point {
+ tree_sitter::Point::new(self.row, self.col)
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::*;
+
+ #[test]
+ fn test_ordering() {
+ // (0, 5) is less than (1, 0)
+ assert!(Position::new(0, 5) < Position::new(1, 0));
+ }
+}