Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Enum = {
- new = function(self, p)
- assert( type(p) == "table", "An enum can not be initialized empty")
- local enumObject = {
- container = {},
- data = {
- getIndexByName = function(self, name)
- for i = 1, #self do
- if self[i].name == name then
- return i
- end
- end
- end,
- getIndexByValue = function(self, value)
- for i = 1, #self do
- if self[i].value == value then
- return i
- end
- end
- end
- },
- init = function(self)
- local index = 0
- for k, v in pairs(p) do
- assert(type(k) == "number", "NotANumberKeyError")
- index = index + 1
- k = type(k) == "number" and tostring(v) or k
- container[k] = v
- data[index] = {
- name = k,
- value = v
- }
- end
- setmetatable(enumObject, {
- __index = function(t, k)
- if k ~= "data" then
- local contains, name = self:contains(k)
- if contains then
- return self[name]
- end
- end
- return
- end
- })
- self.init = nil
- return self.container
- end,
- contains = function(self, value)
- for k, v in pairs(enumObject) do
- if v == value then
- return true, k
- end
- end
- return false
- end,
- ordinal = function(self, name)
- return self.data:getIndexByName(name)
- end,
- ordinalByValue = function(self, value)
- return self.data:getIndexByValue(value)
- end
- }
- return enumObject:init()
- end
- }
- setmetatable( Enum, { __call = function(t, s) return Enum:new(s) end } );
- return Enum
Advertisement
Add Comment
Please, Sign In to add comment