Useful Lua Recipes
Last updated on 2015-04-25 12:09:48 -0300
1. Iterators Via Coroutines
local function count(n) return coroutine.wrap( function () for i = 1, n do coroutine.yield(i) end end ) end for i in count(10) do print(i) end
2. Skew Heap
http://lua-users.org/lists/lua-l/2007-11/msg00375.html
local function qmerge(a, b) if not (a and b) then return a or b end if a.key < b.key then a.left, a.right = a.right, qmerge(a.left, b) return a else b.left, b.right = b.right, qmerge(a, b.left) return b end end local function qpush(q, k, v) return qmerge(q, {key=k, val=v}) end local function qpop(q) return qmerge(q.left, q.right) end q = nil q = qpush(q, 5, "a") q = qpush(q, 2, "b") q = qpush(q, 7, "c") q = qpush(q, 1, "d") while q ~= nil do print(q.val) q = qpop(q) end
3. Sleep
http://luajit.org/ext_ffi_tutorial.html
local ffi = require "ffi" ffi.cdef[[ void Sleep(int ms); int poll(struct pollfd *fds, unsigned long nfds, int timeout); ]] local sleep if ffi.os == "Windows" then function sleep(s) ffi.C.Sleep(s*1000) end else function sleep(s) ffi.C.poll(nil, 0, s*1000) end end
4. Parsing List of Integers
local function get_nums(str) local nums = {} for s in string.gmatch(str, "-?%d+") do nums[#nums+1] = tonumber(s) end return unpack(nums) end local w, h, x, y = get_nums("100 234 -20 0")
5. Converting UTF-8 String to Code Sequence
http://lua-users.org/wiki/LuaUnicode
local function utf8to32(utf8str) assert(type(utf8str) == "string") local res, seq, val = {}, 0, nil for i = 1, #utf8str do local c = string.byte(utf8str, i) if seq == 0 then table.insert(res, val) seq = c < 0x80 and 1 or c < 0xE0 and 2 or c < 0xF0 and 3 or c < 0xF8 and 4 or --c < 0xFC and 5 or c < 0xFE and 6 or error("invalid UTF-8 character sequence") val = bit.band(c, 2^(8-seq) - 1) else val = bit.bor(bit.lshift(val, 6), bit.band(c, 0x3F)) end seq = seq - 1 end table.insert(res, val) return res end