Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.57 KB | None | 0 0
  1. local meta = {}
  2.  
  3. -- Create a Group metatable
  4. function Group( group )
  5.     local ret = setmetatable( group or {}, meta )
  6.     ret.count = 0
  7.     ret.funcs = {}
  8.     ret.args = {}
  9.     ret.instant = false
  10.     return ret
  11. end
  12.  
  13. -- Create a Group metatable which will run the functions instantly
  14. function GroupInstant( group )
  15.     local ret = setmetatable( group or {}, meta )
  16.     ret.count = 0
  17.     ret.funcs = {}
  18.     ret.args = {}
  19.     ret.instant = true
  20.     return ret
  21. end
  22.  
  23. -- If the Group is Instant, use this
  24. meta._run_now = function( self, ... )
  25.     local ret = {}
  26.     local key = self.key -- Get string key
  27.     self.key = nil
  28.     for i=1,#self do
  29.         local obj = self[i]
  30.         ret[i] = { obj[key]( obj, ... ) } -- Call function, save returns
  31.     end
  32.     return ret
  33. end
  34.  
  35. -- If the Group is normal, use this
  36. meta._run_later = function( self, ... )
  37.     self.args[self.count] = { ... } -- Add arguments to buffer
  38. end
  39.  
  40. local rawget = rawget
  41.  
  42. meta.__index = function( self,key )
  43.     if (rawget(self,key) != nil) then
  44.         return rawget( self,key )-- The Group has this function or variable, get it.
  45.     elseif (rawget(meta, key) != nil) then
  46.         return rawget( meta,key )-- The metatable has this function or variable, get it.
  47.     else -- This function is to be run on the objs
  48.         if (self.instant) then -- The Group is instant, run now
  49.             self.key = key -- temporary variable
  50.             return self._run_now
  51.         else -- The Group is normal, add to buffer
  52.             self.count = self.count + 1
  53.             self.funcs[self.count] = key
  54.             return self._run_later
  55.         end
  56.     end
  57. end
  58.  
  59. meta.__call = function( self, func )
  60.     self.count = self.count + 1
  61.     self.funcs[self.count] = func
  62. end
  63.  
  64. -- Run function, used by normal Groups
  65. meta.Run = function( self )
  66.     local ret = {}
  67.     local runid = self.count <= 10 and self.count or "more"
  68.     for i=1, #self do
  69.         local obj = self[i]
  70.         ret[i] = self["_run"..runid]( self, obj ) -- Call function(s), get return(s)
  71.     end
  72.    
  73.     -- Reset buffers
  74.     self.funcs = {}
  75.     self.args = {}
  76.    
  77.     return ret
  78. end
  79.  
  80. -- Add an obj to the Group
  81. meta.__add = function( self, op2 )
  82.     self[#self+1] = op2
  83. end
  84.  
  85. -- Remove an obj from the Group
  86. meta.__sub = function( self, op2 )
  87.     for i=#self,1,-1 do
  88.         if (self[i] == op2) then
  89.             table.remove( self, i )
  90.         end
  91.     end
  92. end
  93.  
  94. -- Helper function for below
  95. local function run( self, obj, idx )
  96.     local func = self.funcs[idx]
  97.     if (type(func) == "string") then
  98.         return obj[func](obj,unpack(self.args[idx]))
  99.     else
  100.         return func(obj)
  101.     end
  102. end
  103.  
  104. -- _run functions used by normal Groups (by the Run function)
  105. meta._run1 = function( self, obj )
  106.     return { run( self,obj,1 ) }
  107. end
  108. meta._run2 = function( self, obj )
  109.     local ret = {}
  110.     ret[1] = { run( self,obj,1 ) }
  111.     ret[2] = { run( self,obj,2 ) }
  112.     return ret
  113. end
  114. meta._run3 = function( self, obj )
  115.     local ret = {}
  116.     ret[1] = { run( self,obj,1 ) }
  117.     ret[2] = { run( self,obj,2 ) }
  118.     ret[3] = { run( self,obj,3 ) }
  119.     return ret
  120. end
  121. meta._run4 = function( self, obj )
  122.     local ret = {}
  123.     ret[1] = { run( self,obj,1 ) }
  124.     ret[2] = { run( self,obj,2 ) }
  125.     ret[3] = { run( self,obj,3 ) }
  126.     ret[4] = { run( self,obj,4 ) }
  127.     return ret
  128. end
  129. meta._run5 = function( self, obj )
  130.     local ret = {}
  131.     ret[1] = { run( self,obj,1 ) }
  132.     ret[2] = { run( self,obj,2 ) }
  133.     ret[3] = { run( self,obj,3 ) }
  134.     ret[4] = { run( self,obj,4 ) }
  135.     ret[5] = { run( self,obj,5 ) }
  136.     return ret
  137. end
  138. meta._run6 = function( self, obj )
  139.     local ret = {}
  140.     ret[1] = { run( self,obj,1 ) }
  141.     ret[2] = { run( self,obj,2 ) }
  142.     ret[3] = { run( self,obj,3 ) }
  143.     ret[4] = { run( self,obj,4 ) }
  144.     ret[5] = { run( self,obj,5 ) }
  145.     ret[6] = { run( self,obj,6 ) }
  146. end
  147. meta._run7 = function( self, obj )
  148.     local ret = {}
  149.     ret[1] = { run( self,obj,1 ) }
  150.     ret[2] = { run( self,obj,2 ) }
  151.     ret[3] = { run( self,obj,3 ) }
  152.     ret[4] = { run( self,obj,4 ) }
  153.     ret[5] = { run( self,obj,5 ) }
  154.     ret[6] = { run( self,obj,6 ) }
  155.     ret[7] = { run( self,obj,7 ) }
  156.     return ret
  157. end
  158. meta._run8 = function( self, obj )
  159.     local ret = {}
  160.     ret[1] = { run( self,obj,1 ) }
  161.     ret[2] = { run( self,obj,2 ) }
  162.     ret[3] = { run( self,obj,3 ) }
  163.     ret[4] = { run( self,obj,4 ) }
  164.     ret[5] = { run( self,obj,5 ) }
  165.     ret[6] = { run( self,obj,6 ) }
  166.     ret[7] = { run( self,obj,7 ) }
  167.     ret[8] = { run( self,obj,8 ) }
  168.     return ret
  169. end
  170. meta._run9 = function( self, obj )
  171.     local ret = {}
  172.     ret[1] = { run( self,obj,1 ) }
  173.     ret[2] = { run( self,obj,2 ) }
  174.     ret[3] = { run( self,obj,3 ) }
  175.     ret[4] = { run( self,obj,4 ) }
  176.     ret[5] = { run( self,obj,5 ) }
  177.     ret[6] = { run( self,obj,6 ) }
  178.     ret[7] = { run( self,obj,7 ) }
  179.     ret[8] = { run( self,obj,8 ) }
  180.     ret[9] = { run( self,obj,9 ) }
  181.     return ret
  182. end
  183. meta._run10 = function( self, obj )
  184.     local ret = {}
  185.     ret[1] = { run( self,obj,1 ) }
  186.     ret[2] = { run( self,obj,2 ) }
  187.     ret[3] = { run( self,obj,3 ) }
  188.     ret[4] = { run( self,obj,4 ) }
  189.     ret[5] = { run( self,obj,5 ) }
  190.     ret[6] = { run( self,obj,6 ) }
  191.     ret[7] = { run( self,obj,7 ) }
  192.     ret[8] = { run( self,obj,8 ) }
  193.     ret[9] = { run( self,obj,9 ) }
  194.     ret[10] = { run( self,obj,10 ) }
  195.     return ret
  196. end
  197. -- If we have more than 10 functions, run them in a secondary loop
  198. meta._runmore = function( self, obj )
  199.     local ret = {}
  200.     for i=1,self.count do
  201.         ret[i] = { run( self,obj,i ) }
  202.     end
  203.     return ret
  204. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement