function split(text, sep) local parts = {} local start = 0 local from, to = text:find(sep) while from ~= nil do table.insert(parts, text:sub(start, from - 1)) text = text:sub(to + 1) from, to = text:find(sep) end table.insert(parts, text) return parts end function sign(n) if n == 0 then return 0 elseif n < 0 then return -1 else return 1 end end function foreach(t, f) for k, v in pairs(t) do t[k] = f(v) end end function printtable(t, nonewline) for k, v in pairs(t) do io.write(k..":") if type(v) == "table" then io.write("(") printtable(v, true) io.write(") ") else io.write(v.." ") end end if not nonewline then io.write("\n") end end function count(t, pred) local count = 0 for k, v in pairs(t) do if pred(v) then count = count + 1 end end return count end function foldl(t, f, a) for k, v in pairs(t) do a = f(a, v) end return a end function sum(t) return foldl(t, function (x, y) return x + y end, 0) end function char(s, index) return string.char(string.byte(s, index)) end function chars(s) local index = 0 return function() if index < #s then index = index + 1 return char(s, index) else return nil end end end