1package de.gultsch.common;
2
3import com.google.common.collect.ImmutableList;
4import com.google.common.util.concurrent.Futures;
5import com.google.common.util.concurrent.ListenableFuture;
6import com.google.common.util.concurrent.MoreExecutors;
7import java.util.Collection;
8import java.util.List;
9
10public class FutureMerger {
11
12 public static <T> ListenableFuture<List<T>> successfulAsList(
13 final Collection<ListenableFuture<List<T>>> futures) {
14 return Futures.transform(
15 Futures.successfulAsList(futures),
16 lists -> {
17 final var builder = new ImmutableList.Builder<T>();
18 for (final Collection<T> list : lists) {
19 if (list == null) {
20 continue;
21 }
22 builder.addAll(list);
23 }
24 return builder.build();
25 },
26 MoreExecutors.directExecutor());
27 }
28
29 public static <T> ListenableFuture<List<T>> allAsList(
30 final Collection<ListenableFuture<Collection<T>>> futures) {
31 return Futures.transform(
32 Futures.allAsList(futures),
33 lists -> {
34 final var builder = new ImmutableList.Builder<T>();
35 for (final Collection<T> list : lists) {
36 builder.addAll(list);
37 }
38 return builder.build();
39 },
40 MoreExecutors.directExecutor());
41 }
42}