@Nonnull
	public CompletableFuture<Void> summarizeTo(@Nonnull Workspace workspace,
	                                           @Nonnull WorkspaceResource resource,
	                                           @Nonnull SummaryConsumer consumer) {
		// Run async so we do not block the UI thread
		return CompletableFuture.runAsync(() -> {
			boolean lastSummarizerAppended = false;
			for (ResourceSummarizer summarizer : new TreeSet<>(summarizers.values())) {
				if (lastSummarizerAppended)
					FxThreadUtil.run(() -> consumer.appendSummary(new Separator()));
				try {
					lastSummarizerAppended = summarizer.summarize(workspace, resource, consumer);
				} catch (Throwable t) {
					logger.error("Summarizer '{}' encountered an error", summarizer.getClass().getName(), t);
					lastSummarizerAppended = false;
				}
			}
		}, threadPool);
	}
Run all {@link ResourceSummarizer} instances, appending to the given consumer.

@param workspace
		Containing workspace.
@param resource
		Resource to summarize.
@param consumer
		Consumer of summary data.

@return Future of summarization completion.
recaf-ui/src/main/java/software/coley/recaf/services/info/summary/ResourceSummaryService.java