---------------------------------------------------------------------- ---------------------------------------------------------------------- -- -- 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 na 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 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