Skip to content

Commit 09d81b0

Browse files
Add Set.removeValues function (#23)
1 parent cd09dc7 commit 09d81b0

File tree

5 files changed

+99
-0
lines changed

5 files changed

+99
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Changelog
22

3+
- add `Set.removeValues` ([#23](https://github.com/seaofvoices/luau-disk/pull/23))
34
- add `Set.filter` ([#22](https://github.com/seaofvoices/luau-disk/pull/22))
45
- add `Set.count` and `Set.isEmpty` ([#21](https://github.com/seaofvoices/luau-disk/pull/21))
56
- add `Set.map` ([#20](https://github.com/seaofvoices/luau-disk/pull/20))

docs/Set.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ If you are not familiar with this kind of utility functions, don't get overwhelm
1313
- [count](#count)
1414
- [fromArray](#fromarray)
1515
- [merge](#merge)
16+
- [removeValues](#removeValues)
1617

1718
## count
1819

@@ -37,6 +38,8 @@ end)
3738
-- result is { 2 = true, 4 = true, 6 = true }
3839
```
3940

41+
*Related [removeValues](#removevalues)*
42+
4043
## fromArray
4144

4245
Creates a new Set from an array of values.
@@ -81,3 +84,17 @@ local result = Set.merge(set1, set2)
8184
```
8285

8386
The function will skip `nil` values when merging.
87+
88+
## removeValues
89+
90+
Returns a new set with all the given values removed.
91+
92+
```lua
93+
local set = Set.fromArray({ "a", "b", "c" })
94+
local result = Set.removeValues(set, "b")
95+
-- result is { a = true, c = true }
96+
```
97+
98+
**Note:** This function returns the same set if no values are given or if the values to remove are not in the set.
99+
100+
*Related [filter](#filter)*

src/init.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ local Disk = {
7373
isEmpty = require('./set/isEmpty'),
7474
map = require('./set/map'),
7575
merge = require('./set/merge'),
76+
removeValues = require('./set/removeValues'),
7677
},
7778
None = require('./None'),
7879
WeakMap = require('./WeakMap'),
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
local jestGlobals = require('@pkg/@jsdotlua/jest-globals')
2+
3+
local fromArray = require('../fromArray')
4+
local removeValues = require('../removeValues')
5+
6+
local expect = jestGlobals.expect
7+
local it = jestGlobals.it
8+
9+
it('removes single value from set', function()
10+
local set = fromArray({ 1, 2, 3, 4, 5 })
11+
local result = removeValues(set, 3)
12+
13+
expect(result).toEqual(fromArray({ 1, 2, 4, 5 }))
14+
end)
15+
16+
it('removes multiple values from set', function()
17+
local set = fromArray({ 1, 2, 3, 4, 5 })
18+
local result = removeValues(set, 2, 4)
19+
20+
expect(result).toEqual(fromArray({ 1, 3, 5 }))
21+
end)
22+
23+
it('returns original set when no values to remove', function()
24+
local set = fromArray({ 1, 2, 3, 4, 5 })
25+
local result = removeValues(set)
26+
27+
expect(result).toEqual(fromArray({ 1, 2, 3, 4, 5 }))
28+
end)
29+
30+
it('returns original set when set is empty', function()
31+
local set = fromArray({})
32+
local result = removeValues(set, 1, 2, 3)
33+
34+
expect(result).toBe(set)
35+
end)
36+
37+
it('returns original set when values to remove are not in set', function()
38+
local set = fromArray({ 1, 2, 3, 4, 5 })
39+
local result = removeValues(set, 6, 7, 8)
40+
41+
expect(result).toBe(set)
42+
end)
43+
44+
it('handles nil values in remove list', function()
45+
local set = fromArray({ 1, 2, 3, 4, 5 })
46+
local result = removeValues(set, 2, nil, 4)
47+
48+
expect(result).toEqual(fromArray({ 1, 3, 5 }))
49+
end)
50+
51+
return nil

src/set/removeValues.lua

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
local SetType = require('./type')
2+
local isEmpty = require('./isEmpty')
3+
4+
type Set<T> = SetType.Set<T>
5+
6+
local function removeValues<T>(set: Set<T>, ...: T?): Set<T>
7+
local removeLength = select('#', ...)
8+
9+
if removeLength == 0 or isEmpty(set) then
10+
return set
11+
end
12+
13+
local result
14+
15+
for i = 1, removeLength do
16+
local value: T? = select(i, ...)
17+
18+
if value ~= nil and set[value] ~= nil then
19+
if result == nil then
20+
result = table.clone(set)
21+
end
22+
result[value] = nil
23+
end
24+
end
25+
26+
return result or set
27+
end
28+
29+
return removeValues

0 commit comments

Comments
 (0)