91 lines
2.1 KiB
Lua
91 lines
2.1 KiB
Lua
--[[
|
|
Provides utility functions for Promises
|
|
]]
|
|
|
|
local CorePackages = game:GetService("CorePackages")
|
|
|
|
local Result = require(CorePackages.AppTempCommon.LuaApp.Result)
|
|
local Promise = require(CorePackages.AppTempCommon.LuaApp.Promise)
|
|
|
|
local PromiseUtilities = {}
|
|
|
|
--[[
|
|
Accept a table of promises;
|
|
promises = {
|
|
[1] = Promise.resolve(),
|
|
["Home"] = Promise.reject(),
|
|
...
|
|
}
|
|
Returns a new promise that:
|
|
* is resolved when all input promises are finished.
|
|
returns the results of each individual promises in a list of Results
|
|
results = {
|
|
[1] = Result1,
|
|
["Home"] = Result2,
|
|
...
|
|
}
|
|
* is never rejected.
|
|
]]
|
|
function PromiseUtilities.Batch(promises)
|
|
assert(type(promises) == "table", "PromiseUtilities expects a list of Promises!")
|
|
|
|
local numberOfPromises = 0
|
|
|
|
for _, promise in pairs(promises) do
|
|
assert(Promise.is(promise), "PromiseUtilities expects a list of Promises!")
|
|
numberOfPromises = numberOfPromises + 1
|
|
end
|
|
|
|
return Promise.new(function(resolve, reject)
|
|
local totalCompleted = 0
|
|
local results = {}
|
|
|
|
local function promiseCompleted(key, success, value)
|
|
results[key] = Result.new(success, value)
|
|
totalCompleted = totalCompleted + 1
|
|
|
|
if totalCompleted == numberOfPromises then
|
|
resolve(results)
|
|
end
|
|
end
|
|
|
|
if next(promises) == nil then
|
|
resolve(results)
|
|
end
|
|
|
|
for key, promise in pairs(promises) do
|
|
promise:andThen(
|
|
function(result, ...)
|
|
if select("#", ...) > 0 then
|
|
warn("Promises in PromiseUtilities.Batch should not return tuple")
|
|
end
|
|
promiseCompleted(key, true, result)
|
|
end,
|
|
function(reason)
|
|
promiseCompleted(key, false, reason)
|
|
end
|
|
)
|
|
end
|
|
end)
|
|
end
|
|
|
|
function PromiseUtilities.CountResults(batchPromiseResults)
|
|
local totalCount = 0
|
|
local failureCount = 0
|
|
|
|
for _, result in pairs(batchPromiseResults) do
|
|
local success, _ = result:unwrap()
|
|
if not success then
|
|
failureCount = failureCount + 1
|
|
end
|
|
totalCount = totalCount + 1
|
|
end
|
|
|
|
return {
|
|
successCount = totalCount - failureCount,
|
|
failureCount = failureCount,
|
|
totalCount = totalCount,
|
|
}
|
|
end
|
|
|
|
return PromiseUtilities |