From fbb3431367a145e73bd038b0c779fd8355c997b4 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Thu, 28 Mar 2019 23:38:07 -0300 Subject: fun: add find and memoize functions --- src/luarocks/fun.lua | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/luarocks/fun.lua b/src/luarocks/fun.lua index c37a5d4b..10d8d446 100644 --- a/src/luarocks/fun.lua +++ b/src/luarocks/fun.lua @@ -71,6 +71,24 @@ function fun.flip(f) end end +function fun.find(xs, f) + if type(xs) == "function" then + for v in xs do + local x = f(v) + if x then + return x + end + end + elseif type(xs) == "table" then + for _, v in ipairs(xs) do + local x = f(v) + if x then + return x + end + end + end +end + function fun.partial(f, ...) local n = select("#", ...) if n == 1 then @@ -101,4 +119,26 @@ function fun.partial(f, ...) end end +function fun.memoize(fn) + local memory = setmetatable({}, { __mode = "k" }) + local errors = setmetatable({}, { __mode = "k" }) + local NIL = {} + return function(arg) + if memory[arg] then + if memory[arg] == NIL then + return nil, errors[arg] + end + return memory[arg] + end + local ret1, ret2 = fn(arg) + if ret1 ~= nil then + memory[arg] = ret1 + else + memory[arg] = NIL + errors[arg] = ret2 + end + return ret1, ret2 + end +end + return fun -- cgit v1.2.3-55-g6feb