diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/luarocks/fun.lua | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/luarocks/fun.lua b/src/luarocks/fun.lua index dfdf36ed..b1740833 100644 --- a/src/luarocks/fun.lua +++ b/src/luarocks/fun.lua | |||
@@ -2,6 +2,8 @@ | |||
2 | --- A set of basic functional utilities | 2 | --- A set of basic functional utilities |
3 | local fun = {} | 3 | local fun = {} |
4 | 4 | ||
5 | local unpack = table.unpack or unpack | ||
6 | |||
5 | function fun.concat(xs, ys) | 7 | function fun.concat(xs, ys) |
6 | local rs = {} | 8 | local rs = {} |
7 | local n = #xs | 9 | local n = #xs |
@@ -63,4 +65,39 @@ function fun.sort_in(t, f) | |||
63 | return t | 65 | return t |
64 | end | 66 | end |
65 | 67 | ||
68 | function fun.flip(f) | ||
69 | return function(a, b) | ||
70 | return f(b, a) | ||
71 | end | ||
72 | end | ||
73 | |||
74 | function fun.partial(f, ...) | ||
75 | local n = select("#", ...) | ||
76 | if n == 1 then | ||
77 | local a = ... | ||
78 | return function(...) | ||
79 | return f(a, ...) | ||
80 | end | ||
81 | elseif n == 2 then | ||
82 | local a, b = ... | ||
83 | return function(...) | ||
84 | return f(a, b, ...) | ||
85 | end | ||
86 | else | ||
87 | local pargs = { n = n, ... } | ||
88 | return function(...) | ||
89 | local m = select("#", ...) | ||
90 | local fargs = { ... } | ||
91 | local args = {} | ||
92 | for i = 1, n do | ||
93 | args[i] = pargs[i] | ||
94 | end | ||
95 | for i = 1, m do | ||
96 | args[i+n] = fargs[i] | ||
97 | end | ||
98 | return f(table.unpack(args, 1, n+m)) | ||
99 | end | ||
100 | end | ||
101 | end | ||
102 | |||
66 | return fun | 103 | return fun |