Skip to content

Commit 157a116

Browse files
Add tableext.toset (#699)
Felt like tableext should have a `toset` util.
1 parent 79e3110 commit 157a116

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

lute/std/libs/tableext.luau

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@ function tableext.keys<K, V>(tbl: { [K]: V }): { K }
5656
return keys
5757
end
5858

59+
function tableext.toset<T>(tbl: { T }): { [T]: true }
60+
local set: { [T]: true } = {}
61+
for _, v in tbl do
62+
set[v] = true
63+
end
64+
return set
65+
end
66+
5967
function tableext.reverse<T>(tbl: { T }, inplace: boolean?)
6068
local new = if inplace then tbl else {}
6169
local i, j = 1, #tbl

tests/std/tableext.test.luau

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,39 @@ test.suite("TableExt", function(suite)
6262
assert.tableeq(b, { 4, 5, 6 })
6363
assert.tableeq(c, { 6, 5, 4 })
6464
end)
65+
66+
suite:case("toset", function(assert)
67+
local a = { 1, 2, 4, 2, 1 }
68+
local setA = tableext.toset(a)
69+
assert.eq(setA[1], true)
70+
assert.eq(setA[2], true)
71+
assert.eq(setA[3], nil)
72+
assert.eq(setA[4], true)
73+
assert.eq(setA[5], nil)
74+
75+
local setSize = #tableext.keys(setA)
76+
assert.eq(setSize, 3)
77+
assert.neq(setSize, #a)
78+
79+
-- Sanity check: sets created using an array of numbers don't break from having "gaps" between the number keys.
80+
81+
local foundKeys: { number } = {}
82+
for key, value in setA do
83+
assert.eq(value, true)
84+
table.insert(foundKeys, key)
85+
end
86+
assert.eq(#foundKeys, setSize)
87+
assert.eq(setA[foundKeys[1]], true)
88+
assert.eq(setA[foundKeys[2]], true)
89+
assert.eq(setA[foundKeys[3]], true)
90+
91+
local b = { "a", "b", "c", "a" }
92+
local setB = tableext.toset(b)
93+
assert.eq(setB["a"], true)
94+
assert.eq(setB["b"], true)
95+
assert.eq(setB["c"], true)
96+
assert.eq(setB["d"], nil)
97+
assert.eq(#tableext.keys(setB), 3)
98+
assert.neq(#tableext.keys(setB), #b)
99+
end)
65100
end)

0 commit comments

Comments
 (0)