local Variable = require("astal").Variable local lib lib = { --- get path to file in astal source src = function(path) local str = debug.getinfo(2, "S").source:sub(2) local src = str:match("(.*/)") or str:match("(.*\\)") or "./" return src .. path end, --- map an array with a function map = function(array, func) local new_arr = {} for i, v in ipairs(array) do new_arr[i] = func(v, i) end return new_arr end, --- filter an array with a function filter = function(array, func) local new_arr = {} for i, v in ipairs(array) do if func(v, i) then new_arr[i] = v end end return new_arr end, --- sort an array of object on a key sort = function(array, func) -- default func to sort on attr 'id' if not func then func = 'id' end -- make function if just provided with attribute if type(func) ~= 'function' then local key = func func = function(a, b) return a[key] < b[key] end end -- copy to new array local new_arr = {} for i, v in ipairs(array) do new_arr[i] = v end -- sort and return table.sort(new_arr, func) return new_arr end, --- returns length of table count = function(array) if not array then return 0 else return #array end end, --- returns if a table is empty empty = function(array) return lib.count(array) == 0 end, --- negates value neg = function(val) return not val end, } return lib