@rbxts/covenant 1.1.0 → 1.2.0
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/package.json +1 -1
- package/src/dataStructureWithEvents.d.ts +27 -0
- package/src/dataStructureWithEvents.luau +207 -0
- package/src/hooks.d.ts +2 -2
- package/src/hooks.luau +28 -28
package/package.json
CHANGED
|
@@ -11,6 +11,20 @@ export declare class EventMap<T extends defined> {
|
|
|
11
11
|
has(key: RBXScriptSignal): boolean;
|
|
12
12
|
get(key: RBXScriptSignal): T | undefined;
|
|
13
13
|
}
|
|
14
|
+
export declare class EventMapWithInstance<T extends defined> {
|
|
15
|
+
private instanceEventMaps;
|
|
16
|
+
constructor();
|
|
17
|
+
set(instance: Instance, key: RBXScriptSignal, value: T): this;
|
|
18
|
+
delete(instance: Instance, key: RBXScriptSignal): boolean;
|
|
19
|
+
clear(): void;
|
|
20
|
+
deletedInstance(instance: Instance): boolean;
|
|
21
|
+
isEmpty(): boolean;
|
|
22
|
+
isInstanceEmpty(instance: Instance): boolean;
|
|
23
|
+
forEach(callbackfn: (value: T, key: RBXScriptSignal) => void): void;
|
|
24
|
+
size(): number;
|
|
25
|
+
has(instance: Instance, key: RBXScriptSignal): boolean;
|
|
26
|
+
get(instance: Instance, key: RBXScriptSignal): T | undefined;
|
|
27
|
+
}
|
|
14
28
|
export declare class EventSet {
|
|
15
29
|
private stringifiedEventToEvent;
|
|
16
30
|
constructor();
|
|
@@ -22,3 +36,16 @@ export declare class EventSet {
|
|
|
22
36
|
size(): number;
|
|
23
37
|
has(value: RBXScriptSignal<Callback>): boolean;
|
|
24
38
|
}
|
|
39
|
+
export declare class EventSetWithInstance {
|
|
40
|
+
private instanceEventSets;
|
|
41
|
+
constructor();
|
|
42
|
+
add(instance: Instance, value: RBXScriptSignal<Callback>): this;
|
|
43
|
+
delete(instance: Instance, value: RBXScriptSignal<Callback>): boolean;
|
|
44
|
+
deleteInstance(instance: Instance): boolean;
|
|
45
|
+
clear(): void;
|
|
46
|
+
isEmpty(): boolean;
|
|
47
|
+
isInstanceEmpty(instance: Instance): boolean;
|
|
48
|
+
forEach(callbackfn: (value: RBXScriptSignal) => void): void;
|
|
49
|
+
size(): number;
|
|
50
|
+
has(instance: Instance, value: RBXScriptSignal<Callback>): boolean;
|
|
51
|
+
}
|
|
@@ -89,6 +89,113 @@ do
|
|
|
89
89
|
return self.stringifiedEventToValue[stringifiedEvent]
|
|
90
90
|
end
|
|
91
91
|
end
|
|
92
|
+
local EventMapWithInstance
|
|
93
|
+
do
|
|
94
|
+
EventMapWithInstance = setmetatable({}, {
|
|
95
|
+
__tostring = function()
|
|
96
|
+
return "EventMapWithInstance"
|
|
97
|
+
end,
|
|
98
|
+
})
|
|
99
|
+
EventMapWithInstance.__index = EventMapWithInstance
|
|
100
|
+
function EventMapWithInstance.new(...)
|
|
101
|
+
local self = setmetatable({}, EventMapWithInstance)
|
|
102
|
+
return self:constructor(...) or self
|
|
103
|
+
end
|
|
104
|
+
function EventMapWithInstance:constructor()
|
|
105
|
+
self.instanceEventMaps = {}
|
|
106
|
+
end
|
|
107
|
+
function EventMapWithInstance:set(instance, key, value)
|
|
108
|
+
local _instanceEventMaps = self.instanceEventMaps
|
|
109
|
+
local _instance = instance
|
|
110
|
+
local eventMap = _instanceEventMaps[_instance]
|
|
111
|
+
if eventMap == nil then
|
|
112
|
+
eventMap = EventMap.new()
|
|
113
|
+
local _instanceEventMaps_1 = self.instanceEventMaps
|
|
114
|
+
local _instance_1 = instance
|
|
115
|
+
local _eventMap = eventMap
|
|
116
|
+
_instanceEventMaps_1[_instance_1] = _eventMap
|
|
117
|
+
end
|
|
118
|
+
eventMap:set(key, value)
|
|
119
|
+
return self
|
|
120
|
+
end
|
|
121
|
+
function EventMapWithInstance:delete(instance, key)
|
|
122
|
+
local _instanceEventMaps = self.instanceEventMaps
|
|
123
|
+
local _instance = instance
|
|
124
|
+
local eventMap = _instanceEventMaps[_instance]
|
|
125
|
+
if eventMap == nil then
|
|
126
|
+
return false
|
|
127
|
+
end
|
|
128
|
+
return eventMap:delete(key)
|
|
129
|
+
end
|
|
130
|
+
function EventMapWithInstance:clear()
|
|
131
|
+
table.clear(self.instanceEventMaps)
|
|
132
|
+
end
|
|
133
|
+
function EventMapWithInstance:deletedInstance(instance)
|
|
134
|
+
local _instanceEventMaps = self.instanceEventMaps
|
|
135
|
+
local _instance = instance
|
|
136
|
+
-- ▼ Map.delete ▼
|
|
137
|
+
local _valueExisted = _instanceEventMaps[_instance] ~= nil
|
|
138
|
+
_instanceEventMaps[_instance] = nil
|
|
139
|
+
-- ▲ Map.delete ▲
|
|
140
|
+
return _valueExisted
|
|
141
|
+
end
|
|
142
|
+
function EventMapWithInstance:isEmpty()
|
|
143
|
+
return next(self.instanceEventMaps) == nil
|
|
144
|
+
end
|
|
145
|
+
function EventMapWithInstance:isInstanceEmpty(instance)
|
|
146
|
+
local _instanceEventMaps = self.instanceEventMaps
|
|
147
|
+
local _instance = instance
|
|
148
|
+
local eventMap = _instanceEventMaps[_instance]
|
|
149
|
+
if eventMap == nil then
|
|
150
|
+
return true
|
|
151
|
+
end
|
|
152
|
+
return eventMap:isEmpty()
|
|
153
|
+
end
|
|
154
|
+
function EventMapWithInstance:forEach(callbackfn)
|
|
155
|
+
local _exp = self.instanceEventMaps
|
|
156
|
+
-- ▼ ReadonlyMap.forEach ▼
|
|
157
|
+
local _callback = function(eventMap)
|
|
158
|
+
eventMap:forEach(function(value, event)
|
|
159
|
+
callbackfn(value, event)
|
|
160
|
+
end)
|
|
161
|
+
end
|
|
162
|
+
for _k, _v in _exp do
|
|
163
|
+
_callback(_v, _k, _exp)
|
|
164
|
+
end
|
|
165
|
+
-- ▲ ReadonlyMap.forEach ▲
|
|
166
|
+
end
|
|
167
|
+
function EventMapWithInstance:size()
|
|
168
|
+
local size = 0
|
|
169
|
+
local _exp = self.instanceEventMaps
|
|
170
|
+
-- ▼ ReadonlyMap.forEach ▼
|
|
171
|
+
local _callback = function(eventMap)
|
|
172
|
+
size += eventMap:size()
|
|
173
|
+
end
|
|
174
|
+
for _k, _v in _exp do
|
|
175
|
+
_callback(_v, _k, _exp)
|
|
176
|
+
end
|
|
177
|
+
-- ▲ ReadonlyMap.forEach ▲
|
|
178
|
+
return size
|
|
179
|
+
end
|
|
180
|
+
function EventMapWithInstance:has(instance, key)
|
|
181
|
+
local _instanceEventMaps = self.instanceEventMaps
|
|
182
|
+
local _instance = instance
|
|
183
|
+
local eventMap = _instanceEventMaps[_instance]
|
|
184
|
+
if eventMap == nil then
|
|
185
|
+
return false
|
|
186
|
+
end
|
|
187
|
+
return eventMap:has(key)
|
|
188
|
+
end
|
|
189
|
+
function EventMapWithInstance:get(instance, key)
|
|
190
|
+
local _instanceEventMaps = self.instanceEventMaps
|
|
191
|
+
local _instance = instance
|
|
192
|
+
local eventMap = _instanceEventMaps[_instance]
|
|
193
|
+
if eventMap == nil then
|
|
194
|
+
return nil
|
|
195
|
+
end
|
|
196
|
+
return eventMap:get(key)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
92
199
|
local EventSet
|
|
93
200
|
do
|
|
94
201
|
EventSet = setmetatable({}, {
|
|
@@ -153,7 +260,107 @@ do
|
|
|
153
260
|
return self.stringifiedEventToEvent[stringifiedEvent] ~= nil
|
|
154
261
|
end
|
|
155
262
|
end
|
|
263
|
+
local EventSetWithInstance
|
|
264
|
+
do
|
|
265
|
+
EventSetWithInstance = setmetatable({}, {
|
|
266
|
+
__tostring = function()
|
|
267
|
+
return "EventSetWithInstance"
|
|
268
|
+
end,
|
|
269
|
+
})
|
|
270
|
+
EventSetWithInstance.__index = EventSetWithInstance
|
|
271
|
+
function EventSetWithInstance.new(...)
|
|
272
|
+
local self = setmetatable({}, EventSetWithInstance)
|
|
273
|
+
return self:constructor(...) or self
|
|
274
|
+
end
|
|
275
|
+
function EventSetWithInstance:constructor()
|
|
276
|
+
self.instanceEventSets = {}
|
|
277
|
+
end
|
|
278
|
+
function EventSetWithInstance:add(instance, value)
|
|
279
|
+
local _instanceEventSets = self.instanceEventSets
|
|
280
|
+
local _instance = instance
|
|
281
|
+
local eventSet = _instanceEventSets[_instance]
|
|
282
|
+
if eventSet == nil then
|
|
283
|
+
eventSet = EventSet.new()
|
|
284
|
+
local _instanceEventSets_1 = self.instanceEventSets
|
|
285
|
+
local _instance_1 = instance
|
|
286
|
+
local _eventSet = eventSet
|
|
287
|
+
_instanceEventSets_1[_instance_1] = _eventSet
|
|
288
|
+
end
|
|
289
|
+
eventSet:add(value)
|
|
290
|
+
return self
|
|
291
|
+
end
|
|
292
|
+
function EventSetWithInstance:delete(instance, value)
|
|
293
|
+
local _instanceEventSets = self.instanceEventSets
|
|
294
|
+
local _instance = instance
|
|
295
|
+
local eventSet = _instanceEventSets[_instance]
|
|
296
|
+
if eventSet == nil then
|
|
297
|
+
return false
|
|
298
|
+
end
|
|
299
|
+
return eventSet:delete(value)
|
|
300
|
+
end
|
|
301
|
+
function EventSetWithInstance:deleteInstance(instance)
|
|
302
|
+
local _instanceEventSets = self.instanceEventSets
|
|
303
|
+
local _instance = instance
|
|
304
|
+
-- ▼ Map.delete ▼
|
|
305
|
+
local _valueExisted = _instanceEventSets[_instance] ~= nil
|
|
306
|
+
_instanceEventSets[_instance] = nil
|
|
307
|
+
-- ▲ Map.delete ▲
|
|
308
|
+
return _valueExisted
|
|
309
|
+
end
|
|
310
|
+
function EventSetWithInstance:clear()
|
|
311
|
+
table.clear(self.instanceEventSets)
|
|
312
|
+
end
|
|
313
|
+
function EventSetWithInstance:isEmpty()
|
|
314
|
+
return next(self.instanceEventSets) == nil
|
|
315
|
+
end
|
|
316
|
+
function EventSetWithInstance:isInstanceEmpty(instance)
|
|
317
|
+
local _instanceEventSets = self.instanceEventSets
|
|
318
|
+
local _instance = instance
|
|
319
|
+
local eventSet = _instanceEventSets[_instance]
|
|
320
|
+
if eventSet == nil then
|
|
321
|
+
return true
|
|
322
|
+
end
|
|
323
|
+
return eventSet:isEmpty()
|
|
324
|
+
end
|
|
325
|
+
function EventSetWithInstance:forEach(callbackfn)
|
|
326
|
+
local _exp = self.instanceEventSets
|
|
327
|
+
-- ▼ ReadonlyMap.forEach ▼
|
|
328
|
+
local _callback = function(eventSet)
|
|
329
|
+
eventSet:forEach(function(event)
|
|
330
|
+
callbackfn(event)
|
|
331
|
+
end)
|
|
332
|
+
end
|
|
333
|
+
for _k, _v in _exp do
|
|
334
|
+
_callback(_v, _k, _exp)
|
|
335
|
+
end
|
|
336
|
+
-- ▲ ReadonlyMap.forEach ▲
|
|
337
|
+
end
|
|
338
|
+
function EventSetWithInstance:size()
|
|
339
|
+
local size = 0
|
|
340
|
+
local _exp = self.instanceEventSets
|
|
341
|
+
-- ▼ ReadonlyMap.forEach ▼
|
|
342
|
+
local _callback = function(eventSet)
|
|
343
|
+
size += eventSet:size()
|
|
344
|
+
end
|
|
345
|
+
for _k, _v in _exp do
|
|
346
|
+
_callback(_v, _k, _exp)
|
|
347
|
+
end
|
|
348
|
+
-- ▲ ReadonlyMap.forEach ▲
|
|
349
|
+
return size
|
|
350
|
+
end
|
|
351
|
+
function EventSetWithInstance:has(instance, value)
|
|
352
|
+
local _instanceEventSets = self.instanceEventSets
|
|
353
|
+
local _instance = instance
|
|
354
|
+
local eventSet = _instanceEventSets[_instance]
|
|
355
|
+
if eventSet == nil then
|
|
356
|
+
return false
|
|
357
|
+
end
|
|
358
|
+
return eventSet:has(value)
|
|
359
|
+
end
|
|
360
|
+
end
|
|
156
361
|
return {
|
|
157
362
|
EventMap = EventMap,
|
|
363
|
+
EventMapWithInstance = EventMapWithInstance,
|
|
158
364
|
EventSet = EventSet,
|
|
365
|
+
EventSetWithInstance = EventSetWithInstance,
|
|
159
366
|
}
|
package/src/hooks.d.ts
CHANGED
|
@@ -6,8 +6,8 @@ type AsyncResult<T = unknown> = {
|
|
|
6
6
|
};
|
|
7
7
|
export type Discriminator = Exclude<defined, number>;
|
|
8
8
|
export interface CovenantHooks {
|
|
9
|
-
useEvent: <T extends Array<unknown>>(updateId: number, event: RBXScriptSignal<(...args: T) => void>) => T[];
|
|
10
|
-
useEventImmediately: <T extends Array<unknown>, TReturn extends defined>(updateId: number, event: RBXScriptSignal<(...args: T) => void>, callback: (...args: T) => TReturn) => TReturn[];
|
|
9
|
+
useEvent: <T extends Array<unknown>>(updateId: number, instance: Instance, event: RBXScriptSignal<(...args: T) => void>) => T[];
|
|
10
|
+
useEventImmediately: <T extends Array<unknown>, TReturn extends defined>(updateId: number, instance: Instance, event: RBXScriptSignal<(...args: T) => void>, callback: (...args: T) => TReturn) => TReturn[];
|
|
11
11
|
useComponentChange: <T extends defined>(updateId: number, component: Entity<T>) => {
|
|
12
12
|
entity: Entity;
|
|
13
13
|
state: T | undefined;
|
package/src/hooks.luau
CHANGED
|
@@ -1,78 +1,78 @@
|
|
|
1
1
|
-- Compiled with roblox-ts v3.0.0
|
|
2
2
|
local TS = _G[script]
|
|
3
3
|
local _dataStructureWithEvents = TS.import(script, script.Parent, "dataStructureWithEvents")
|
|
4
|
-
local
|
|
5
|
-
local
|
|
4
|
+
local EventMapWithInstance = _dataStructureWithEvents.EventMapWithInstance
|
|
5
|
+
local EventSetWithInstance = _dataStructureWithEvents.EventSetWithInstance
|
|
6
6
|
-- TODO: make events available for dynamic instances
|
|
7
7
|
local function createUseEvent(_param)
|
|
8
8
|
local indicateUpdate = _param.indicateUpdate
|
|
9
|
-
local queues =
|
|
10
|
-
local watchedEvents =
|
|
11
|
-
local caches =
|
|
9
|
+
local queues = EventMapWithInstance.new()
|
|
10
|
+
local watchedEvents = EventSetWithInstance.new()
|
|
11
|
+
local caches = EventMapWithInstance.new()
|
|
12
12
|
local lastUpdateId = -1
|
|
13
|
-
return function(updateId, event)
|
|
13
|
+
return function(updateId, instance, event)
|
|
14
14
|
if lastUpdateId ~= updateId then
|
|
15
15
|
caches:clear()
|
|
16
16
|
lastUpdateId = updateId
|
|
17
17
|
end
|
|
18
|
-
local cache = caches:get(event)
|
|
18
|
+
local cache = caches:get(instance, event)
|
|
19
19
|
if cache ~= nil then
|
|
20
20
|
return cache
|
|
21
21
|
end
|
|
22
|
-
if not watchedEvents:has(event) then
|
|
23
|
-
watchedEvents:add(event)
|
|
24
|
-
queues:set(event, {})
|
|
22
|
+
if not watchedEvents:has(instance, event) then
|
|
23
|
+
watchedEvents:add(instance, event)
|
|
24
|
+
queues:set(instance, event, {})
|
|
25
25
|
event:Connect(function(...)
|
|
26
26
|
local args = { ... }
|
|
27
|
-
local _exp = queues:get(event)
|
|
27
|
+
local _exp = queues:get(instance, event)
|
|
28
28
|
local _args = args
|
|
29
29
|
table.insert(_exp, _args)
|
|
30
30
|
indicateUpdate()
|
|
31
31
|
end)
|
|
32
|
-
caches:set(event, {})
|
|
32
|
+
caches:set(instance, event, {})
|
|
33
33
|
return {}
|
|
34
34
|
end
|
|
35
|
-
local queue = queues:get(event)
|
|
35
|
+
local queue = queues:get(instance, event)
|
|
36
36
|
if not (#queue == 0) then
|
|
37
|
-
queues:set(event, {})
|
|
37
|
+
queues:set(instance, event, {})
|
|
38
38
|
end
|
|
39
|
-
caches:set(event, queue)
|
|
39
|
+
caches:set(instance, event, queue)
|
|
40
40
|
return queue
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
43
|
local function createUseEventImmediately(_param)
|
|
44
44
|
local indicateUpdate = _param.indicateUpdate
|
|
45
|
-
local queues =
|
|
46
|
-
local watchedEvents =
|
|
47
|
-
local caches =
|
|
45
|
+
local queues = EventMapWithInstance.new()
|
|
46
|
+
local watchedEvents = EventSetWithInstance.new()
|
|
47
|
+
local caches = EventMapWithInstance.new()
|
|
48
48
|
local lastUpdateId = -1
|
|
49
|
-
return function(updateId, event, callback)
|
|
49
|
+
return function(updateId, instance, event, callback)
|
|
50
50
|
if lastUpdateId ~= updateId then
|
|
51
51
|
caches:clear()
|
|
52
52
|
lastUpdateId = updateId
|
|
53
53
|
end
|
|
54
|
-
local cache = caches:get(event)
|
|
54
|
+
local cache = caches:get(instance, event)
|
|
55
55
|
if cache ~= nil then
|
|
56
56
|
return cache
|
|
57
57
|
end
|
|
58
|
-
if not watchedEvents:has(event) then
|
|
59
|
-
watchedEvents:add(event)
|
|
60
|
-
queues:set(event, {})
|
|
58
|
+
if not watchedEvents:has(instance, event) then
|
|
59
|
+
watchedEvents:add(instance, event)
|
|
60
|
+
queues:set(instance, event, {})
|
|
61
61
|
event:Connect(function(...)
|
|
62
62
|
local args = { ... }
|
|
63
|
-
local _exp = queues:get(event)
|
|
63
|
+
local _exp = queues:get(instance, event)
|
|
64
64
|
local _arg0 = callback(unpack(args))
|
|
65
65
|
table.insert(_exp, _arg0)
|
|
66
66
|
indicateUpdate()
|
|
67
67
|
end)
|
|
68
|
-
caches:set(event, {})
|
|
68
|
+
caches:set(instance, event, {})
|
|
69
69
|
return {}
|
|
70
70
|
end
|
|
71
|
-
local queue = queues:get(event)
|
|
71
|
+
local queue = queues:get(instance, event)
|
|
72
72
|
if not (#queue == 0) then
|
|
73
|
-
queues:set(event, {})
|
|
73
|
+
queues:set(instance, event, {})
|
|
74
74
|
end
|
|
75
|
-
caches:set(event, queue)
|
|
75
|
+
caches:set(instance, event, queue)
|
|
76
76
|
return queue
|
|
77
77
|
end
|
|
78
78
|
end
|