diff --git a/src/lib/buffer/position.v b/src/lib/buffer/position.v index 68f3fd29..2200775a 100644 --- a/src/lib/buffer/position.v +++ b/src/lib/buffer/position.v @@ -37,6 +37,13 @@ pub fn (p Position) add(d Distance) Position { } } +pub fn (a Position) distance(b Position) Distance { + return Distance{ + lines: if a < b { b.line - a.line } else { a.line - b.line } + offset: if a < b { b.offset - a.offset } else { a.offset - b.offset } + } +} + pub fn (mut p Position) apply(d Distance) { p = p.add(d) } diff --git a/src/lib/buffer/position_test.v b/src/lib/buffer/position_test.v index 3884a8ca..6992dc14 100644 --- a/src/lib/buffer/position_test.v +++ b/src/lib/buffer/position_test.v @@ -144,3 +144,41 @@ fn test_compare_works_when_lines_and_offsets_are_not_equal() { assert position_a != position_b } + +fn test_distance_between_a_lines_larger() { + position_a := Position{ + line: 11 + offset: 3 + } + position_b := Position{ + line: 8 + offset: 3 + } + + assert position_a.distance(position_b) == Distance{ + lines: 3 + } + assert position_b.distance(position_a) == Distance{ + lines: 3 + } +} + +fn test_distance_between_b_lines_larger() { + position_a := Position{ + line: 11 + offset: 3 + } + position_b := Position{ + line: 85 + offset: 9 + } + + assert position_a.distance(position_b) == Distance{ + lines: 74 + offset: 6 + } + assert position_b.distance(position_a) == Distance{ + lines: 74 + offset: 6 + } +}