From f28e506d40991c122d5511e2979feb844be22009 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sun, 15 Oct 2017 12:42:56 +0100 Subject: [PATCH] [Minor] Add spairs function to lua lib --- lualib/lua_util.lua | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/lualib/lua_util.lua b/lualib/lua_util.lua index f048432bf..a160bd85e 100644 --- a/lualib/lua_util.lua +++ b/lualib/lua_util.lua @@ -165,4 +165,38 @@ exports.unpack = function(t) return unpack_function(t) end +-- Sorted iteration: +-- for k,v in spairs(t) do ... end +-- +-- or with custom comparison: +-- for k, v in spairs(t, function(t, a, b) return t[a] < t[b] end) +-- +-- optional limit is also available (e.g. return top X elements) +local function spairs(t, order, lim) + -- collect the keys + local keys = {} + for k in pairs(t) do keys[#keys+1] = k end + + -- if order function given, sort by it by passing the table and keys a, b, + -- otherwise just sort the keys + if order then + table.sort(keys, function(a,b) return order(t, a, b) end) + else + table.sort(keys) + end + + -- return the iterator function + local i = 0 + return function() + i = i + 1 + if not lim or i <= lim then + if keys[i] then + return keys[i], t[keys[i]] + end + end + end +end + +exports.spairs = spairs + return exports -- 2.39.5