-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathfunction.lua
58 lines (56 loc) · 2.34 KB
/
function.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
-- Extensions for functions
do
local _dgi = debug.getinfo
-- (function (arg1, arg2) end):bind(value for arg1, value for arg2)
-- this way calls should be faster than merging tables on-fly
debug.setmetatable(function()end, {
__index = {
bind = function(s, ...)
local a = {...}
if #a == 0 then
return s
end
local i = _dgi(s)
if not i.isvararg then
if i.nparams == 0 then return s end
if i.nparams == 1 then return function() return s(a[1]) end end
if i.nparams == 2 then
if #a == 1 then return function(a0) return s(a[1], a0) end
else return function() return s(a[1], a[2]) end end
end
if i.nparams == 3 then
if #a == 1 then return function(a0, a1) return s(a[1], a0, a1) end
elseif #a == 2 then return function(a0) return s(a[1], a[2], a0) end
else return function() return s(a[1], a[2], a[3]) end end
end
if i.nparams == 4 then
if #a == 1 then return function(a0, a1, a2) return s(a[1], a0, a1, a2) end
elseif #a == 2 then return function(a0, a1) return s(a[1], a[2], a0, a1) end
elseif #a == 3 then return function(a0) return s(a[1], a[2], a[3], a0) end
else return function() return s(a[1], a[2], a[3], a[4]) end end
end
end
if #a == 1 then return function(...) return s(a[1], ...) end end
if #a == 2 then return function(...) return s(a[1], a[2], ...) end end
if #a == 3 then return function(...) return s(a[1], a[2], a[3], ...) end end
if #a == 4 then return function(...) return s(a[1], a[2], a[3], a[4], ...) end end
if #a == 5 then return function(...) return s(a[1], a[2], a[3], a[4], a[5], ...) end end
error('Not supported', 2)
end,
},
__pow = function (s, arg)
local i = _dgi(s)
if i.isvararg or i.nparams > 3 then
return function (...) return s(arg, ...) end
elseif i.nparams == 1 then
return function () return s(arg) end
elseif i.nparams == 2 then
return function (a0) return s(arg, a0) end
elseif i.nparams == 3 then
return function (a0, a1) return s(arg, a0, a1) end
else
return s
end
end
})
end