Guest User

Untitled

a guest
Jun 18th, 2021
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.41 KB | None | 0 0
  1. local Enum = {
  2.     new = function(self, p)
  3.         assert( type(p) == "table", "An enum can not be initialized empty")
  4.  
  5.         local enumObject = {
  6.             container = {},
  7.             data = {
  8.                 getIndexByName = function(self, name)
  9.                     for i = 1, #self do
  10.                         if self[i].name == name then
  11.                             return i
  12.                         end
  13.                     end
  14.                 end,
  15.  
  16.                 getIndexByValue = function(self, value)
  17.                     for i = 1, #self do
  18.                         if self[i].value == value then
  19.                             return i
  20.                         end
  21.                     end
  22.                 end
  23.             },
  24.  
  25.             init = function(self)
  26.                 local index = 0
  27.  
  28.                 for k, v in pairs(p) do
  29.                     assert(type(k) == "number", "NotANumberKeyError")
  30.  
  31.                     index = index + 1
  32.  
  33.                     k = type(k) == "number" and tostring(v) or k
  34.  
  35.                     container[k] = v
  36.                     data[index] = {
  37.                         name = k,
  38.                         value = v
  39.                     }
  40.                 end
  41.  
  42.                 setmetatable(enumObject, {
  43.                     __index = function(t, k)
  44.                         if k ~= "data"  then
  45.                             local contains, name = self:contains(k)
  46.        
  47.                             if contains then
  48.                                 return self[name]
  49.                             end
  50.                         end
  51.  
  52.                         return
  53.                     end
  54.                 })
  55.  
  56.                 self.init = nil
  57.                 return self.container
  58.             end,
  59.  
  60.             contains = function(self, value)
  61.                 for k, v in pairs(enumObject) do
  62.                     if v == value then
  63.                         return true, k
  64.                     end
  65.                 end
  66.        
  67.                 return false
  68.             end,
  69.  
  70.             ordinal = function(self, name)
  71.                 return self.data:getIndexByName(name)
  72.             end,
  73.  
  74.             ordinalByValue = function(self, value)
  75.                 return self.data:getIndexByValue(value)
  76.             end
  77.         }
  78.  
  79.         return enumObject:init()
  80.     end
  81. }
  82.  
  83. setmetatable( Enum, { __call = function(t, s) return Enum:new(s) end } );
  84.  
  85. return Enum
Advertisement
Add Comment
Please, Sign In to add comment