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 |
