@rbxts/replecs 0.3.1 → 0.4.0-rc.2

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.
@@ -1,106 +0,0 @@
1
- --!native
2
- --!optimize 2
3
-
4
- local utils = require (script.Parent.Parent:WaitForChild('utils'))
5
-
6
- type ComputeCallback = (generator: MaskGenerator) -> utils.Bitmask
7
- type SubscribeCallback = (generator: MaskGenerator) -> ()
8
-
9
- export type MaskGenerator = {
10
- compute_callback: ComputeCallback?,
11
- subscribed: SubscribeCallback?,
12
- result: utils.Bitmask,
13
- bitmask: utils.Bitmask?,
14
-
15
- tracking: { GeneratorInternal },
16
- tracked_by: { GeneratorInternal },
17
- tracked_indexes: { [GeneratorInternal]: number },
18
-
19
- compute: (self: MaskGenerator) -> (),
20
- run_subscribed: (self: MaskGenerator) -> (),
21
- track: (self: MaskGenerator, tracking: MaskGenerator) -> (),
22
- destroy: (self: MaskGenerator) -> (),
23
- }
24
-
25
- export type MaskGeneratorWithBitmask = MaskGenerator & {
26
- bitmask: utils.Bitmask,
27
- }
28
-
29
- local mask_generator = {}
30
- mask_generator.__index = mask_generator
31
-
32
- type GeneratorInternal = MaskGenerator & typeof(mask_generator)
33
-
34
- function mask_generator.track(generator: GeneratorInternal, tracking: GeneratorInternal)
35
- table.insert(generator.tracking, tracking)
36
- tracking:mark_as_tracked(generator)
37
- end
38
-
39
- function mask_generator.mark_as_tracked(generator: GeneratorInternal, tracked_by: GeneratorInternal)
40
- table.insert(generator.tracked_by, tracked_by)
41
- generator.tracked_indexes[tracked_by] = #generator.tracked_by
42
- end
43
-
44
- function mask_generator.unmark_tracked(generator: GeneratorInternal, to_untrack: GeneratorInternal)
45
- local index = generator.tracked_indexes[to_untrack]
46
- if index then
47
- local last = table.remove(generator.tracked_by)
48
-
49
- if last and last ~= to_untrack then
50
- generator.tracked_by[index] = last
51
- generator.tracked_indexes[last :: GeneratorInternal] = index
52
- end
53
-
54
- generator.tracked_indexes[to_untrack] = nil
55
- end
56
- end
57
-
58
- function mask_generator.run_subscribed(generator: GeneratorInternal)
59
- if generator.subscribed then
60
- generator.subscribed(generator :: GeneratorInternal)
61
- end
62
- end
63
-
64
- function mask_generator.compute(generator: GeneratorInternal)
65
- if generator.compute_callback then
66
- local result: utils.Bitmask = generator.compute_callback(generator :: any)
67
- generator.result = result
68
- end
69
- if generator.subscribed then
70
- generator.subscribed(generator :: GeneratorInternal)
71
- end
72
-
73
- for _, tracking in generator.tracked_by do
74
- tracking:compute()
75
- end
76
- end
77
-
78
- function mask_generator.destroy(generator: GeneratorInternal)
79
- for _, tracking in generator.tracking do
80
- tracking:unmark_tracked(generator :: GeneratorInternal)
81
- end
82
- end
83
-
84
- function create(bitmask: utils.Bitmask?, compute: ComputeCallback?): MaskGenerator
85
- local self = {} :: MaskGenerator
86
-
87
- self.bitmask = bitmask
88
- self.result = if compute then compute(self) else bitmask :: utils.Bitmask
89
- self.compute_callback = compute
90
- self.subscribed = nil
91
- self.tracking = {}
92
- self.tracked_by = {}
93
- self.tracked_indexes = {}
94
-
95
- return setmetatable(self, mask_generator) :: any
96
- end
97
-
98
- function follow(leading: MaskGenerator): MaskGenerator
99
- local created = create(leading.result, function()
100
- return leading.result
101
- end)
102
- created:track(leading)
103
- return created
104
- end
105
-
106
- return { create = create, follow = follow }