-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.lua
112 lines (98 loc) · 2.79 KB
/
util.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
local args = {...}
local import_prefix = args[1]
if import_prefix then import_prefix = import_prefix:match("^(.-)[^%.]+$") end
if not import_prefix then import_prefix = "" end
cardinals = {}
cardinals["up"] = "north"
cardinals["down"] = "south"
cardinals["left"] = "east"
cardinals["right"] = "west"
local errormodule = require(import_prefix .. "error")
local classmodule = load_module(import_prefix .. "class", true)
--[[
sleep - wait for s seconds. Inefficient for s > 2.
longsleep - wait for s second. Inefficient for short periods.
]]
function sleep(s)
local t0 = os.clock()
while os.clock() - t0 <= s do end
end
function longsleep(s)
local t0 = os.time()
while os.time() - t0 <= s do end
end
-- getArrayLength - equivalent to #tbl but correct in all case (in case you are not entirely sure about #tbl)
function getArrayLength(tbl)
local count = 0
for _ in pairs(tbl) do
count = count + 1
end
return count
end
function min(a, b) if a < b then return a else return b end end
function max(a, b) if a < b then return b else return a end end
local mathmodule = load_module("math")
inf = math.huge
function abs (a) return math.abs (a) end
function floor(a) return math.floor(a) end
--[[
random - return a random integer from 1 to max
coinFlip - randomly return true or false
falseCoin - randomly return true or false, with true having percent% chance to be outputed
]]
function random(max) return math.random(max) end
function coinFlip() return random(2) == 2 end
function falseCoin(percent) return random(100) <= percent end
--[[ Watch - the watch class
Holds a starting time and can be used to get a period
]]
Watch = class(function(self)
self.start = os.time()
end)
-- watch - returns the time since initialization
function Watch:watch()
return os.time() - self.start
end
-- stop - stop the watch if not already stopped then return the period from the start to stop
function Watch:stop()
if not self.stop then self.stop = os.time() end
return self.stop - self.start
end
-- concat - concatenate two indexable arrays
function concat(a, b)
cpy = {table.unpack(a)}
e = #cpy
for i, v in ipairs(b) do
cpy[e + i] = v
end
return cpy
end
--[[ differ - differ a function call
returns a function
which call is the call to the first `differ` call parameter
with at most 8 parameters given as the at most 8 next other `differ` parameters.
]]
function differ(fun, ...)
first_args = {...}
return function(...) return fun(table.unpack(concat(first_args, {...}))) end
end
--[[
copy - shallow copy of a table
deepcopy - deep copy of a table
]]
function copy(o)
if type(o) ~= "table" then return o end
local ret = {}
for k, v in pairs(o) do
ret[k] = v
end
return ret
end
function deepcopy(o)
if type(o) ~= "table" then return o end
local ret = {}
for k, v in pairs(o) do
ret[k] = deepcopy(v)
end
return ret
end