forked from Bastion/Bastion
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
1.6 KiB
76 lines
1.6 KiB
---@type Tinkr, Bastion
|
|
local Tinkr, Bastion = ...
|
|
|
|
-- Define a Refreshable class
|
|
---@class Bastion.Refreshable
|
|
---@field cache Bastion.Cache
|
|
local Refreshable = {
|
|
callback = nil,
|
|
value = nil,
|
|
__eq = function(self, other)
|
|
return self.value.__eq(rawget(self, "value"), other)
|
|
end,
|
|
}
|
|
|
|
-- On index check the cache to be valid and return the value or reconstruct the value and return it
|
|
function Refreshable:__index(k)
|
|
if Refreshable[k] then
|
|
return Refreshable[k]
|
|
end
|
|
|
|
self.value = self.callback()
|
|
return self.value[k]
|
|
end
|
|
|
|
-- When the object is accessed return the value
|
|
---@return string
|
|
function Refreshable:__tostring()
|
|
return "Bastion.__Refreshable(" .. tostring(rawget(self, "value")) .. ")"
|
|
end
|
|
|
|
-- Create
|
|
---@generic V
|
|
---@param value V
|
|
---@param cb fun(): V
|
|
---@return V
|
|
function Refreshable:New(value, cb)
|
|
local self = setmetatable({}, Refreshable)
|
|
|
|
self.cache = Bastion.Cache:New()
|
|
self.value = value
|
|
self.callback = cb
|
|
|
|
self.cache:Set("self", rawget(self, "value"), 0.5)
|
|
|
|
return self
|
|
end
|
|
|
|
-- Try to update the value
|
|
---@return nil
|
|
function Refreshable:TryUpdate()
|
|
if self.cache:IsCached("value") then
|
|
self.value = self.callback()
|
|
end
|
|
end
|
|
|
|
-- Update the value
|
|
---@return nil
|
|
function Refreshable:Update()
|
|
self.value = self.callback()
|
|
end
|
|
|
|
-- Set a new value
|
|
---@param value any
|
|
---@return nil
|
|
function Refreshable:Set(value)
|
|
self.value = value
|
|
end
|
|
|
|
-- Set a new callback
|
|
---@param cb function
|
|
---@return nil
|
|
function Refreshable:SetCallback(cb)
|
|
self.callback = cb
|
|
end
|
|
|
|
return Refreshable
|
|
|