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.
bastion/src/Refreshable/Refreshable.lua

62 lines
1.2 KiB

local Tinkr, Bastion = ...
-- Define a Refreshable class
---@class Refreshable
local Refreshable = {
cache = nil,
callback = nil,
value = nil
}
-- 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
function Refreshable:__tostring()
return "Bastion.__Refreshable(" .. tostring(self.value) .. ")"
end
-- Create
function Refreshable:New(value, cb)
local self = setmetatable({}, Refreshable)
self.cache = Bastion.Cache:New()
self.value = value
self.callback = cb
self.cache:Set('self', self.value, 0.5)
return self
end
-- Try to update the value
function Refreshable:TryUpdate()
if self.cache:IsCached("value") then
self.value = self.callback()
end
end
-- Update the value
function Refreshable:Update()
self.value = self.callback()
end
-- Set a new value
function Refreshable:Set(value)
self.value = value
end
-- Set a new callback
function Refreshable:SetCallback(cb)
self.callback = cb
end
return Refreshable