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
|
local Variable = require("astal").Variable
local lib
lib = {
--- get path to file in astal source
src = function(path)
local str = debug.getinfo(2, "S").source:sub(2)
local src = str:match("(.*/)") or str:match("(.*\\)") or "./"
return src .. path
end,
--- map an array with a function
map = function(array, func)
local new_arr = {}
for i, v in ipairs(array) do
new_arr[i] = func(v, i)
end
return new_arr
end,
--- filter an array with a function
filter = function(array, func)
local new_arr = {}
for i, v in ipairs(array) do
if func(v, i) then
new_arr[i] = v
end
end
return new_arr
end,
--- sort an array of object on a key
sort = function(array, func)
-- default func to sort on attr 'id'
if not func then
func = 'id'
end
-- make function if just provided with attribute
if type(func) ~= 'function' then
local key = func
func = function(a, b) return a[key] < b[key] end
end
-- copy to new array
local new_arr = {}
for i, v in ipairs(array) do
new_arr[i] = v
end
-- sort and return
table.sort(new_arr, func)
return new_arr
end,
--- returns length of table
count = function(array)
if not array then
return 0
else
return #array
end
end,
--- returns if a table is empty
empty = function(array)
return lib.count(array) == 0
end,
--- negates value
neg = function(val)
return not val
end,
}
return lib
|