@quenty/tuple 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/package.json +4 -4
- package/src/Shared/Tuple.lua +26 -18
- package/src/Shared/Tuple.story.lua +1 -1
- package/src/Shared/TupleLookup.lua +18 -9
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.5.1](https://github.com/Quenty/NevermoreEngine/compare/@quenty/tuple@1.5.0...@quenty/tuple@1.5.1) (2025-04-05)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* Add types to packages ([2374fb2](https://github.com/Quenty/NevermoreEngine/commit/2374fb2b043cfbe0e9b507b3316eec46a4e353a0))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
# [1.5.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/tuple@1.4.1...@quenty/tuple@1.5.0) (2025-02-18)
|
|
7
18
|
|
|
8
19
|
**Note:** Version bump only for package @quenty/tuple
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quenty/tuple",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"description": "Tuple utility package",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Roblox",
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
"Quenty"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@quenty/loader": "^10.8.
|
|
29
|
-
"@quenty/lrucache": "^1.6.
|
|
28
|
+
"@quenty/loader": "^10.8.1",
|
|
29
|
+
"@quenty/lrucache": "^1.6.1"
|
|
30
30
|
},
|
|
31
31
|
"publishConfig": {
|
|
32
32
|
"access": "public"
|
|
33
33
|
},
|
|
34
|
-
"gitHead": "
|
|
34
|
+
"gitHead": "78c3ac0ab08dd18085b6e6e6e4f745e76ed99f68"
|
|
35
35
|
}
|
package/src/Shared/Tuple.lua
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
--!strict
|
|
1
2
|
--[=[
|
|
2
3
|
Tuple class for Lua
|
|
3
4
|
|
|
@@ -8,13 +9,20 @@ local Tuple = {}
|
|
|
8
9
|
Tuple.ClassName = "Tuple"
|
|
9
10
|
Tuple.__index = Tuple
|
|
10
11
|
|
|
12
|
+
export type Tuple<T...> = typeof(setmetatable(
|
|
13
|
+
{} :: {
|
|
14
|
+
n: number,
|
|
15
|
+
},
|
|
16
|
+
Tuple
|
|
17
|
+
))
|
|
18
|
+
|
|
11
19
|
--[=[
|
|
12
20
|
Constructs a new tuple
|
|
13
21
|
|
|
14
22
|
@param ... any
|
|
15
|
-
@return Tuple<T
|
|
23
|
+
@return Tuple<T...>
|
|
16
24
|
]=]
|
|
17
|
-
function Tuple.new(...)
|
|
25
|
+
function Tuple.new<T...>(...: T...): Tuple<T...>
|
|
18
26
|
return setmetatable(table.pack(...), Tuple)
|
|
19
27
|
end
|
|
20
28
|
|
|
@@ -24,7 +32,7 @@ end
|
|
|
24
32
|
@param value any
|
|
25
33
|
@return boolean
|
|
26
34
|
]=]
|
|
27
|
-
function Tuple.isTuple(value)
|
|
35
|
+
function Tuple.isTuple(value: any): boolean
|
|
28
36
|
return getmetatable(value) == Tuple
|
|
29
37
|
end
|
|
30
38
|
|
|
@@ -33,25 +41,25 @@ end
|
|
|
33
41
|
|
|
34
42
|
@return T
|
|
35
43
|
]=]
|
|
36
|
-
function Tuple
|
|
37
|
-
return table.unpack(self, 1, self.n)
|
|
44
|
+
function Tuple.Unpack<T...>(self: Tuple<T...>): T...
|
|
45
|
+
return table.unpack(self :: any, 1, self.n)
|
|
38
46
|
end
|
|
39
47
|
|
|
40
48
|
--[=[
|
|
41
49
|
Converts to array
|
|
42
50
|
|
|
43
|
-
@return { T }
|
|
51
|
+
@return { T... }
|
|
44
52
|
]=]
|
|
45
|
-
function Tuple
|
|
46
|
-
return {
|
|
53
|
+
function Tuple.ToArray<T...>(self: Tuple<T...>): { any }
|
|
54
|
+
return { Tuple.Unpack(self) }
|
|
47
55
|
end
|
|
48
56
|
|
|
49
57
|
--[=[
|
|
50
58
|
Converts the tuple to a string for easy debugging
|
|
51
59
|
]=]
|
|
52
|
-
function Tuple
|
|
60
|
+
function Tuple.__tostring<T...>(self: Tuple<T...>): string
|
|
53
61
|
local converted = {}
|
|
54
|
-
for i=1, self.n do
|
|
62
|
+
for i = 1, self.n do
|
|
55
63
|
converted[i] = tostring(self[i])
|
|
56
64
|
end
|
|
57
65
|
return table.concat(converted, ", ")
|
|
@@ -62,7 +70,7 @@ end
|
|
|
62
70
|
|
|
63
71
|
@return number
|
|
64
72
|
]=]
|
|
65
|
-
function Tuple
|
|
73
|
+
function Tuple.__len<T...>(self: Tuple<T...>): number
|
|
66
74
|
return self.n
|
|
67
75
|
end
|
|
68
76
|
|
|
@@ -70,7 +78,7 @@ end
|
|
|
70
78
|
Compares the tuple to another tuple
|
|
71
79
|
@param other Tuple
|
|
72
80
|
]=]
|
|
73
|
-
function Tuple
|
|
81
|
+
function Tuple.__eq<T...>(self: Tuple<T...>, other: Tuple<T...>): boolean
|
|
74
82
|
if not Tuple.isTuple(other) then
|
|
75
83
|
return false
|
|
76
84
|
end
|
|
@@ -79,7 +87,7 @@ function Tuple:__eq(other)
|
|
|
79
87
|
return false
|
|
80
88
|
end
|
|
81
89
|
|
|
82
|
-
for i=1, self.n do
|
|
90
|
+
for i = 1, self.n do
|
|
83
91
|
if self[i] ~= other[i] then
|
|
84
92
|
return false
|
|
85
93
|
end
|
|
@@ -92,12 +100,12 @@ end
|
|
|
92
100
|
Combines the tuple
|
|
93
101
|
@param other Tuple
|
|
94
102
|
]=]
|
|
95
|
-
function Tuple
|
|
103
|
+
function Tuple.__add<T...>(self: Tuple<T...>, other: Tuple<T...>): Tuple<T...>
|
|
96
104
|
assert(Tuple.isTuple(other), "Can only add tuples")
|
|
97
105
|
|
|
98
|
-
local result = Tuple.new(
|
|
106
|
+
local result = Tuple.new(Tuple.Unpack(self))
|
|
99
107
|
local count = self.n
|
|
100
|
-
for i=1, other.n do
|
|
108
|
+
for i = 1, other.n do
|
|
101
109
|
result[count + i] = other[i]
|
|
102
110
|
end
|
|
103
111
|
result.n = count + other.n
|
|
@@ -109,8 +117,8 @@ end
|
|
|
109
117
|
|
|
110
118
|
@return ...
|
|
111
119
|
]=]
|
|
112
|
-
function Tuple
|
|
113
|
-
return table.unpack(self, 1, self.n)
|
|
120
|
+
function Tuple.__call<T...>(self: Tuple<T...>): T...
|
|
121
|
+
return table.unpack(self :: any, 1, self.n)
|
|
114
122
|
end
|
|
115
123
|
|
|
116
124
|
return Tuple
|
|
@@ -6,7 +6,7 @@ local require = require(game:GetService("ServerScriptService"):FindFirstChild("L
|
|
|
6
6
|
|
|
7
7
|
local Tuple = require("Tuple")
|
|
8
8
|
|
|
9
|
-
return function(_target)
|
|
9
|
+
return function(_target: Frame)
|
|
10
10
|
local a = Tuple.new(1, 2, 3)
|
|
11
11
|
local b = Tuple.new(1, 2, 3)
|
|
12
12
|
local c = Tuple.new(3, 4, "d")
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
--!strict
|
|
1
2
|
--[=[
|
|
2
3
|
Helps look up tuples that can be used as keys
|
|
3
4
|
|
|
@@ -12,22 +13,30 @@ local TupleLookup = {}
|
|
|
12
13
|
TupleLookup.ClassName = "TupleLookup"
|
|
13
14
|
TupleLookup.__index = TupleLookup
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
export type TupleLookup = typeof(setmetatable(
|
|
17
|
+
{} :: {
|
|
18
|
+
_tuples: { [Tuple.Tuple<...any>]: boolean },
|
|
19
|
+
_singleArgTuples: { [any]: Tuple.Tuple<...any> },
|
|
20
|
+
},
|
|
21
|
+
TupleLookup
|
|
22
|
+
))
|
|
23
|
+
|
|
24
|
+
function TupleLookup.new(): TupleLookup
|
|
16
25
|
local self = setmetatable({}, TupleLookup)
|
|
17
26
|
|
|
18
|
-
self._tuples = setmetatable({}, { __mode = "k"})
|
|
19
|
-
self._singleArgTuples = setmetatable({}, { __mode = "kv"})
|
|
27
|
+
self._tuples = setmetatable({}, { __mode = "k" })
|
|
28
|
+
self._singleArgTuples = setmetatable({}, { __mode = "kv" })
|
|
20
29
|
|
|
21
|
-
return self
|
|
30
|
+
return self :: any
|
|
22
31
|
end
|
|
23
32
|
|
|
24
33
|
--[=[
|
|
25
34
|
Gets a shared tuple with a weak table
|
|
26
35
|
|
|
27
36
|
@param ... any
|
|
28
|
-
@return Tuple<T
|
|
37
|
+
@return Tuple<T...>
|
|
29
38
|
]=]
|
|
30
|
-
function TupleLookup
|
|
39
|
+
function TupleLookup.ToTuple<T...>(self: TupleLookup, ...): Tuple.Tuple<T...>
|
|
31
40
|
local n = select("#", ...)
|
|
32
41
|
if n == 1 then
|
|
33
42
|
local arg = ...
|
|
@@ -38,9 +47,9 @@ function TupleLookup:ToTuple(...)
|
|
|
38
47
|
|
|
39
48
|
local created = Tuple.new(...)
|
|
40
49
|
|
|
41
|
-
for item, _ in
|
|
42
|
-
if item == created then
|
|
43
|
-
return item
|
|
50
|
+
for item, _ in self._tuples do
|
|
51
|
+
if (item :: any) == created then
|
|
52
|
+
return item :: any
|
|
44
53
|
end
|
|
45
54
|
end
|
|
46
55
|
|