]> git.lizzy.rs Git - metalua.git/blob - src/lib/base.lua
Merge branch 'eve-runtime-debug'
[metalua.git] / src / lib / base.lua
1 ----------------------------------------------------------------------\r
2 ----------------------------------------------------------------------\r
3 --\r
4 -- Base library extension\r
5 --\r
6 ----------------------------------------------------------------------\r
7 ----------------------------------------------------------------------\r
8 \r
9 if not metalua then rawset(getfenv(), 'metalua', { }) end\r
10 metalua.version             = "v-0.4"\r
11 metalua.ext_compiler_prefix = 'extension-compiler.'\r
12 metalua.ext_runtime_prefix   = 'extension-runtime.'\r
13 \r
14 if not rawpairs then\r
15    rawpairs, rawipairs, rawtype = pairs, ipairs, type\r
16 end\r
17 \r
18 function pairs(x)\r
19    assert(type(x)=='table', 'pairs() expects a table')\r
20    local mt = getmetatable(x)\r
21    if mt then\r
22       local mtp = mt.__pairs\r
23       if mtp then return mtp(x) end\r
24    end\r
25    return rawpairs(x)\r
26 end\r
27 \r
28 function ipairs(x)\r
29    assert(type(x)=='table', 'ipairs() expects a table')\r
30    local mt = getmetatable(x)\r
31    if mt then\r
32       local mti = mt.__ipairs\r
33       if mti then return mti(x) end\r
34    end\r
35    return rawipairs(x)\r
36 end\r
37 \r
38 --[[\r
39 function type(x)\r
40    local mt = getmetatable(x)\r
41    if mt then\r
42       local mtt = mt.__type\r
43       if mtt then return mtt end\r
44    end\r
45    return rawtype(x)\r
46 end\r
47 ]]\r
48 \r
49 function min (a, ...)\r
50    for n in values{...} do if n<a then a=n end end\r
51    return a\r
52 end\r
53 \r
54 function max (a, ...)\r
55    for n in values{...} do if n>a then a=n end end\r
56    return a\r
57 end\r
58       \r
59 function o (...)\r
60    local args = {...}\r
61    local function g (...)\r
62       local result = {...}\r
63       for i=#args, 1, -1 do result = {args[i](unpack(result))} end\r
64       return unpack (result)\r
65    end\r
66    return g\r
67 end\r
68          \r
69 function id (...) return ... end\r
70 function const (k) return function () return k end end\r
71 \r
72 function printf(...) return print(string.format(...)) end\r
73 \r
74 function ivalues (x)\r
75    assert(type(x)=='table', 'ivalues() expects a table')\r
76    local i = 1\r
77    local function iterator ()\r
78       local r = x[i]; i=i+1; return r\r
79    end\r
80    return iterator\r
81 end\r
82 \r
83 \r
84 function values (x) \r
85    assert(type(x)=='table', 'values() expects a table')\r
86    local function iterator (state)\r
87       local it\r
88       state.content, it = next(state.list, state.content) \r
89       return it\r
90    end\r
91    return iterator, { list = x }\r
92 end\r
93 \r
94 function keys (x) \r
95    assert(type(x)=='table', 'keys() expects a table')\r
96    local function iterator (state)\r
97       local it = next(state.list, state.content) \r
98       state.content = it\r
99       return it\r
100    end\r
101    return iterator, { list = x }\r
102 end\r
103 \r