aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2019-03-28 23:38:07 -0300
committerHisham Muhammad <hisham@gobolinux.org>2019-04-01 16:26:30 -0300
commitfbb3431367a145e73bd038b0c779fd8355c997b4 (patch)
treedf8e33775fb8c1bb116d890bd778b070ee686fb4
parente388deecaa13b7b89da202d09d328a79bbcf40dd (diff)
downloadluarocks-fbb3431367a145e73bd038b0c779fd8355c997b4.tar.gz
luarocks-fbb3431367a145e73bd038b0c779fd8355c997b4.tar.bz2
luarocks-fbb3431367a145e73bd038b0c779fd8355c997b4.zip
fun: add find and memoize functions
-rw-r--r--src/luarocks/fun.lua40
1 files changed, 40 insertions, 0 deletions
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)
71 end 71 end
72end 72end
73 73
74function fun.find(xs, f)
75 if type(xs) == "function" then
76 for v in xs do
77 local x = f(v)
78 if x then
79 return x
80 end
81 end
82 elseif type(xs) == "table" then
83 for _, v in ipairs(xs) do
84 local x = f(v)
85 if x then
86 return x
87 end
88 end
89 end
90end
91
74function fun.partial(f, ...) 92function fun.partial(f, ...)
75 local n = select("#", ...) 93 local n = select("#", ...)
76 if n == 1 then 94 if n == 1 then
@@ -101,4 +119,26 @@ function fun.partial(f, ...)
101 end 119 end
102end 120end
103 121
122function fun.memoize(fn)
123 local memory = setmetatable({}, { __mode = "k" })
124 local errors = setmetatable({}, { __mode = "k" })
125 local NIL = {}
126 return function(arg)
127 if memory[arg] then
128 if memory[arg] == NIL then
129 return nil, errors[arg]
130 end
131 return memory[arg]
132 end
133 local ret1, ret2 = fn(arg)
134 if ret1 ~= nil then
135 memory[arg] = ret1
136 else
137 memory[arg] = NIL
138 errors[arg] = ret2
139 end
140 return ret1, ret2
141 end
142end
143
104return fun 144return fun