add gs
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
--[[
|
||||
An implementation of an enumerated type in Lua. Creates enumerated
|
||||
types with uniquely identifiable values (using symbol)
|
||||
|
||||
Note that resulting enum object does not associate ordinals with its
|
||||
values, and cannot be iterated through. It can, however, test if a provided
|
||||
value is a member of its set of values with the `isMember` function
|
||||
|
||||
This is valuable for the purchase prompt because it relies heavily on
|
||||
enumerated values to determine things like state and which errors occurred.
|
||||
]]
|
||||
local Symbol = require(script.Parent.Symbol)
|
||||
|
||||
local strict = require(script.Parent.strict)
|
||||
|
||||
--[[
|
||||
Returns a new enum type with the given name.
|
||||
]]
|
||||
local function createEnum(enumName, values)
|
||||
assert(typeof(enumName) == "string", "Bad argument #1, expected string")
|
||||
assert(typeof(values) == "table", "Bad argument #2, expected list of values")
|
||||
|
||||
local enumInternal = {}
|
||||
|
||||
for _, valueName in ipairs(values) do
|
||||
assert(valueName ~= "isMember", "Shadowing 'isMember' function is not allowed")
|
||||
assert(typeof(valueName) == "string", "Only string names are supported for enum types")
|
||||
|
||||
local enumValue = Symbol.named(valueName)
|
||||
local asString = ("%s.%s"):format(enumName, valueName)
|
||||
getmetatable(enumValue).__tostring = function()
|
||||
return asString
|
||||
end
|
||||
|
||||
enumInternal[valueName] = enumValue
|
||||
end
|
||||
|
||||
function enumInternal.isMember(value)
|
||||
if typeof(value) ~= "userdata" then
|
||||
return false
|
||||
end
|
||||
|
||||
for _, enumeratedValue in pairs(enumInternal) do
|
||||
if value == enumeratedValue then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
local enum = newproxy(true)
|
||||
getmetatable(enum).__index = enumInternal
|
||||
|
||||
return strict(enumInternal, enumName)
|
||||
end
|
||||
|
||||
return createEnum
|
||||
Reference in New Issue
Block a user