TradeSkillMaster/LibTSM/Util/Future.lua

111 lines
3.0 KiB
Lua
Raw Permalink Normal View History

2020-11-13 14:13:12 -05:00
-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
--- Future Functions.
-- @module Future
local _, TSM = ...
local Future = TSM.Init("Util.Future")
local private = {
context = {},
}
-- ============================================================================
-- Metatable
-- ============================================================================
local FUTURE_MT = {
__index = {
GetName = function(self)
local context = private.context[self]
return context.name
end,
SetScript = function(self, script, handler)
assert(type(handler) == "function")
local context = private.context[self]
if script == "OnDone" then
assert(context.state ~= "DONE")
assert(not context.onDone)
context.onDone = handler
elseif script == "OnCleanup" then
assert(not context.onCleanup)
context.onCleanup = handler
else
error("Unknown script: "..tostring(script))
end
end,
Start = function(self)
local context = private.context[self]
assert(context.state == "RESET")
context.state = "STARTED"
end,
Cancel = function(self)
local context = private.context[self]
assert(context.state ~= "RESET")
private.Reset(self)
end,
Done = function(self, value)
local context = private.context[self]
assert(context.state == "STARTED")
context.state = "DONE"
context.value = value
if context.onDone then
context.onDone(self)
end
end,
IsDone = function(self)
local context = private.context[self]
assert(context.state ~= "RESET")
return context.state == "DONE"
end,
GetValue = function(self)
local context = private.context[self]
assert(context.state == "DONE")
local value = context.value
private.Reset(self)
return value
end,
},
__newindex = function(self, key, value) error("Future cannot be modified") end,
__metatable = false,
}
-- ============================================================================
-- Module Functions
-- ============================================================================
--- Create a new future.
-- @tparam string name The name of the future for debugging purposes
-- @treturn Future The future object
function Future.New(name)
local future = setmetatable({}, FUTURE_MT)
private.context[future] = {
name = name,
}
private.Reset(future)
return future
end
-- ============================================================================
-- Private Helper Functions
-- ============================================================================
function private.Reset(future)
local context = private.context[future]
context.state = "RESET"
context.value = nil
context.onDone = nil
if context.onCleanup then
context.onCleanup()
end
end