@Nonnull
	public CompletableFuture<Workspace> asyncNewWorkspace(@Nonnull Path primaryPath, @Nonnull List<Path> supportingPaths,
	                                                      @Nonnull Consumer<Throwable> errorHandling) {
		// Invoke listeners, new content is being loaded.
		Unchecked.checkedForEach(preLoadListeners,
				listener -> listener.onPreLoad(primaryPath, supportingPaths),
				(listener, t) -> logger.error("Exception thrown opening workspace from '{}'", primaryPath, t));

		// Load resources from paths.
		CompletableFuture<Workspace> future = new CompletableFuture<>();
		loadPool.submit(() -> {
			try {
				List<WorkspaceResource> supportingResources = new ArrayList<>();
				WorkspaceResource primaryResource = resourceImporter.importResource(primaryPath);
				for (Path supportingPath : supportingPaths) {
					WorkspaceResource supportResource = resourceImporter.importResource(supportingPath);
					supportingResources.add(supportResource);
				}

				// Wrap into workspace and assign it
				Workspace workspace = new BasicWorkspace(primaryResource, supportingResources);
				future.complete(workspace);
				workspaceManager.setCurrent(workspace);
			} catch (Throwable t) {
				future.completeExceptionally(t);
				errorHandling.accept(t);
			}
		});
		return future;
	}
@param primaryPath
		Path to the primary resource file.
@param supportingPaths
		Paths to the supporting resource files.
@param errorHandling
		Error handling for invalid input.

@return Future of the created workspace.
recaf-ui/src/main/java/software/coley/recaf/workspace/PathLoadingManager.java