-
Notifications
You must be signed in to change notification settings - Fork 5
/
utils_general.lua
99 lines (78 loc) · 3.41 KB
/
utils_general.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
-- Utility code that can apply to lua programming in general.
--- Does nothing.
--@usage dummy_object = { step = do_nothing, draw = do_nothing }
function do_nothing() end
--- Wraps a function around a memoizing weak table.
-- Function results will be stored until they are no longer referenced.
--
-- Note: This is intended for functions returning heavy-weight objects,
-- such as images. Functions that return primitives will not interact
-- correctly with the garbage collection.
--
-- @param func the function to memoize, arguments must be strings or numbers
-- @param separator <i>optional, default ';'</i>, the separator used when joining arguments to form a string key
-- @usage new_load = memoized(load)
function memoized(func, --[[Optional]] separator)
local cache = {}
setmetatable( cache, {__mode = "kv"} ) -- Make table weak
separator = separator or ";"
return function(...)
local key = table.concat({...}, separator)
if not cache[key] then
cache[key] = func(...)
end
return cache[key]
end
end
--- Return whether a file with the specified name exists.
-- More precisely, returns whether the given file can be opened for reading.
function file_exists(name)
local f = io.open(name,"r")
if f ~= nil then io.close(f) end
return f ~= nil
end
--- Get a human-readable string from a lua value. The resulting value is generally valid lua.
-- Note that the paramaters should typically not used directly, except for perhaps 'packed'.
-- @param val the value to pretty-print
-- @param tabs <i>optional, default 0</i>, the level of indentation
-- @param packed <i>optional, default false</i>, if true, minimal spacing is used
-- @param quote_strings <i>optional, default true</i>, whether to print strings with spaces
function pretty_tostring(val, --[[Optional]] tabs, --[[Optional]] packed, --[[Optional]] quote_strings)
tabs = tabs or 0
quote_strings = (quote_strings == nil) or quote_strings
local tabstr = ""
if not packed then
for i = 1, tabs do
tabstr = tabstr .. " "
end
end
if type(val) == "string" and quote_strings then
return tabstr .. "\"" .. val .. "\""
end
if type(val) ~= "table" then
return tabstr .. tostring(val)
end
local parts = {"{", --[[sentinel for remove below]] ""}
for k,v in pairs(val) do
table.insert(parts, packed and "" or "\n")
if type(k) == "number" then
table.insert(parts, pretty_tostring(v, tabs+1, packed))
else
table.insert(parts, pretty_tostring(k, tabs+1, packed, false))
table.insert(parts, " = ")
table.insert(parts, pretty_tostring(v, type(v) == "table" and tabs+1 or 0, packed))
end
table.insert(parts, ", ")
end
parts[#parts] = nil -- remove comma or sentinel
table.insert(parts, (packed and "" or "\n") .. tabstr .. "}");
return table.concat(parts)
end
--- Get a human-readable string from a lua value. The resulting value is generally valid lua.
-- Note that the paramaters should typically not used directly, except for perhaps 'packed'.
-- @param val the value to pretty-print
-- @param tabs <i>optional, default 0</i>, the level of indentation
-- @param packed <i>optional, default false</i>, if true, minimal spacing is used
function pretty_print(val, --[[Optional]] tabs, --[[Optional]] packed)
print(pretty_tostring(val, tabs, packed))
end