roblox-opencode 1.0.0 → 1.0.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.
- package/README.md +112 -122
- package/commands/setup-game.md +108 -108
- package/commands/sync-check.md +53 -53
- package/core/roblox-core.md +93 -93
- package/dist/server.js +189 -167
- package/package.json +35 -35
- package/skills/roblox-analytics/SKILL.md +277 -277
- package/skills/roblox-analytics/references/event-batcher.luau +75 -75
- package/skills/roblox-animation-vfx/SKILL.md +1325 -1325
- package/skills/roblox-architecture/SKILL.md +877 -863
- package/skills/roblox-architecture/references/combat-systems.md +1381 -1381
- package/skills/roblox-code-review/SKILL.md +686 -686
- package/skills/roblox-data/SKILL.md +889 -889
- package/skills/roblox-data/references/inventory-systems.md +1729 -1729
- package/skills/roblox-debug/SKILL.md +98 -98
- package/skills/roblox-gui/SKILL.md +1103 -1103
- package/skills/roblox-gui-fusion/SKILL.md +150 -150
- package/skills/roblox-gui-fusion/references/inventory.luau +427 -427
- package/skills/roblox-gui-fusion/references/settings-menu.luau +579 -579
- package/skills/roblox-gui-fusion/references/shop.luau +411 -411
- package/skills/roblox-luau-mastery/SKILL.md +1618 -1519
- package/skills/roblox-monetization/SKILL.md +1084 -1084
- package/skills/roblox-monetization/references/process-receipt.luau +131 -131
- package/skills/roblox-networking/SKILL.md +669 -669
- package/skills/roblox-networking/references/remote-validator.luau +193 -193
- package/skills/roblox-publish-checklist/SKILL.md +127 -127
- package/skills/roblox-runtime/SKILL.md +753 -753
- package/skills/roblox-sharp-edges/SKILL.md +294 -294
- package/skills/roblox-sync/SKILL.md +126 -126
- package/skills/roblox-testing/SKILL.md +943 -943
- package/skills/roblox-tooling/SKILL.md +149 -149
- package/vendor/LICENSES/ProfileStore-LICENSE +201 -201
- package/vendor/LICENSES/RbxUtil-LICENSE +7 -7
- package/vendor/LICENSES/promise-LICENSE +20 -20
- package/vendor/LICENSES/t-LICENSE +21 -21
- package/vendor/LICENSES/testez-LICENSE +200 -200
- package/vendor/README.md +83 -83
- package/vendor/fusion/Animation/ExternalTime.luau +83 -83
- package/vendor/fusion/Animation/Spring.luau +321 -321
- package/vendor/fusion/Animation/Stopwatch.luau +127 -127
- package/vendor/fusion/Animation/Tween.luau +187 -187
- package/vendor/fusion/Animation/getTweenDuration.luau +27 -27
- package/vendor/fusion/Animation/getTweenRatio.luau +47 -47
- package/vendor/fusion/Animation/lerpType.luau +163 -163
- package/vendor/fusion/Animation/packType.luau +99 -99
- package/vendor/fusion/Animation/springCoefficients.luau +80 -80
- package/vendor/fusion/Animation/unpackType.luau +102 -102
- package/vendor/fusion/Colour/Oklab.luau +70 -70
- package/vendor/fusion/Colour/sRGB.luau +54 -54
- package/vendor/fusion/External.luau +167 -167
- package/vendor/fusion/ExternalDebug.luau +69 -69
- package/vendor/fusion/Graph/Observer.luau +113 -113
- package/vendor/fusion/Graph/castToGraph.luau +28 -28
- package/vendor/fusion/Graph/change.luau +80 -80
- package/vendor/fusion/Graph/depend.luau +32 -32
- package/vendor/fusion/Graph/evaluate.luau +55 -55
- package/vendor/fusion/Instances/Attribute.luau +57 -57
- package/vendor/fusion/Instances/AttributeChange.luau +46 -46
- package/vendor/fusion/Instances/AttributeOut.luau +63 -63
- package/vendor/fusion/Instances/Child.luau +21 -21
- package/vendor/fusion/Instances/Children.luau +147 -147
- package/vendor/fusion/Instances/Hydrate.luau +32 -32
- package/vendor/fusion/Instances/New.luau +52 -52
- package/vendor/fusion/Instances/OnChange.luau +49 -49
- package/vendor/fusion/Instances/OnEvent.luau +53 -53
- package/vendor/fusion/Instances/Out.luau +69 -69
- package/vendor/fusion/Instances/applyInstanceProps.luau +148 -148
- package/vendor/fusion/Instances/defaultProps.luau +194 -194
- package/vendor/fusion/LICENSE +21 -21
- package/vendor/fusion/Logging/formatError.luau +48 -48
- package/vendor/fusion/Logging/messages.luau +51 -51
- package/vendor/fusion/Logging/parseError.luau +24 -24
- package/vendor/fusion/Memory/checkLifetime.luau +133 -133
- package/vendor/fusion/Memory/deriveScope.luau +23 -23
- package/vendor/fusion/Memory/deriveScopeImpl.luau +44 -44
- package/vendor/fusion/Memory/doCleanup.luau +78 -78
- package/vendor/fusion/Memory/innerScope.luau +33 -33
- package/vendor/fusion/Memory/legacyCleanup.luau +17 -17
- package/vendor/fusion/Memory/needsDestruction.luau +16 -16
- package/vendor/fusion/Memory/poisonScope.luau +33 -33
- package/vendor/fusion/Memory/scopePool.luau +54 -54
- package/vendor/fusion/Memory/scoped.luau +26 -26
- package/vendor/fusion/Memory/whichLivesLonger.luau +74 -74
- package/vendor/fusion/RobloxExternal.luau +97 -97
- package/vendor/fusion/State/Computed.luau +138 -138
- package/vendor/fusion/State/For/Disassembly.luau +210 -210
- package/vendor/fusion/State/For/ForTypes.luau +30 -30
- package/vendor/fusion/State/For/init.luau +109 -109
- package/vendor/fusion/State/ForKeys.luau +93 -93
- package/vendor/fusion/State/ForPairs.luau +96 -96
- package/vendor/fusion/State/ForValues.luau +93 -93
- package/vendor/fusion/State/Value.luau +87 -87
- package/vendor/fusion/State/castToState.luau +25 -25
- package/vendor/fusion/State/peek.luau +30 -30
- package/vendor/fusion/Types.luau +314 -314
- package/vendor/fusion/Utility/Contextual.luau +90 -90
- package/vendor/fusion/Utility/Safe.luau +22 -22
- package/vendor/fusion/Utility/isSimilar.luau +29 -29
- package/vendor/fusion/Utility/merge.luau +35 -35
- package/vendor/fusion/Utility/nameOf.luau +34 -34
- package/vendor/fusion/Utility/never.luau +13 -13
- package/vendor/fusion/Utility/nicknames.luau +10 -10
- package/vendor/fusion/Utility/xtypeof.luau +26 -26
- package/vendor/fusion/init.luau +82 -82
- package/vendor/profilestore/init.luau +2242 -2242
- package/vendor/promise/init.luau +1982 -1982
- package/vendor/rbxutil/buffer-util/Buffer.test.luau +25 -25
- package/vendor/rbxutil/buffer-util/BufferReader.luau +228 -228
- package/vendor/rbxutil/buffer-util/BufferWriter.luau +269 -269
- package/vendor/rbxutil/buffer-util/DataTypeBuffer.luau +223 -223
- package/vendor/rbxutil/buffer-util/Types.luau +60 -60
- package/vendor/rbxutil/buffer-util/index.d.ts +153 -153
- package/vendor/rbxutil/buffer-util/init.luau +41 -41
- package/vendor/rbxutil/buffer-util/package.json +16 -16
- package/vendor/rbxutil/buffer-util/wally.toml +9 -9
- package/vendor/rbxutil/comm/Client/ClientComm.luau +232 -232
- package/vendor/rbxutil/comm/Client/ClientRemoteProperty.luau +156 -156
- package/vendor/rbxutil/comm/Client/ClientRemoteSignal.luau +109 -109
- package/vendor/rbxutil/comm/Client/init.luau +135 -135
- package/vendor/rbxutil/comm/Server/RemoteProperty.luau +295 -295
- package/vendor/rbxutil/comm/Server/RemoteSignal.luau +211 -211
- package/vendor/rbxutil/comm/Server/ServerComm.luau +211 -211
- package/vendor/rbxutil/comm/Server/init.luau +140 -140
- package/vendor/rbxutil/comm/Types.luau +18 -18
- package/vendor/rbxutil/comm/Util.luau +27 -27
- package/vendor/rbxutil/comm/init.luau +35 -35
- package/vendor/rbxutil/comm/wally.toml +13 -13
- package/vendor/rbxutil/component/init.luau +759 -759
- package/vendor/rbxutil/component/init.test.luau +311 -311
- package/vendor/rbxutil/component/wally.toml +14 -14
- package/vendor/rbxutil/concur/init.luau +542 -542
- package/vendor/rbxutil/concur/init.test.luau +364 -364
- package/vendor/rbxutil/concur/wally.toml +8 -8
- package/vendor/rbxutil/enum-list/init.luau +101 -101
- package/vendor/rbxutil/enum-list/init.test.luau +91 -91
- package/vendor/rbxutil/enum-list/wally.toml +8 -8
- package/vendor/rbxutil/find/index.d.ts +20 -20
- package/vendor/rbxutil/find/init.luau +44 -44
- package/vendor/rbxutil/find/package.json +17 -17
- package/vendor/rbxutil/find/wally.toml +8 -8
- package/vendor/rbxutil/input/Gamepad.luau +559 -559
- package/vendor/rbxutil/input/Keyboard.luau +124 -124
- package/vendor/rbxutil/input/Mouse.luau +278 -278
- package/vendor/rbxutil/input/PreferredInput.luau +91 -91
- package/vendor/rbxutil/input/Touch.luau +120 -120
- package/vendor/rbxutil/input/init.luau +33 -33
- package/vendor/rbxutil/input/wally.toml +12 -12
- package/vendor/rbxutil/loader/index.d.ts +15 -15
- package/vendor/rbxutil/loader/init.luau +137 -137
- package/vendor/rbxutil/loader/wally.toml +8 -8
- package/vendor/rbxutil/log/index.d.ts +38 -38
- package/vendor/rbxutil/log/init.luau +746 -746
- package/vendor/rbxutil/log/wally.toml +8 -8
- package/vendor/rbxutil/net/init.luau +190 -190
- package/vendor/rbxutil/net/wally.toml +8 -8
- package/vendor/rbxutil/option/index.d.ts +44 -44
- package/vendor/rbxutil/option/init.luau +489 -489
- package/vendor/rbxutil/option/init.test.luau +342 -342
- package/vendor/rbxutil/option/wally.toml +8 -8
- package/vendor/rbxutil/pid/index.d.ts +53 -53
- package/vendor/rbxutil/pid/init.luau +195 -195
- package/vendor/rbxutil/pid/package.json +16 -16
- package/vendor/rbxutil/pid/wally.toml +9 -9
- package/vendor/rbxutil/quaternion/index.d.ts +117 -117
- package/vendor/rbxutil/quaternion/init.luau +570 -570
- package/vendor/rbxutil/quaternion/package.json +16 -16
- package/vendor/rbxutil/quaternion/wally.toml +9 -9
- package/vendor/rbxutil/query/index.d.ts +43 -43
- package/vendor/rbxutil/query/init.luau +117 -117
- package/vendor/rbxutil/query/package.json +18 -18
- package/vendor/rbxutil/query/wally.toml +9 -9
- package/vendor/rbxutil/sequent/index.d.ts +28 -28
- package/vendor/rbxutil/sequent/init.luau +340 -340
- package/vendor/rbxutil/sequent/package.json +16 -16
- package/vendor/rbxutil/sequent/wally.toml +9 -9
- package/vendor/rbxutil/ser/init.luau +175 -175
- package/vendor/rbxutil/ser/init.test.luau +50 -50
- package/vendor/rbxutil/ser/wally.toml +11 -11
- package/vendor/rbxutil/shake/index.d.ts +36 -36
- package/vendor/rbxutil/shake/init.luau +532 -532
- package/vendor/rbxutil/shake/init.test.luau +267 -267
- package/vendor/rbxutil/shake/package.json +16 -16
- package/vendor/rbxutil/shake/wally.toml +9 -9
- package/vendor/rbxutil/signal/index.d.ts +100 -100
- package/vendor/rbxutil/signal/init.luau +432 -432
- package/vendor/rbxutil/signal/init.test.luau +190 -190
- package/vendor/rbxutil/signal/package.json +17 -17
- package/vendor/rbxutil/signal/wally.toml +9 -9
- package/vendor/rbxutil/silo/TableWatcher.luau +65 -65
- package/vendor/rbxutil/silo/Util.luau +55 -55
- package/vendor/rbxutil/silo/init.luau +338 -338
- package/vendor/rbxutil/silo/init.test.luau +215 -215
- package/vendor/rbxutil/silo/wally.toml +8 -8
- package/vendor/rbxutil/spring/index.d.ts +40 -40
- package/vendor/rbxutil/spring/init.luau +97 -97
- package/vendor/rbxutil/spring/package.json +17 -17
- package/vendor/rbxutil/spring/wally.toml +8 -8
- package/vendor/rbxutil/stream/index.d.ts +88 -88
- package/vendor/rbxutil/stream/init.luau +597 -597
- package/vendor/rbxutil/stream/package.json +18 -18
- package/vendor/rbxutil/stream/wally.toml +9 -9
- package/vendor/rbxutil/streamable/Streamable.luau +202 -202
- package/vendor/rbxutil/streamable/StreamableUtil.luau +80 -80
- package/vendor/rbxutil/streamable/init.luau +8 -8
- package/vendor/rbxutil/streamable/wally.toml +12 -12
- package/vendor/rbxutil/symbol/init.luau +56 -56
- package/vendor/rbxutil/symbol/init.test.luau +37 -37
- package/vendor/rbxutil/symbol/wally.toml +8 -8
- package/vendor/rbxutil/table-util/init.luau +938 -938
- package/vendor/rbxutil/table-util/init.test.luau +439 -439
- package/vendor/rbxutil/task-queue/index.d.ts +27 -27
- package/vendor/rbxutil/task-queue/init.luau +97 -97
- package/vendor/rbxutil/task-queue/wally.toml +8 -8
- package/vendor/rbxutil/timer/index.d.ts +81 -81
- package/vendor/rbxutil/timer/init.luau +249 -249
- package/vendor/rbxutil/timer/init.test.luau +73 -73
- package/vendor/rbxutil/timer/wally.toml +11 -11
- package/vendor/rbxutil/tree/index.d.ts +15 -15
- package/vendor/rbxutil/tree/init.luau +137 -137
- package/vendor/rbxutil/tree/wally.toml +8 -8
- package/vendor/rbxutil/trove/index.d.ts +46 -46
- package/vendor/rbxutil/trove/init.luau +787 -787
- package/vendor/rbxutil/trove/init.test.luau +203 -203
- package/vendor/rbxutil/trove/wally.toml +8 -8
- package/vendor/rbxutil/typed-remote/init.luau +196 -196
- package/vendor/rbxutil/typed-remote/wally.toml +8 -8
- package/vendor/rbxutil/wait-for/index.d.ts +17 -17
- package/vendor/rbxutil/wait-for/init.luau +257 -257
- package/vendor/rbxutil/wait-for/init.test.luau +182 -182
- package/vendor/rbxutil/wait-for/wally.toml +11 -11
- package/vendor/t/t.lua +1350 -1350
- package/vendor/testez/Context.lua +26 -26
- package/vendor/testez/Expectation.lua +311 -311
- package/vendor/testez/ExpectationContext.lua +38 -38
- package/vendor/testez/LifecycleHooks.lua +89 -89
- package/vendor/testez/Reporters/TeamCityReporter.lua +101 -101
- package/vendor/testez/Reporters/TextReporter.lua +105 -105
- package/vendor/testez/Reporters/TextReporterQuiet.lua +96 -96
- package/vendor/testez/TestBootstrap.lua +146 -146
- package/vendor/testez/TestEnum.lua +27 -27
- package/vendor/testez/TestPlan.lua +304 -304
- package/vendor/testez/TestPlanner.lua +39 -39
- package/vendor/testez/TestResults.lua +111 -111
- package/vendor/testez/TestRunner.lua +188 -188
- package/vendor/testez/TestSession.lua +243 -243
- package/vendor/testez/init.lua +39 -39
|
@@ -1,94 +1,94 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Constructs and returns a new For state object which processes values and
|
|
8
|
-
preserves keys.
|
|
9
|
-
|
|
10
|
-
https://elttob.uk/Fusion/0.3/api-reference/state/members/forvalues/
|
|
11
|
-
|
|
12
|
-
TODO: the sub objects constructed here can be more efficiently implemented
|
|
13
|
-
as a dedicated state object.
|
|
14
|
-
]]
|
|
15
|
-
|
|
16
|
-
local Package = script.Parent.Parent
|
|
17
|
-
local Types = require(Package.Types)
|
|
18
|
-
local External = require(Package.External)
|
|
19
|
-
-- State
|
|
20
|
-
local For = require(Package.State.For)
|
|
21
|
-
local Value = require(Package.State.Value)
|
|
22
|
-
local Computed = require(Package.State.Computed)
|
|
23
|
-
local ForTypes = require(Package.State.For.ForTypes)
|
|
24
|
-
-- Logging
|
|
25
|
-
local parseError = require(Package.Logging.parseError)
|
|
26
|
-
-- Memory
|
|
27
|
-
local doCleanup = require(Package.Memory.doCleanup)
|
|
28
|
-
|
|
29
|
-
local SUB_OBJECT_META = {
|
|
30
|
-
__index = {
|
|
31
|
-
roamKeys = true,
|
|
32
|
-
roamValues = false,
|
|
33
|
-
invalidateInputKey = function(self): ()
|
|
34
|
-
-- do nothing
|
|
35
|
-
end,
|
|
36
|
-
invalidateInputValue = function(self): ()
|
|
37
|
-
self._inputValueState:set(self.inputValue)
|
|
38
|
-
end,
|
|
39
|
-
useOutputPair = function(self, use)
|
|
40
|
-
return self.inputKey, use(self._outputValueState)
|
|
41
|
-
end
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
local function SubObject<K, VI, VO, S>(
|
|
46
|
-
scope: Types.Scope<S>,
|
|
47
|
-
initialKey: K,
|
|
48
|
-
initialValue: VI,
|
|
49
|
-
processor: (Types.Use, Types.Scope<S>, VI) -> VO
|
|
50
|
-
): ForTypes.SubObject<S, K, K, VI, VO>
|
|
51
|
-
local self = {}
|
|
52
|
-
self.maybeScope = scope
|
|
53
|
-
self.inputKey = initialKey
|
|
54
|
-
self.inputValue = initialValue
|
|
55
|
-
self._inputValueState = Value(scope, initialValue)
|
|
56
|
-
self._processor = processor
|
|
57
|
-
self._outputValueState = Computed(scope, function(use, scope): VO?
|
|
58
|
-
local inputValue = use(self._inputValueState)
|
|
59
|
-
local ok, outputValue = xpcall(self._processor, parseError, use, scope, inputValue)
|
|
60
|
-
if ok then
|
|
61
|
-
return outputValue
|
|
62
|
-
else
|
|
63
|
-
local error: Types.Error = outputValue :: any
|
|
64
|
-
error.context = `while processing value {tostring(inputValue)}`
|
|
65
|
-
External.logErrorNonFatal("callbackError", error)
|
|
66
|
-
doCleanup(scope)
|
|
67
|
-
table.clear(scope)
|
|
68
|
-
return nil
|
|
69
|
-
end
|
|
70
|
-
end)
|
|
71
|
-
return setmetatable(self, SUB_OBJECT_META) :: any
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
local function ForValues<K, VI, VO, S>(
|
|
75
|
-
scope: Types.Scope<S>,
|
|
76
|
-
inputTable: Types.UsedAs<{[K]: VI}>,
|
|
77
|
-
processor: (Types.Use, Types.Scope<S>, VI) -> VO,
|
|
78
|
-
destructor: unknown?
|
|
79
|
-
): Types.For<K, VO>
|
|
80
|
-
if typeof(inputTable) == "function" then
|
|
81
|
-
External.logError("scopeMissing", nil, "ForValues", "myScope:ForValues(inputTable, function(scope, use, value) ... end)")
|
|
82
|
-
elseif destructor ~= nil then
|
|
83
|
-
External.logWarn("destructorRedundant", "ForValues")
|
|
84
|
-
end
|
|
85
|
-
return For(
|
|
86
|
-
scope,
|
|
87
|
-
inputTable,
|
|
88
|
-
function(scope, initialKey, initialValue)
|
|
89
|
-
return SubObject(scope, initialKey, initialValue, processor)
|
|
90
|
-
end
|
|
91
|
-
)
|
|
92
|
-
end
|
|
93
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Constructs and returns a new For state object which processes values and
|
|
8
|
+
preserves keys.
|
|
9
|
+
|
|
10
|
+
https://elttob.uk/Fusion/0.3/api-reference/state/members/forvalues/
|
|
11
|
+
|
|
12
|
+
TODO: the sub objects constructed here can be more efficiently implemented
|
|
13
|
+
as a dedicated state object.
|
|
14
|
+
]]
|
|
15
|
+
|
|
16
|
+
local Package = script.Parent.Parent
|
|
17
|
+
local Types = require(Package.Types)
|
|
18
|
+
local External = require(Package.External)
|
|
19
|
+
-- State
|
|
20
|
+
local For = require(Package.State.For)
|
|
21
|
+
local Value = require(Package.State.Value)
|
|
22
|
+
local Computed = require(Package.State.Computed)
|
|
23
|
+
local ForTypes = require(Package.State.For.ForTypes)
|
|
24
|
+
-- Logging
|
|
25
|
+
local parseError = require(Package.Logging.parseError)
|
|
26
|
+
-- Memory
|
|
27
|
+
local doCleanup = require(Package.Memory.doCleanup)
|
|
28
|
+
|
|
29
|
+
local SUB_OBJECT_META = {
|
|
30
|
+
__index = {
|
|
31
|
+
roamKeys = true,
|
|
32
|
+
roamValues = false,
|
|
33
|
+
invalidateInputKey = function(self): ()
|
|
34
|
+
-- do nothing
|
|
35
|
+
end,
|
|
36
|
+
invalidateInputValue = function(self): ()
|
|
37
|
+
self._inputValueState:set(self.inputValue)
|
|
38
|
+
end,
|
|
39
|
+
useOutputPair = function(self, use)
|
|
40
|
+
return self.inputKey, use(self._outputValueState)
|
|
41
|
+
end
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
local function SubObject<K, VI, VO, S>(
|
|
46
|
+
scope: Types.Scope<S>,
|
|
47
|
+
initialKey: K,
|
|
48
|
+
initialValue: VI,
|
|
49
|
+
processor: (Types.Use, Types.Scope<S>, VI) -> VO
|
|
50
|
+
): ForTypes.SubObject<S, K, K, VI, VO>
|
|
51
|
+
local self = {}
|
|
52
|
+
self.maybeScope = scope
|
|
53
|
+
self.inputKey = initialKey
|
|
54
|
+
self.inputValue = initialValue
|
|
55
|
+
self._inputValueState = Value(scope, initialValue)
|
|
56
|
+
self._processor = processor
|
|
57
|
+
self._outputValueState = Computed(scope, function(use, scope): VO?
|
|
58
|
+
local inputValue = use(self._inputValueState)
|
|
59
|
+
local ok, outputValue = xpcall(self._processor, parseError, use, scope, inputValue)
|
|
60
|
+
if ok then
|
|
61
|
+
return outputValue
|
|
62
|
+
else
|
|
63
|
+
local error: Types.Error = outputValue :: any
|
|
64
|
+
error.context = `while processing value {tostring(inputValue)}`
|
|
65
|
+
External.logErrorNonFatal("callbackError", error)
|
|
66
|
+
doCleanup(scope)
|
|
67
|
+
table.clear(scope)
|
|
68
|
+
return nil
|
|
69
|
+
end
|
|
70
|
+
end)
|
|
71
|
+
return setmetatable(self, SUB_OBJECT_META) :: any
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
local function ForValues<K, VI, VO, S>(
|
|
75
|
+
scope: Types.Scope<S>,
|
|
76
|
+
inputTable: Types.UsedAs<{[K]: VI}>,
|
|
77
|
+
processor: (Types.Use, Types.Scope<S>, VI) -> VO,
|
|
78
|
+
destructor: unknown?
|
|
79
|
+
): Types.For<K, VO>
|
|
80
|
+
if typeof(inputTable) == "function" then
|
|
81
|
+
External.logError("scopeMissing", nil, "ForValues", "myScope:ForValues(inputTable, function(scope, use, value) ... end)")
|
|
82
|
+
elseif destructor ~= nil then
|
|
83
|
+
External.logWarn("destructorRedundant", "ForValues")
|
|
84
|
+
end
|
|
85
|
+
return For(
|
|
86
|
+
scope,
|
|
87
|
+
inputTable,
|
|
88
|
+
function(scope, initialKey, initialValue)
|
|
89
|
+
return SubObject(scope, initialKey, initialValue, processor)
|
|
90
|
+
end
|
|
91
|
+
)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
94
|
return ForValues :: Types.ForValuesConstructor
|
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
A state object which allows regular Luau code to control its value.
|
|
8
|
-
|
|
9
|
-
https://elttob.uk/Fusion/0.3/api-reference/state/types/value/
|
|
10
|
-
]]
|
|
11
|
-
|
|
12
|
-
local Package = script.Parent.Parent
|
|
13
|
-
local Types = require(Package.Types)
|
|
14
|
-
local External = require(Package.External)
|
|
15
|
-
-- Graph
|
|
16
|
-
local change = require(Package.Graph.change)
|
|
17
|
-
-- Utility
|
|
18
|
-
local isSimilar = require(Package.Utility.isSimilar)
|
|
19
|
-
local never = require(Package.Utility.never)
|
|
20
|
-
local nicknames = require(Package.Utility.nicknames)
|
|
21
|
-
|
|
22
|
-
type Self<T, S> = Types.Value<T, S>
|
|
23
|
-
|
|
24
|
-
local class = {}
|
|
25
|
-
class.type = "State"
|
|
26
|
-
class.kind = "Value"
|
|
27
|
-
class.timeliness = "lazy"
|
|
28
|
-
class.dependencySet = table.freeze {}
|
|
29
|
-
|
|
30
|
-
local METATABLE = table.freeze {__index = class}
|
|
31
|
-
|
|
32
|
-
local function Value<T>(
|
|
33
|
-
scope: Types.Scope<unknown>,
|
|
34
|
-
initialValue: T
|
|
35
|
-
): Types.Value<T, any>
|
|
36
|
-
local createdAt = os.clock()
|
|
37
|
-
if initialValue == nil and (typeof(scope) ~= "table" or (scope[1] == nil and next(scope) ~= nil)) then
|
|
38
|
-
External.logError("scopeMissing", nil, "Value", "myScope:Value(initialValue)")
|
|
39
|
-
end
|
|
40
|
-
local self: Self<T, any> = setmetatable(
|
|
41
|
-
{
|
|
42
|
-
createdAt = createdAt,
|
|
43
|
-
dependentSet = {},
|
|
44
|
-
lastChange = os.clock(),
|
|
45
|
-
scope = scope,
|
|
46
|
-
validity = "valid",
|
|
47
|
-
_EXTREMELY_DANGEROUS_usedAsValue = initialValue
|
|
48
|
-
},
|
|
49
|
-
METATABLE
|
|
50
|
-
) :: any
|
|
51
|
-
local destroy = function()
|
|
52
|
-
self.scope = nil
|
|
53
|
-
end
|
|
54
|
-
self.oldestTask = destroy
|
|
55
|
-
nicknames[self.oldestTask] = "Value"
|
|
56
|
-
table.insert(scope, destroy)
|
|
57
|
-
return self
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
function class:get<T, S>(
|
|
61
|
-
_self: Self<T, S>
|
|
62
|
-
): never
|
|
63
|
-
External.logError("stateGetWasRemoved")
|
|
64
|
-
return never()
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
function class.set<T, S>(
|
|
68
|
-
self: Self<T, S>,
|
|
69
|
-
newValue: S
|
|
70
|
-
): S
|
|
71
|
-
local oldValue = self._EXTREMELY_DANGEROUS_usedAsValue
|
|
72
|
-
if not isSimilar(oldValue, newValue) then
|
|
73
|
-
self._EXTREMELY_DANGEROUS_usedAsValue = newValue :: any
|
|
74
|
-
change(self)
|
|
75
|
-
end
|
|
76
|
-
return newValue
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
function class._evaluate<T, S>(
|
|
80
|
-
_self: Self<T, S>
|
|
81
|
-
): boolean
|
|
82
|
-
-- The similarity test is done in advance when the value is set, so this
|
|
83
|
-
-- should be fine.
|
|
84
|
-
return true
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
table.freeze(class)
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
A state object which allows regular Luau code to control its value.
|
|
8
|
+
|
|
9
|
+
https://elttob.uk/Fusion/0.3/api-reference/state/types/value/
|
|
10
|
+
]]
|
|
11
|
+
|
|
12
|
+
local Package = script.Parent.Parent
|
|
13
|
+
local Types = require(Package.Types)
|
|
14
|
+
local External = require(Package.External)
|
|
15
|
+
-- Graph
|
|
16
|
+
local change = require(Package.Graph.change)
|
|
17
|
+
-- Utility
|
|
18
|
+
local isSimilar = require(Package.Utility.isSimilar)
|
|
19
|
+
local never = require(Package.Utility.never)
|
|
20
|
+
local nicknames = require(Package.Utility.nicknames)
|
|
21
|
+
|
|
22
|
+
type Self<T, S> = Types.Value<T, S>
|
|
23
|
+
|
|
24
|
+
local class = {}
|
|
25
|
+
class.type = "State"
|
|
26
|
+
class.kind = "Value"
|
|
27
|
+
class.timeliness = "lazy"
|
|
28
|
+
class.dependencySet = table.freeze {}
|
|
29
|
+
|
|
30
|
+
local METATABLE = table.freeze {__index = class}
|
|
31
|
+
|
|
32
|
+
local function Value<T>(
|
|
33
|
+
scope: Types.Scope<unknown>,
|
|
34
|
+
initialValue: T
|
|
35
|
+
): Types.Value<T, any>
|
|
36
|
+
local createdAt = os.clock()
|
|
37
|
+
if initialValue == nil and (typeof(scope) ~= "table" or (scope[1] == nil and next(scope) ~= nil)) then
|
|
38
|
+
External.logError("scopeMissing", nil, "Value", "myScope:Value(initialValue)")
|
|
39
|
+
end
|
|
40
|
+
local self: Self<T, any> = setmetatable(
|
|
41
|
+
{
|
|
42
|
+
createdAt = createdAt,
|
|
43
|
+
dependentSet = {},
|
|
44
|
+
lastChange = os.clock(),
|
|
45
|
+
scope = scope,
|
|
46
|
+
validity = "valid",
|
|
47
|
+
_EXTREMELY_DANGEROUS_usedAsValue = initialValue
|
|
48
|
+
},
|
|
49
|
+
METATABLE
|
|
50
|
+
) :: any
|
|
51
|
+
local destroy = function()
|
|
52
|
+
self.scope = nil
|
|
53
|
+
end
|
|
54
|
+
self.oldestTask = destroy
|
|
55
|
+
nicknames[self.oldestTask] = "Value"
|
|
56
|
+
table.insert(scope, destroy)
|
|
57
|
+
return self
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
function class:get<T, S>(
|
|
61
|
+
_self: Self<T, S>
|
|
62
|
+
): never
|
|
63
|
+
External.logError("stateGetWasRemoved")
|
|
64
|
+
return never()
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
function class.set<T, S>(
|
|
68
|
+
self: Self<T, S>,
|
|
69
|
+
newValue: S
|
|
70
|
+
): S
|
|
71
|
+
local oldValue = self._EXTREMELY_DANGEROUS_usedAsValue
|
|
72
|
+
if not isSimilar(oldValue, newValue) then
|
|
73
|
+
self._EXTREMELY_DANGEROUS_usedAsValue = newValue :: any
|
|
74
|
+
change(self)
|
|
75
|
+
end
|
|
76
|
+
return newValue
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
function class._evaluate<T, S>(
|
|
80
|
+
_self: Self<T, S>
|
|
81
|
+
): boolean
|
|
82
|
+
-- The similarity test is done in advance when the value is set, so this
|
|
83
|
+
-- should be fine.
|
|
84
|
+
return true
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
table.freeze(class)
|
|
88
88
|
return Value :: Types.ValueConstructor
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Returns the input *only* if it is a state object.
|
|
8
|
-
]]
|
|
9
|
-
|
|
10
|
-
local Package = script.Parent.Parent
|
|
11
|
-
local Types = require(Package.Types)
|
|
12
|
-
|
|
13
|
-
local function castToState<T>(
|
|
14
|
-
target: Types.UsedAs<T>
|
|
15
|
-
): Types.StateObject<T>?
|
|
16
|
-
if
|
|
17
|
-
typeof(target) == "table" and
|
|
18
|
-
target.type == "State"
|
|
19
|
-
then
|
|
20
|
-
return target
|
|
21
|
-
else
|
|
22
|
-
return nil
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Returns the input *only* if it is a state object.
|
|
8
|
+
]]
|
|
9
|
+
|
|
10
|
+
local Package = script.Parent.Parent
|
|
11
|
+
local Types = require(Package.Types)
|
|
12
|
+
|
|
13
|
+
local function castToState<T>(
|
|
14
|
+
target: Types.UsedAs<T>
|
|
15
|
+
): Types.StateObject<T>?
|
|
16
|
+
if
|
|
17
|
+
typeof(target) == "table" and
|
|
18
|
+
target.type == "State"
|
|
19
|
+
then
|
|
20
|
+
return target
|
|
21
|
+
else
|
|
22
|
+
return nil
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
26
|
return castToState
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Extracts a value of type T from its input.
|
|
8
|
-
|
|
9
|
-
https://elttob.uk/Fusion/0.3/api-reference/state/members/peek/
|
|
10
|
-
]]
|
|
11
|
-
|
|
12
|
-
local Package = script.Parent.Parent
|
|
13
|
-
local Types = require(Package.Types)
|
|
14
|
-
-- State
|
|
15
|
-
local castToState = require(Package.State.castToState)
|
|
16
|
-
-- Graph
|
|
17
|
-
local evaluate = require(Package.Graph.evaluate)
|
|
18
|
-
|
|
19
|
-
local function peek<T>(
|
|
20
|
-
target: Types.UsedAs<T>
|
|
21
|
-
): T
|
|
22
|
-
local targetState = castToState(target)
|
|
23
|
-
if targetState ~= nil then
|
|
24
|
-
evaluate(targetState, false)
|
|
25
|
-
return targetState._EXTREMELY_DANGEROUS_usedAsValue :: T
|
|
26
|
-
else
|
|
27
|
-
return target :: T
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Extracts a value of type T from its input.
|
|
8
|
+
|
|
9
|
+
https://elttob.uk/Fusion/0.3/api-reference/state/members/peek/
|
|
10
|
+
]]
|
|
11
|
+
|
|
12
|
+
local Package = script.Parent.Parent
|
|
13
|
+
local Types = require(Package.Types)
|
|
14
|
+
-- State
|
|
15
|
+
local castToState = require(Package.State.castToState)
|
|
16
|
+
-- Graph
|
|
17
|
+
local evaluate = require(Package.Graph.evaluate)
|
|
18
|
+
|
|
19
|
+
local function peek<T>(
|
|
20
|
+
target: Types.UsedAs<T>
|
|
21
|
+
): T
|
|
22
|
+
local targetState = castToState(target)
|
|
23
|
+
if targetState ~= nil then
|
|
24
|
+
evaluate(targetState, false)
|
|
25
|
+
return targetState._EXTREMELY_DANGEROUS_usedAsValue :: T
|
|
26
|
+
else
|
|
27
|
+
return target :: T
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
31
|
return peek
|