aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-registry/installer.lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2025-03-03 02:16:05 +0100
committerWilliam Boman <william@redwill.se>2025-03-03 02:17:08 +0100
commitc61c6453e213617d2e2bffbb53b892bacfc7a05c (patch)
treeb336e60cd4aa581fcb40917e56bdc7f34be55406 /lua/mason-registry/installer.lua
parentrefactor(registry): refactor registry initialization (diff)
downloadmason-c61c6453e213617d2e2bffbb53b892bacfc7a05c.tar
mason-c61c6453e213617d2e2bffbb53b892bacfc7a05c.tar.gz
mason-c61c6453e213617d2e2bffbb53b892bacfc7a05c.tar.bz2
mason-c61c6453e213617d2e2bffbb53b892bacfc7a05c.tar.lz
mason-c61c6453e213617d2e2bffbb53b892bacfc7a05c.tar.xz
mason-c61c6453e213617d2e2bffbb53b892bacfc7a05c.tar.zst
mason-c61c6453e213617d2e2bffbb53b892bacfc7a05c.zip
refactor(registry): parallelize registry installation
Diffstat (limited to 'lua/mason-registry/installer.lua')
-rw-r--r--lua/mason-registry/installer.lua44
1 files changed, 30 insertions, 14 deletions
diff --git a/lua/mason-registry/installer.lua b/lua/mason-registry/installer.lua
index a1984921..5abbcd74 100644
--- a/lua/mason-registry/installer.lua
+++ b/lua/mason-registry/installer.lua
@@ -37,22 +37,38 @@ function M.install(sources)
log.debug("Installing registries.", sources)
assert(not M.channel, "Cannot install when channel is active.")
M.channel = OneShotChannel:new()
- local result = Result.try(function(try)
- local updated_sources = {}
- for source in sources:iterate { include_uninstalled = true } do
- log.trace("Installing registry.", source)
- try(source:install():map_err(function(err)
- return ("%s failed to install: %s"):format(source, err)
- end))
- table.insert(updated_sources, source)
- end
+
+ local results = {
+ a.wait_all(_.map(
+ ---@param source RegistrySource
+ function(source)
+ return function()
+ log.trace("Installing registry.", source)
+ return source:install():map(_.always(source)):map_err(function(err)
+ return ("%s failed to install: %s"):format(source, err)
+ end)
+ end
+ end,
+ sources:to_list { include_uninstalled = true }
+ )),
+ }
+
+ local any_failed = _.any(Result.is_failure, results)
+
+ if any_failed then
+ local unwrap_failures = _.compose(_.map(Result.err_or_nil), _.filter(Result.is_failure))
+ local result = Result.failure(unwrap_failures(results))
+ M.channel:send(result)
+ M.channel = nil
+ return result
+ else
+ local result = Result.success(_.map(Result.get_or_nil, results))
a.scheduler()
update_registry_state(sources, os.time())
- return updated_sources
- end)
- M.channel:send(result)
- M.channel = nil
- return result
+ M.channel:send(result)
+ M.channel = nil
+ return result
+ end
end
return M