local curl = require "lcurl" local function weak_ptr(val) return setmetatable({value = val},{__mode = 'v'}) end local function gc_collect() collectgarbage("collect") collectgarbage("collect") end local function cver(min, maj, pat) return min * 2^16 + maj * 2^8 + pat end local function is_curl_ge(min, maj, pat) assert(0x070908 == cver(7,9,8)) return curl.version_info('version_num') >= cver(min, maj, pat) end local function is_curl_eq(min, maj, pat) assert(0x070908 == cver(7,9,8)) return curl.version_info('version_num') == cver(min, maj, pat) end local function read_file(n) local f, e = io.open(n, "r") if not f then return nil, e end local d, e = f:read("*all") f:close() return d, e end local function get_bin_by(str,n) local pos = 1 - n return function() pos = pos + n return (str:sub(pos,pos+n-1)) end end local function stream(ch, n, m) return n, get_bin_by( (ch):rep(n), m) end local function Stream(ch, n, m) local size, reader local _stream = {} function _stream:read(...) _stream.called_ctx = self _stream.called_co = coroutine.running() return reader(...) end function _stream:size() return size end function _stream:reset() size, reader = stream(ch, n, m) return self end return _stream:reset() end local utils = { weak_ptr = weak_ptr; gc_collect = gc_collect; is_curl_ge = is_curl_ge; is_curl_eq = is_curl_eq; get_bin_by = get_bin_by; read_file = read_file; stream = stream; Stream = Stream; } utils.import = function(...) local n, t = select('#', ...), {} for i = 1, n do local name = select(i, ...) t[#t + 1] = assert(utils[name], 'unknown field: ' .. tostring(name)) end return (unpack or table.unpack)(t, 1, n) end return utils