| ------------------------------------------------------------------------------- |
| -- Copyright (c) 2006-2013 Fabien Fleutot and others. |
| -- |
| -- All rights reserved. |
| -- |
| -- This program and the accompanying materials are made available |
| -- under the terms of the Eclipse Public License v1.0 which |
| -- accompanies this distribution, and is available at |
| -- http://www.eclipse.org/legal/epl-v10.html |
| -- |
| -- This program and the accompanying materials are also made available |
| -- under the terms of the MIT public license which accompanies this |
| -- distribution, and is available at http://www.lua.org/license.html |
| -- |
| -- Contributors: |
| -- Fabien Fleutot - API and implementation |
| -- |
| ------------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------- |
| ---------------------------------------------------------------------- |
| -- |
| -- Base library extension |
| -- |
| ---------------------------------------------------------------------- |
| ---------------------------------------------------------------------- |
| |
| if not metalua then rawset(getfenv(), 'metalua', { }) end |
| metalua.version = "v-0.5" |
| |
| if not rawpairs then |
| rawpairs, rawipairs, rawtype = pairs, ipairs, type |
| end |
| |
| function pairs(x) |
| assert(type(x)=='table', 'pairs() expects a table') |
| local mt = getmetatable(x) |
| if mt then |
| local mtp = mt.__pairs |
| if mtp then return mtp(x) end |
| end |
| return rawpairs(x) |
| end |
| |
| function ipairs(x) |
| assert(type(x)=='table', 'ipairs() expects a table') |
| local mt = getmetatable(x) |
| if mt then |
| local mti = mt.__ipairs |
| if mti then return mti(x) end |
| end |
| return rawipairs(x) |
| end |
| |
| --[[ |
| function type(x) |
| local mt = getmetatable(x) |
| if mt then |
| local mtt = mt.__type |
| if mtt then return mtt end |
| end |
| return rawtype(x) |
| end |
| ]] |
| |
| function min (a, ...) |
| for n in values{...} do if n<a then a=n end end |
| return a |
| end |
| |
| function max (a, ...) |
| for n in values{...} do if n>a then a=n end end |
| return a |
| end |
| |
| function o (...) |
| local args = {...} |
| local function g (...) |
| local result = {...} |
| for i=#args, 1, -1 do result = {args[i](unpack(result))} end |
| return unpack (result) |
| end |
| return g |
| end |
| |
| function id (...) return ... end |
| function const (k) return function () return k end end |
| |
| function printf(...) return print(string.format(...)) end |
| function eprintf(...) |
| io.stderr:write(string.format(...).."\n") |
| end |
| |
| function ivalues (x) |
| assert(type(x)=='table', 'ivalues() expects a table') |
| local i = 1 |
| local function iterator () |
| local r = x[i]; i=i+1; return r |
| end |
| return iterator |
| end |
| |
| |
| function values (x) |
| assert(type(x)=='table', 'values() expects a table') |
| local function iterator (state) |
| local it |
| state.content, it = next(state.list, state.content) |
| return it |
| end |
| return iterator, { list = x } |
| end |
| |
| function keys (x) |
| assert(type(x)=='table', 'keys() expects a table') |
| local function iterator (state) |
| local it = next(state.list, state.content) |
| state.content = it |
| return it |
| end |
| return iterator, { list = x } |
| end |
| |