initial commit
This commit is contained in:
110
LibTSM/Util/Future.lua
Normal file
110
LibTSM/Util/Future.lua
Normal file
@@ -0,0 +1,110 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- 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
|
||||
Reference in New Issue
Block a user