diff options
| -rw-r--r-- | src/luarocks/build.lua | 2 | ||||
| -rw-r--r-- | src/luarocks/cmd/install.lua | 2 | ||||
| -rw-r--r-- | src/luarocks/core/util.lua | 3 | ||||
| -rw-r--r-- | src/luarocks/fun.tl | 148 | ||||
| -rw-r--r-- | src/luarocks/util-original.lua (renamed from src/luarocks/util.lua) | 0 | ||||
| -rw-r--r-- | src/luarocks/util.tl | 32 |
6 files changed, 151 insertions, 36 deletions
diff --git a/src/luarocks/build.lua b/src/luarocks/build.lua index 56e5ebd4..c294b98e 100644 --- a/src/luarocks/build.lua +++ b/src/luarocks/build.lua | |||
| @@ -14,7 +14,7 @@ local repos = require("luarocks.repos") | |||
| 14 | local writer = require("luarocks.manif.writer") | 14 | local writer = require("luarocks.manif.writer") |
| 15 | local deplocks = require("luarocks.deplocks") | 15 | local deplocks = require("luarocks.deplocks") |
| 16 | 16 | ||
| 17 | build.opts = util.opts_table("build.opts", { | 17 | build.opts = util.opts_table("build.opts", { --WORK |
| 18 | need_to_fetch = "boolean", | 18 | need_to_fetch = "boolean", |
| 19 | minimal_mode = "boolean", | 19 | minimal_mode = "boolean", |
| 20 | deps_mode = "string", | 20 | deps_mode = "string", |
diff --git a/src/luarocks/cmd/install.lua b/src/luarocks/cmd/install.lua index c3b5f811..4f27e471 100644 --- a/src/luarocks/cmd/install.lua +++ b/src/luarocks/cmd/install.lua | |||
| @@ -54,7 +54,7 @@ function install.add_to_parser(parser) | |||
| 54 | parser:flag("--sign"):hidden(true) | 54 | parser:flag("--sign"):hidden(true) |
| 55 | end | 55 | end |
| 56 | 56 | ||
| 57 | install.opts = util.opts_table("install.opts", { | 57 | install.opts = util.opts_table("install.opts", { --WORK |
| 58 | namespace = "string?", | 58 | namespace = "string?", |
| 59 | keep = "boolean", | 59 | keep = "boolean", |
| 60 | force = "boolean", | 60 | force = "boolean", |
diff --git a/src/luarocks/core/util.lua b/src/luarocks/core/util.lua index f72f1ec6..8cd2d25e 100644 --- a/src/luarocks/core/util.lua +++ b/src/luarocks/core/util.lua | |||
| @@ -9,10 +9,9 @@ local util = {Ordering = {}, } | |||
| 9 | 9 | ||
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | local dir_sep = package.config:sub(1, 1) | ||
| 13 | |||
| 14 | 12 | ||
| 15 | 13 | ||
| 14 | local dir_sep = package.config:sub(1, 1) | ||
| 16 | 15 | ||
| 17 | 16 | ||
| 18 | 17 | ||
diff --git a/src/luarocks/fun.tl b/src/luarocks/fun.tl new file mode 100644 index 00000000..f52e059d --- /dev/null +++ b/src/luarocks/fun.tl | |||
| @@ -0,0 +1,148 @@ | |||
| 1 | |||
| 2 | --- A set of basic functional utilities | ||
| 3 | local record fun | ||
| 4 | end | ||
| 5 | |||
| 6 | function fun.concat(xs: {any}, ys: {any}): {any} --? not generic becuse lua suports differnt types in one array | ||
| 7 | local rs = {} | ||
| 8 | local n = #xs | ||
| 9 | for i = 1, n do | ||
| 10 | rs[i] = xs[i] | ||
| 11 | end | ||
| 12 | for i = 1, #ys do | ||
| 13 | rs[i + n] = ys[i] | ||
| 14 | end | ||
| 15 | return rs | ||
| 16 | end | ||
| 17 | |||
| 18 | function fun.contains(xs: {any}, v: any): boolean --? same logic as above fine? | ||
| 19 | for _, x in ipairs(xs) do | ||
| 20 | if v == x then | ||
| 21 | return true | ||
| 22 | end | ||
| 23 | end | ||
| 24 | return false | ||
| 25 | end | ||
| 26 | |||
| 27 | function fun.map<K, V>(xs: {K}, f: function(K): V): {V} --? right | ||
| 28 | local rs = {} | ||
| 29 | for i = 1, #xs do | ||
| 30 | rs[i] = f(xs[i]) | ||
| 31 | end | ||
| 32 | return rs | ||
| 33 | end | ||
| 34 | |||
| 35 | function fun.filter<K>(xs: {K}, f: function): {K} | ||
| 36 | local rs = {} | ||
| 37 | for i = 1, #xs do | ||
| 38 | local v = xs[i] | ||
| 39 | if f(v) then | ||
| 40 | rs[#rs+1] = v | ||
| 41 | end | ||
| 42 | end | ||
| 43 | return rs | ||
| 44 | end | ||
| 45 | |||
| 46 | function fun.traverse<K, V>(t: {K}, f: function(K): V): {V} --? right or {any} | any | ||
| 47 | return fun.map(t, function(x: K): V | ||
| 48 | -- return x is table and fun.traverse(x, f) or f(x) --? | ||
| 49 | if x is {any} then | ||
| 50 | fun.traverse(x, f) | ||
| 51 | else | ||
| 52 | f(x) | ||
| 53 | end | ||
| 54 | end) | ||
| 55 | end | ||
| 56 | |||
| 57 | function fun.reverse_in(t: {any}): {any} | ||
| 58 | for i = 1, math.floor(#t/2) do | ||
| 59 | local m, n = i, #t - i + 1 | ||
| 60 | local a, b = t[m], t[n] | ||
| 61 | t[m] = b | ||
| 62 | t[n] = a | ||
| 63 | end | ||
| 64 | return t | ||
| 65 | end | ||
| 66 | |||
| 67 | function fun.sort_in<K>(t: {K}, f: table.SortFunction<K>): {K} | ||
| 68 | table.sort(t, f) | ||
| 69 | return t | ||
| 70 | end | ||
| 71 | |||
| 72 | function fun.flip<K, V, S>(f: function(K, V): S): function(V, K): S | ||
| 73 | return function(a: V, b: K): S | ||
| 74 | return f(b, a) | ||
| 75 | end | ||
| 76 | end | ||
| 77 | |||
| 78 | function fun.find(xs: function | {any}, f: function): any | ||
| 79 | if xs is function then | ||
| 80 | for v in xs do | ||
| 81 | local x = f(v) | ||
| 82 | if x then | ||
| 83 | return x | ||
| 84 | end | ||
| 85 | end | ||
| 86 | elseif xs is {any} then | ||
| 87 | for _, v in ipairs(xs) do | ||
| 88 | local x = f(v) | ||
| 89 | if x then | ||
| 90 | return x | ||
| 91 | end | ||
| 92 | end | ||
| 93 | end | ||
| 94 | end | ||
| 95 | |||
| 96 | function fun.partial<K>(f: (function(...: any): K), ...: any): (function(...: any): K) | ||
| 97 | local n = select("#", ...) | ||
| 98 | if n == 1 then | ||
| 99 | local a = ... | ||
| 100 | return function(...): K | ||
| 101 | return f(a, ...) | ||
| 102 | end | ||
| 103 | elseif n == 2 then | ||
| 104 | local a, b = ... | ||
| 105 | return function(...): K | ||
| 106 | return f(a, b, ...) | ||
| 107 | end | ||
| 108 | else | ||
| 109 | local pargs = { n = n, ... } | ||
| 110 | return function(...): K | ||
| 111 | local m = select("#", ...) | ||
| 112 | local fargs = { ... } | ||
| 113 | local args = {} | ||
| 114 | for i = 1, n do | ||
| 115 | args[i] = pargs[i] | ||
| 116 | end | ||
| 117 | for i = 1, m do | ||
| 118 | args[i+n] = fargs[i] | ||
| 119 | end | ||
| 120 | return f(table.unpack(args, 1, n+m)) | ||
| 121 | end | ||
| 122 | end | ||
| 123 | end | ||
| 124 | |||
| 125 | function fun.memoize(fn) | ||
| 126 | local memory = setmetatable({}, { __mode = "k" }) | ||
| 127 | local errors = setmetatable({}, { __mode = "k" }) | ||
| 128 | local NIL = {} | ||
| 129 | return function(arg) | ||
| 130 | if memory[arg] then | ||
| 131 | if memory[arg] == NIL then | ||
| 132 | return nil, errors[arg] | ||
| 133 | end | ||
| 134 | return memory[arg] | ||
| 135 | end | ||
| 136 | local ret1, ret2 = fn(arg) | ||
| 137 | if ret1 ~= nil then | ||
| 138 | memory[arg] = ret1 | ||
| 139 | else | ||
| 140 | memory[arg] = NIL | ||
| 141 | errors[arg] = ret2 | ||
| 142 | end | ||
| 143 | return ret1, ret2 | ||
| 144 | end | ||
| 145 | end | ||
| 146 | |||
| 147 | return fun | ||
| 148 | --? look for wrong/missing generics usage \ No newline at end of file | ||
diff --git a/src/luarocks/util.lua b/src/luarocks/util-original.lua index de9157fc..de9157fc 100644 --- a/src/luarocks/util.lua +++ b/src/luarocks/util-original.lua | |||
diff --git a/src/luarocks/util.tl b/src/luarocks/util.tl index 505584a0..aa04a3f3 100644 --- a/src/luarocks/util.tl +++ b/src/luarocks/util.tl | |||
| @@ -548,38 +548,6 @@ do | |||
| 548 | } | 548 | } |
| 549 | end | 549 | end |
| 550 | end | 550 | end |
| 551 | |||
| 552 | function util.opts_table(type_name: string, valid_opts: {string: string}): function({string : string}): {string : string} | ||
| 553 | local opts_mt: metatable<{string : string}> = { | ||
| 554 | -- type: function(): string --! | ||
| 555 | } | ||
| 556 | |||
| 557 | opts_mt.__index = opts_mt | ||
| 558 | |||
| 559 | function opts_mt.type(): string --! | ||
| 560 | return type_name | ||
| 561 | end | ||
| 562 | |||
| 563 | return function(opts: {string: string}): {string: string} | ||
| 564 | for k, v in pairs(opts) do | ||
| 565 | local tv = type(v) | ||
| 566 | if not valid_opts[k] then | ||
| 567 | error("invalid option: "..k) | ||
| 568 | end | ||
| 569 | local vo, optional = valid_opts[k]:match("^(.-)(%??)$") | ||
| 570 | if not (tv == vo or (optional == "?" and tv == nil)) then | ||
| 571 | error("invalid type option: "..k.." - got "..tv..", expected "..vo) | ||
| 572 | end | ||
| 573 | end | ||
| 574 | for k, v in pairs(valid_opts) do | ||
| 575 | if (not v:find("?", 1, true)) and opts[k] == nil then | ||
| 576 | error("missing option: "..k) | ||
| 577 | end | ||
| 578 | end | ||
| 579 | return setmetatable(opts, opts_mt) | ||
| 580 | end | ||
| 581 | end | ||
| 582 | |||
| 583 | --- Return a table of modules that are already provided by the VM, which | 551 | --- Return a table of modules that are already provided by the VM, which |
| 584 | -- can be specified as dependencies without having to install an actual rock. | 552 | -- can be specified as dependencies without having to install an actual rock. |
| 585 | -- @param rockspec (optional) a rockspec table, so that rockspec format | 553 | -- @param rockspec (optional) a rockspec table, so that rockspec format |
