diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2019-03-28 23:38:07 -0300 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2019-04-01 16:26:30 -0300 |
commit | fbb3431367a145e73bd038b0c779fd8355c997b4 (patch) | |
tree | df8e33775fb8c1bb116d890bd778b070ee686fb4 | |
parent | e388deecaa13b7b89da202d09d328a79bbcf40dd (diff) | |
download | luarocks-fbb3431367a145e73bd038b0c779fd8355c997b4.tar.gz luarocks-fbb3431367a145e73bd038b0c779fd8355c997b4.tar.bz2 luarocks-fbb3431367a145e73bd038b0c779fd8355c997b4.zip |
fun: add find and memoize functions
-rw-r--r-- | src/luarocks/fun.lua | 40 |
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 |
72 | end | 72 | end |
73 | 73 | ||
74 | function 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 | ||
90 | end | ||
91 | |||
74 | function fun.partial(f, ...) | 92 | function 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 |
102 | end | 120 | end |
103 | 121 | ||
122 | function 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 | ||
142 | end | ||
143 | |||
104 | return fun | 144 | return fun |