diff options
Diffstat (limited to 'pkgs/astal/src/lib.lua')
-rw-r--r-- | pkgs/astal/src/lib.lua | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/pkgs/astal/src/lib.lua b/pkgs/astal/src/lib.lua index 71a6c65..7fa326a 100644 --- a/pkgs/astal/src/lib.lua +++ b/pkgs/astal/src/lib.lua @@ -2,6 +2,7 @@ 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 @@ -149,6 +150,67 @@ lib = { }, 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 |