Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local meta = {}
- -- Create a Group metatable
- function Group( group )
- local ret = setmetatable( group or {}, meta )
- ret.count = 0
- ret.funcs = {}
- ret.args = {}
- ret.instant = false
- return ret
- end
- -- Create a Group metatable which will run the functions instantly
- function GroupInstant( group )
- local ret = setmetatable( group or {}, meta )
- ret.count = 0
- ret.funcs = {}
- ret.args = {}
- ret.instant = true
- return ret
- end
- -- If the Group is Instant, use this
- meta._run_now = function( self, ... )
- local ret = {}
- local key = self.key -- Get string key
- self.key = nil
- for i=1,#self do
- local obj = self[i]
- ret[i] = { obj[key]( obj, ... ) } -- Call function, save returns
- end
- return ret
- end
- -- If the Group is normal, use this
- meta._run_later = function( self, ... )
- self.args[self.count] = { ... } -- Add arguments to buffer
- end
- local rawget = rawget
- meta.__index = function( self,key )
- if (rawget(self,key) != nil) then
- return rawget( self,key )-- The Group has this function or variable, get it.
- elseif (rawget(meta, key) != nil) then
- return rawget( meta,key )-- The metatable has this function or variable, get it.
- else -- This function is to be run on the objs
- if (self.instant) then -- The Group is instant, run now
- self.key = key -- temporary variable
- return self._run_now
- else -- The Group is normal, add to buffer
- self.count = self.count + 1
- self.funcs[self.count] = key
- return self._run_later
- end
- end
- end
- meta.__call = function( self, func )
- self.count = self.count + 1
- self.funcs[self.count] = func
- end
- -- Run function, used by normal Groups
- meta.Run = function( self )
- local ret = {}
- local runid = self.count <= 10 and self.count or "more"
- for i=1, #self do
- local obj = self[i]
- ret[i] = self["_run"..runid]( self, obj ) -- Call function(s), get return(s)
- end
- -- Reset buffers
- self.funcs = {}
- self.args = {}
- return ret
- end
- -- Add an obj to the Group
- meta.__add = function( self, op2 )
- self[#self+1] = op2
- end
- -- Remove an obj from the Group
- meta.__sub = function( self, op2 )
- for i=#self,1,-1 do
- if (self[i] == op2) then
- table.remove( self, i )
- end
- end
- end
- -- Helper function for below
- local function run( self, obj, idx )
- local func = self.funcs[idx]
- if (type(func) == "string") then
- return obj[func](obj,unpack(self.args[idx]))
- else
- return func(obj)
- end
- end
- -- _run functions used by normal Groups (by the Run function)
- meta._run1 = function( self, obj )
- return { run( self,obj,1 ) }
- end
- meta._run2 = function( self, obj )
- local ret = {}
- ret[1] = { run( self,obj,1 ) }
- ret[2] = { run( self,obj,2 ) }
- return ret
- end
- meta._run3 = function( self, obj )
- local ret = {}
- ret[1] = { run( self,obj,1 ) }
- ret[2] = { run( self,obj,2 ) }
- ret[3] = { run( self,obj,3 ) }
- return ret
- end
- meta._run4 = function( self, obj )
- local ret = {}
- ret[1] = { run( self,obj,1 ) }
- ret[2] = { run( self,obj,2 ) }
- ret[3] = { run( self,obj,3 ) }
- ret[4] = { run( self,obj,4 ) }
- return ret
- end
- meta._run5 = function( self, obj )
- local ret = {}
- ret[1] = { run( self,obj,1 ) }
- ret[2] = { run( self,obj,2 ) }
- ret[3] = { run( self,obj,3 ) }
- ret[4] = { run( self,obj,4 ) }
- ret[5] = { run( self,obj,5 ) }
- return ret
- end
- meta._run6 = function( self, obj )
- local ret = {}
- ret[1] = { run( self,obj,1 ) }
- ret[2] = { run( self,obj,2 ) }
- ret[3] = { run( self,obj,3 ) }
- ret[4] = { run( self,obj,4 ) }
- ret[5] = { run( self,obj,5 ) }
- ret[6] = { run( self,obj,6 ) }
- end
- meta._run7 = function( self, obj )
- local ret = {}
- ret[1] = { run( self,obj,1 ) }
- ret[2] = { run( self,obj,2 ) }
- ret[3] = { run( self,obj,3 ) }
- ret[4] = { run( self,obj,4 ) }
- ret[5] = { run( self,obj,5 ) }
- ret[6] = { run( self,obj,6 ) }
- ret[7] = { run( self,obj,7 ) }
- return ret
- end
- meta._run8 = function( self, obj )
- local ret = {}
- ret[1] = { run( self,obj,1 ) }
- ret[2] = { run( self,obj,2 ) }
- ret[3] = { run( self,obj,3 ) }
- ret[4] = { run( self,obj,4 ) }
- ret[5] = { run( self,obj,5 ) }
- ret[6] = { run( self,obj,6 ) }
- ret[7] = { run( self,obj,7 ) }
- ret[8] = { run( self,obj,8 ) }
- return ret
- end
- meta._run9 = function( self, obj )
- local ret = {}
- ret[1] = { run( self,obj,1 ) }
- ret[2] = { run( self,obj,2 ) }
- ret[3] = { run( self,obj,3 ) }
- ret[4] = { run( self,obj,4 ) }
- ret[5] = { run( self,obj,5 ) }
- ret[6] = { run( self,obj,6 ) }
- ret[7] = { run( self,obj,7 ) }
- ret[8] = { run( self,obj,8 ) }
- ret[9] = { run( self,obj,9 ) }
- return ret
- end
- meta._run10 = function( self, obj )
- local ret = {}
- ret[1] = { run( self,obj,1 ) }
- ret[2] = { run( self,obj,2 ) }
- ret[3] = { run( self,obj,3 ) }
- ret[4] = { run( self,obj,4 ) }
- ret[5] = { run( self,obj,5 ) }
- ret[6] = { run( self,obj,6 ) }
- ret[7] = { run( self,obj,7 ) }
- ret[8] = { run( self,obj,8 ) }
- ret[9] = { run( self,obj,9 ) }
- ret[10] = { run( self,obj,10 ) }
- return ret
- end
- -- If we have more than 10 functions, run them in a secondary loop
- meta._runmore = function( self, obj )
- local ret = {}
- for i=1,self.count do
- ret[i] = { run( self,obj,i ) }
- end
- return ret
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement