@rbxts/covenant 1.1.0 → 1.3.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rbxts/covenant",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "main": "src/init.luau",
5
5
  "scripts": {
6
6
  "build": "rbxtsc",
package/src/covenant.d.ts CHANGED
@@ -42,6 +42,7 @@ export declare class Covenant {
42
42
  subscribeComponent<T>(component: Entity<T>, subscriber: (entity: Entity, state: T | undefined, previousState: T | undefined) => void): () => void;
43
43
  private worldDelete;
44
44
  worldComponent<T extends defined>(): Entity<T>;
45
+ worldTag(): Entity<undefined>;
45
46
  private worldInternalComponent;
46
47
  private checkComponentDefined;
47
48
  private defineComponentNetworkBehavior;
@@ -60,13 +61,10 @@ export declare class Covenant {
60
61
  queriedComponents: Entity[][];
61
62
  recipe: (entity: Entity, lastChildrenStates: ReadonlyArray<T>, updateId: number, hooks: CovenantHooks) => ReadonlyArray<T>;
62
63
  }): void;
63
- defineEntitySource<T extends defined>({ identityComponent, recipe, replicated, }: {
64
+ defineStaticEntity<T extends defined>({ identityComponent, recipe, replicated, }: {
64
65
  replicated: boolean;
65
66
  identityComponent: Entity<T>;
66
- recipe: (updateId: number, hooks: CovenantHooks) => {
67
- statesToCreate?: ReadonlyArray<T>;
68
- entitiesToDelete?: ReadonlyArray<Entity>;
69
- };
67
+ recipe: (updateId: number, hooks: CovenantHooks) => T[];
70
68
  }): void;
71
69
  private worldEntity;
72
70
  worldQuery<T extends Id[]>(...components: T): import("@rbxts/jecs").Query<import("@rbxts/jecs").InferComponents<T>>;
package/src/covenant.luau CHANGED
@@ -428,6 +428,14 @@ do
428
428
  _undefinedStringifiedComponents[_arg0] = true
429
429
  return c
430
430
  end
431
+ function Covenant:worldTag()
432
+ self:preventPostStartCall()
433
+ local c = self._world:component()
434
+ local _undefinedStringifiedComponents = self.undefinedStringifiedComponents
435
+ local _arg0 = tostring(c)
436
+ _undefinedStringifiedComponents[_arg0] = true
437
+ return c
438
+ end
431
439
  function Covenant:worldInternalComponent()
432
440
  self:preventPostStartCall()
433
441
  return self._world:component()
@@ -762,7 +770,7 @@ do
762
770
  updater()
763
771
  end)
764
772
  end
765
- function Covenant:defineEntitySource(_param)
773
+ function Covenant:defineStaticEntity(_param)
766
774
  local identityComponent = _param.identityComponent
767
775
  local recipe = _param.recipe
768
776
  local replicated = _param.replicated
@@ -781,35 +789,16 @@ do
781
789
  local lastUpdateId = 0
782
790
  local updater = function()
783
791
  lastUpdateId += 1
784
- local _binding = recipe(lastUpdateId, hooks)
785
- local statesToCreate = _binding.statesToCreate
786
- local entitiesToDelete = _binding.entitiesToDelete
787
- local _result = statesToCreate
788
- if _result ~= nil then
789
- -- ▼ ReadonlyArray.forEach ▼
790
- local _callback = function(state)
791
- local entity = self:worldEntity()
792
- self:worldSet(entity, identityComponent, state)
793
- end
794
- for _k, _v in _result do
795
- _callback(_v, _k - 1, _result)
796
- end
797
- -- ▲ ReadonlyArray.forEach ▲
792
+ local states = recipe(lastUpdateId, hooks)
793
+ -- ReadonlyArray.forEach
794
+ local _callback = function(state)
795
+ local entity = self:worldEntity()
796
+ self:worldSet(entity, identityComponent, state)
798
797
  end
799
- local _result_1 = entitiesToDelete
800
- if _result_1 ~= nil then
801
- -- ▼ ReadonlyArray.forEach ▼
802
- local _callback = function(entity)
803
- if not self:worldHas(entity, identityComponent) then
804
- return nil
805
- end
806
- self:worldDelete(entity)
807
- end
808
- for _k, _v in _result_1 do
809
- _callback(_v, _k - 1, _result_1)
810
- end
811
- -- ▲ ReadonlyArray.forEach ▲
798
+ for _k, _v in states do
799
+ _callback(_v, _k - 1, states)
812
800
  end
801
+ -- ▲ ReadonlyArray.forEach ▲
813
802
  end
814
803
  self:schedule(RunService.Heartbeat, function()
815
804
  if not willUpdate then
@@ -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 EventMap = _dataStructureWithEvents.EventMap
5
- local EventSet = _dataStructureWithEvents.EventSet
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 = EventMap.new()
10
- local watchedEvents = EventSet.new()
11
- local caches = EventMap.new()
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 = EventMap.new()
46
- local watchedEvents = EventSet.new()
47
- local caches = EventMap.new()
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