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}