You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.6 KiB
71 lines
2.6 KiB
local _, S = ...
|
|
local pairs, ipairs, string, type, time = pairs, ipairs, string, type, time
|
|
|
|
S.Sort = {}
|
|
|
|
-- Sorts two entries by their supplied values, if they are identical then they are sorted by their second values
|
|
-- If inverse is 'true' then the keys are sorted ascending instead of descending
|
|
function S.Sort.ByTwoValues(inverse, value11, value21, value12, value22, entry1, entry2, DefaultFunc)
|
|
if not value11 then
|
|
return false
|
|
elseif not value21 then
|
|
return true
|
|
end
|
|
if value11 == value21 then
|
|
if not value12 then
|
|
return false
|
|
elseif not value22 then
|
|
return true
|
|
end
|
|
if value12 == value22 then
|
|
return DefaultFunc(entry1, entry2) -- Both are identical, resort to a default sorting method
|
|
end
|
|
if not inverse then
|
|
return value12 < value22
|
|
else
|
|
return value12 > value22
|
|
end
|
|
end
|
|
if not inverse then
|
|
return value11 < value21
|
|
else
|
|
return value11 > value21
|
|
end
|
|
end
|
|
|
|
-- Sorts two entries by their 'key1', if they are identical then they are sorted by their 'key2'
|
|
-- If inverse is 'true' then the keys are sorted ascending instead of descending
|
|
function S.Sort.ByTwoKeys(inverse, entry1, entry2, key1, key2, DefaultFunc)
|
|
return S.Sort.ByTwoValues(inverse, entry1[key1], entry2[key1], entry1[key2], entry2[key2], entry1, entry2, DefaultFunc)
|
|
end
|
|
|
|
-- Sorts two entries by two supplied values, resorting to DefaultSort if they are identical
|
|
-- If inverse is 'true' then the keys are sorted ascending instead of descending
|
|
function S.Sort.ByValue(inverse, value1, value2, entry1, entry2, DefaultFunc)
|
|
-- Put items with a nil value last
|
|
if not value1 then
|
|
if not value2 then
|
|
return DefaultFunc(entry1, entry2) -- Both are nil, resort to a default sorting method
|
|
else
|
|
return false -- Only value1 is nil
|
|
end
|
|
elseif not value2 then
|
|
return true -- Only value2 is nil
|
|
end
|
|
-- Values are identical, resort to a default sorting method
|
|
if value1 == value2 then
|
|
return DefaultFunc(entry1, entry2)
|
|
end
|
|
-- Sort by the value
|
|
if not inverse then
|
|
return value1 < value2
|
|
else
|
|
return value1 > value2
|
|
end
|
|
end
|
|
|
|
-- Sorts two entries by their 'key', resorting to DefaultSort if they are identical
|
|
-- If inverse is 'true' then the keys are sorted ascending instead of descending
|
|
function S.Sort.ByKey(inverse, entry1, entry2, key, DefaultFunc)
|
|
return S.Sort.ByValue(inverse, entry1[key], entry2[key], entry1, entry2, DefaultFunc)
|
|
end
|