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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
local astal = require("astal")
local Variable = require("astal").Variable
local Astal = require("astal.gtk3").Astal
local GLib = astal.require("GLib")
local Gtk = require("astal.gtk3").Gtk
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 if value is an array
is_array = function(val)
return type(val) == 'table'
end,
--- returns if value is an string
is_string = function(val)
return type(val) == 'string'
end,
--- returns if value is nil
is_nil = function(val)
return val == nil
end,
--- returns length of table or string
count = function(val)
if lib.is_array(val) then
return #val
elseif lib.is_string(val) then
return val:len()
elseif lib.is_nil(val) then
return 0
else
return nil
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,
--- better truthy function
is_true = function(val)
-- zero is false
if val == 0 then
return false
end
-- empty array or string is false
if lib.empty(val) then
return false
end
-- default truthyness
return val and true or false
end,
--- better fasly function
is_false = function(val)
return not lib.is_true(val)
end,
--- checks if a file exists
file_exists = function(path)
return GLib.file_test(path, "EXISTS")
end,
--- checks if a string is an icon
is_icon = function(icon)
return Astal.Icon.lookup_icon(icon) ~= nil
end,
--- applies one object onto another
apply = function(l, r)
for k,v in pairs(r) do
l[k] = v
end
return l
end,
--- returns current unix epoch
unix = function()
return os.time(os.date("!*t"))
end,
--- formats a time
time = function(t)
-- default args
t = lib.apply({
time = lib.unix(),
format = "%H:%M"
}, t or {})
return GLib.DateTime.new_from_unix_local(t.time):format(t.format)
end,
--- astal variable map
varmap = function(initial)
local map = initial
local var = Variable()
local function notify()
local arr = {}
for _, value in pairs(map) do
table.insert(arr, value)
end
var:set(arr)
end
local function delete(key)
if Gtk.Widget:is_type_of(map[key]) then map[key]:destroy() end
map[key] = nil
end
notify()
return setmetatable({
set = function(key, value)
delete(key)
map[key] = value
notify()
end,
delete = function(key)
delete(key)
notify()
end,
get = function()
return var:get()
end,
subscribe = function(callback)
return var:subscribe(callback)
end,
}, {
__call = function() return var() end,
})
end,
--- better or function
value_or = function(l, r)
if lib.is_true(l) then
return l
else
return r
end
end,
--- better and function
value_and = function(l, r)
if lib.is_false(l) then
return l
else
return r
end
end,
}
return lib
|