diff options
author | Aylur <[email protected]> | 2024-10-15 01:26:32 +0200 |
---|---|---|
committer | Aylur <[email protected]> | 2024-10-15 01:26:32 +0200 |
commit | 2f71cd4c08bb4514efe43533e6a5d03535204c29 (patch) | |
tree | fc991a12e159ad645187862c90f40731794d6e47 /lang/lua/lib/binding.lua | |
parent | 9fab13452a26ed55c01047d4225f699f43bba20d (diff) |
refactor lua and gjs lib
Diffstat (limited to 'lang/lua/lib/binding.lua')
-rw-r--r-- | lang/lua/lib/binding.lua | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/lang/lua/lib/binding.lua b/lang/lua/lib/binding.lua new file mode 100644 index 0000000..ba1e6e4 --- /dev/null +++ b/lang/lua/lib/binding.lua @@ -0,0 +1,71 @@ +local lgi = require("lgi") +local GObject = lgi.require("GObject", "2.0") + +---@class Binding +---@field emitter table|Variable +---@field property? string +---@field transformFn function +local Binding = {} + +---@param emitter table +---@param property? string +---@return Binding +function Binding.new(emitter, property) + return setmetatable({ + emitter = emitter, + property = property, + transformFn = function(v) + return v + end, + }, Binding) +end + +function Binding:__tostring() + local str = "Binding<" .. tostring(self.emitter) + if self.property ~= nil then + str = str .. ", " .. self.property + end + return str .. ">" +end + +function Binding:get() + if self.property ~= nil and GObject.Object:is_type_of(self.emitter) then + return self.transformFn(self.emitter[self.property]) + end + if type(self.emitter.get) == "function" then + return self.transformFn(self.emitter:get()) + end + error("can not get: Not a GObject or a Variable " + self) +end + +---@param transform fun(value: any): any +---@return Binding +function Binding:as(transform) + local b = Binding.new(self.emitter, self.property) + b.transformFn = function(v) + return transform(self.transformFn(v)) + end + return b +end + +---@param callback fun(value: any) +---@return function +function Binding:subscribe(callback) + if self.property ~= nil and GObject.Object:is_type_of(self.emitter) then + local id = self.emitter.on_notify:connect(function() + callback(self:get()) + end, self.property, false) + return function() + GObject.signal_handler_disconnect(self.emitter, id) + end + end + if type(self.emitter.subscribe) == "function" then + return self.emitter:subscribe(function() + callback(self:get()) + end) + end + error("can not subscribe: Not a GObject or a Variable " + self) +end + +Binding.__index = Binding +return Binding |