aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-core/async/init.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/mason-core/async/init.lua')
-rw-r--r--lua/mason-core/async/init.lua40
1 files changed, 5 insertions, 35 deletions
diff --git a/lua/mason-core/async/init.lua b/lua/mason-core/async/init.lua
index a6c7c8ef..df7c996c 100644
--- a/lua/mason-core/async/init.lua
+++ b/lua/mason-core/async/init.lua
@@ -153,41 +153,11 @@ exports.scheduler = function()
await(vim.schedule)
end
----Creates a oneshot channel that can only send once.
-local function oneshot_channel()
- local has_sent = false
- local sent_value
- local saved_callback
-
- return {
- is_closed = function()
- return has_sent
- end,
- send = function(...)
- assert(not has_sent, "Oneshot channel can only send once.")
- has_sent = true
- sent_value = { ... }
- if saved_callback then
- saved_callback(unpack(sent_value))
- end
- end,
- receive = function()
- return await(function(resolve)
- if has_sent then
- resolve(unpack(sent_value))
- else
- saved_callback = resolve
- end
- end)
- end,
- }
-end
-
---@async
---@param suspend_fns async fun()[]
---@param mode '"first"' | '"all"'
local function wait(suspend_fns, mode)
- local channel = oneshot_channel()
+ local channel = require("mason-core.async.control").OneShotChannel.new()
if #suspend_fns == 0 then
return
end
@@ -208,9 +178,9 @@ local function wait(suspend_fns, mode)
thread_cancellations[i] = exports.run(suspend_fn, function(success, result)
completed = completed + 1
if not success then
- if not channel.is_closed() then
+ if not channel:is_closed() then
cancel()
- channel.send(false, result)
+ channel:send(false, result)
results = nil
thread_cancellations = {}
end
@@ -218,7 +188,7 @@ local function wait(suspend_fns, mode)
results[i] = result
if mode == "first" or completed >= count then
cancel()
- channel.send(true, mode == "first" and { result } or results)
+ channel:send(true, mode == "first" and { result } or results)
results = nil
thread_cancellations = {}
end
@@ -227,7 +197,7 @@ local function wait(suspend_fns, mode)
end
end
- local ok, results = channel.receive()
+ local ok, results = channel:receive()
if not ok then
error(results, 2)
end