68 lines
1.9 KiB
Lua
68 lines
1.9 KiB
Lua
--[[
|
|
A helper function to define a Rodux action creator with an associated name.
|
|
|
|
Normally when creating a Rodux action, you can just create a function:
|
|
|
|
return function(value)
|
|
return {
|
|
type = "MyAction",
|
|
value = value,
|
|
}
|
|
end
|
|
|
|
And then when you check for it in your reducer, you either use a constant,
|
|
or type out the string name:
|
|
|
|
if action.type == "MyAction" then
|
|
-- change some state
|
|
end
|
|
|
|
Typos here are a remarkably common bug. We also have the issue that there's
|
|
no link between reducers and the actions that they respond to!
|
|
|
|
`Action` (this helper) provides a utility that makes this a bit cleaner.
|
|
|
|
Instead, define your Rodux action like this:
|
|
|
|
return Action("MyAction", function(value)
|
|
return {
|
|
value = value,
|
|
}
|
|
end)
|
|
|
|
We no longer need to add the `type` field manually.
|
|
|
|
Additionally, the returned action creator now has a 'name' property that can
|
|
be checked by your reducer:
|
|
|
|
local MyAction = require(Reducers.MyAction)
|
|
|
|
...
|
|
|
|
if action.type == MyAction.name then
|
|
-- change some state!
|
|
end
|
|
|
|
Now we have a clear link between our reducers and the actions they use, and
|
|
if we ever typo a name, we'll get a warning in LuaCheck as well as an error
|
|
at runtime!
|
|
]]
|
|
|
|
return function(name, fn)
|
|
assert(type(name) == "string", "A name must be provided to create an Action")
|
|
assert(type(fn) == "function", "A function must be provided to create an Action")
|
|
|
|
return setmetatable({
|
|
name = name,
|
|
}, {
|
|
__call = function(self, ...)
|
|
local result = fn(...)
|
|
|
|
assert(type(result) == "table", "An action must return a table")
|
|
|
|
result.type = name
|
|
|
|
return result
|
|
end
|
|
})
|
|
end |