feat: Sort nodes sensibly (#334)

This commit is contained in:
Sindre T. Strøm
2021-04-22 21:12:47 +02:00
committed by GitHub
parent 96d8e20bff
commit 027e523431
2 changed files with 89 additions and 1 deletions

View File

@@ -1,5 +1,5 @@
local M = {}
local uv = vim.loop -- or require("luv") ? i dont understand
local uv = vim.loop
local api = vim.api
function M.path_to_matching_str(path)
@@ -83,4 +83,74 @@ function M.find_node(nodes, fn)
return nil, i
end
---Create a shallow copy of a portion of a list.
---@param t table
---@param first integer First index, inclusive
---@param last integer Last index, inclusive
---@return table
function M.tbl_slice(t, first, last)
local slice = {}
for i = first, last or #t, 1 do
table.insert(slice, t[i])
end
return slice
end
local function merge(t, first, mid, last, comparator)
local n1 = mid - first + 1
local n2 = last - mid
local ls = M.tbl_slice(t, first, mid)
local rs = M.tbl_slice(t, mid + 1, last)
local i = 1
local j = 1
local k = first
while (i <= n1 and j <= n2) do
if comparator(ls[i], rs[j]) then
t[k] = ls[i]
i = i + 1
else
t[k] = rs[j]
j = j + 1
end
k = k + 1
end
while i <= n1 do
t[k] = ls[i]
i = i + 1
k = k + 1
end
while j <= n2 do
t[k] = rs[j]
j = j + 1
k = k + 1
end
end
local function split_merge(t, first, last, comparator)
if (last - first) < 1 then return end
local mid = math.floor((first + last) / 2)
split_merge(t, first, mid, comparator)
split_merge(t, mid + 1, last, comparator)
merge(t, first, mid, last, comparator)
end
---Perform a merge sort on a given list.
---@param t any[]
---@param comparator function|nil
function M.merge_sort(t, comparator)
if not comparator then
comparator = function (a, b)
return a < b
end
end
split_merge(t, 1, #t, comparator)
end
return M