Neovim sign gutter, designed to be mostly VCS agnostic
1local M = {}
2
3local intervals = require "vclib.intervals"
4
5---@param hunk Hunk
6---@return integer The visual size of the hunk in lines.
7function M.hunk_visual_start(hunk)
8 return math.max(1, hunk.plus_start)
9end
10
11---@param hunk Hunk
12---@return integer The visual size of the hunk in lines.
13function M.hunk_visual_size(hunk)
14 return math.max(1, hunk.plus_count)
15end
16
17---@param hunk Hunk
18---@return Interval
19function M.to_interval(hunk)
20 return {
21 l = M.hunk_visual_start(hunk),
22 r = M.hunk_visual_start(hunk) + M.hunk_visual_size(hunk),
23 data = hunk,
24 }
25end
26
27--- Get the `count`th previous hunk.
28---@param lnum integer
29---@param hunks Hunk[]
30---@param count integer
31---@return Hunk?
32function M.prev_hunk(lnum, hunks, count)
33 return intervals.from_list(hunks, M.to_interval):find(lnum, -count)
34end
35
36--- Get the `count`th next hunk.
37---@param lnum integer
38---@param hunks Hunk[]
39---@param count integer
40---@return Hunk?
41function M.next_hunk(lnum, hunks, count)
42 return intervals.from_list(hunks, M.to_interval):find(lnum, count)
43end
44
45--- Get the current hunk for a given line number, if any.
46---@param lnum integer
47---@param hunks Hunk[]
48---@return Hunk?
49function M.cur_hunk(lnum, hunks)
50 return intervals.from_list(hunks, M.to_interval):find(lnum, 0)
51end
52
53return M