111 lines
3.0 KiB
Lua
111 lines
3.0 KiB
Lua
|
-- ------------------------------------------------------------------------------ --
|
||
|
-- 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
|