Last active
May 4, 2023 19:45
-
-
Save Hadaward/da9ef08437e614a3d6a134bf0b48152f to your computer and use it in GitHub Desktop.
This gist contains useful functions for lua tables inspired directly from the JavaScript documentation.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function table.every(self, predicate) | |
for key, value in next, self do | |
if not predicate(value, key) then | |
return false | |
end | |
end | |
return true | |
end | |
function table.map(self, predicate, ordered) | |
local t = {} | |
for k, v in next, self do | |
local value = predicate(v, k) | |
if not ordered then | |
t[k] = value | |
else | |
table.insert(t, value) | |
end | |
end | |
return t | |
end | |
function table.filter(self, predicate, ordered) | |
local t = {} | |
for key, value in next, self do | |
if predicate(value, key) then | |
if not ordered then | |
t[key] = value | |
else | |
table.insert(t, value) | |
end | |
end | |
end | |
return t | |
end | |
function table.extend(self, t, ordered) | |
if ordered then | |
return { table.unpack(self), table.unpack(t) } | |
else | |
local newT = {} | |
for k, v in next, self do | |
newT[k] = v | |
end | |
for k, v in next, t do | |
newT[k] = v | |
end | |
return newT | |
end | |
end | |
function table.find(self, predicate) | |
for key, value in next, self do | |
if predicate(value, key) then | |
return value | |
end | |
end | |
return nil | |
end | |
function table.contains(self, value) | |
for _, v in next, self do | |
if v == value then | |
return true | |
end | |
end | |
return false | |
end | |
function table.hasKey(self, key) | |
return self[key] ~= nil | |
end | |
function table.length(self) | |
local mt = getmetatable(self) | |
if mt ~= nil and mt.__len ~= nil then | |
return mt:__len() | |
end | |
local count = 0 | |
for _, _ in next, self do | |
count = count + 1 | |
end | |
return count | |
end | |
function table.freeze(self) | |
return setmetatable({}, { | |
__index = function(_, key) | |
return self[key] | |
end, | |
__newindex = function(_, key, value) | |
error(("Cannot set property '%s' to '%s', table is frozen"):format(key, tostring(value))) | |
end, | |
__len = function() | |
return table.length(self) | |
end | |
}) | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment