diff --git a/__resource.lua b/__resource.lua new file mode 100644 index 00000000..647efcea --- /dev/null +++ b/__resource.lua @@ -0,0 +1,6 @@ +resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' + +description 'Async' + +server_script 'async.lua' +client_script 'async.lua' \ No newline at end of file diff --git a/async.lua b/async.lua new file mode 100644 index 00000000..3c7ab7c8 --- /dev/null +++ b/async.lua @@ -0,0 +1,82 @@ +if Citizen and Citizen.CreateThread then + CreateThread = Citizen.CreateThread +end + +Async = {} + +function Async.parallel(tasks, cb) + + local remaining = #tasks + local results = {} + + for i=1, #tasks, 1 do + + CreateThread(function() + + tasks[i](function(result) + + table.insert(results, result) + + remaining = remaining - 1; + + if remaining == 0 then + cb(results) + end + + end) + + end) + + end + +end + +function Async.parallelLimit(tasks, limit, cb) + + local remaining = #tasks + local running = 0 + local queue = {} + local results = {} + + for i=1, #tasks, 1 do + table.insert(queue, tasks[i]) + end + + local function processQueue() + + if #queue == 0 then + return + end + + while running < limit and #queue > 0 do + + local task = table.remove(queue, 1) + + running = running + 1 + + task(function(result) + + table.insert(results, result) + + remaining = remaining - 1; + running = running - 1 + + if remaining == 0 then + cb(results) + end + + end) + + end + + CreateThread(processQueue) + + end + + processQueue() + +end + +function Async.series(tasks, cb) + Async.parallelLimit(tasks, 1, cb) +end