summaryrefslogtreecommitdiff
path: root/xmake/core
diff options
context:
space:
mode:
authorruki <[email protected]>2021-11-14 23:25:19 +0800
committerruki <[email protected]>2021-11-14 23:25:19 +0800
commit474998e342c779f71ff5591ddc936304411fa46a (patch)
tree9efa50d7cf7fa857e0b163e6aa0335cb62a76745 /xmake/core
parent8ea70c741c233e8ddc1523cc8f2e91eb7baa2de7 (diff)
add table.find_xxx
Diffstat (limited to 'xmake/core')
-rw-r--r--xmake/core/base/table.lua64
1 files changed, 62 insertions, 2 deletions
diff --git a/xmake/core/base/table.lua b/xmake/core/base/table.lua
index 4f59e7a65..2bf776151 100644
--- a/xmake/core/base/table.lua
+++ b/xmake/core/base/table.lua
@@ -455,13 +455,13 @@ end
function table.remove_if(tbl, pred)
if table.is_array(tbl) then
for i = #tbl, 1, -1 do
- if pred(tbl, i, tbl[i]) then
+ if pred(i, tbl[i]) then
table.remove(tbl, i)
end
end
else
for k, v in pairs(tbl) do
- if pred(tbl, k, v) then
+ if pred(k, v) then
tbl[k] = nil
end
end
@@ -469,5 +469,65 @@ function table.remove_if(tbl, pred)
return tbl
end
+-- return indices or keys for the given value
+function table.find(tbl, value)
+ local result
+ if table.is_array(tbl) then
+ for i, v in ipairs(tbl) do
+ if v == value then
+ result = result or {}
+ table.insert(result, i)
+ end
+ end
+ else
+ for k, v in pairs(tbl) do
+ if v == value then
+ result = result or {}
+ table.insert(result, k)
+ end
+ end
+ end
+ return result
+end
+
+-- return indices or keys if predicate is matched
+function table.find_if(tbl, pred)
+ local result
+ if table.is_array(tbl) then
+ for i, v in ipairs(tbl) do
+ if pred(i, v) then
+ result = result or {}
+ table.insert(result, i)
+ end
+ end
+ else
+ for k, v in pairs(tbl) do
+ if pred(k, v) then
+ result = result or {}
+ table.insert(result, k)
+ end
+ end
+ end
+ return result
+end
+
+-- return first index for the given value
+function table.find_first(tbl, value)
+ for i, v in ipairs(tbl) do
+ if v == value then
+ return i
+ end
+ end
+end
+
+-- return first index if predicate is matched
+function table.find_first_if(tbl, pred)
+ for i, v in ipairs(tbl) do
+ if pred(i, v) then
+ return i
+ end
+ end
+end
+
-- return module: table
return table