From 7754f6a90d99fd6108b16d7a6771cfd6c0739544 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Tue, 17 Jul 2018 15:59:23 -0300 Subject: fun: add fun.partial and fun.flip --- src/luarocks/fun.lua | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) 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 @@ --- A set of basic functional utilities local fun = {} +local unpack = table.unpack or unpack + function fun.concat(xs, ys) local rs = {} local n = #xs @@ -63,4 +65,39 @@ function fun.sort_in(t, f) return t end +function fun.flip(f) + return function(a, b) + return f(b, a) + end +end + +function fun.partial(f, ...) + local n = select("#", ...) + if n == 1 then + local a = ... + return function(...) + return f(a, ...) + end + elseif n == 2 then + local a, b = ... + return function(...) + return f(a, b, ...) + end + else + local pargs = { n = n, ... } + return function(...) + local m = select("#", ...) + local fargs = { ... } + local args = {} + for i = 1, n do + args[i] = pargs[i] + end + for i = 1, m do + args[i+n] = fargs[i] + end + return f(table.unpack(args, 1, n+m)) + end + end +end + return fun -- cgit v1.2.3-55-g6feb