package dev.tommyjs.futur.joiner; import dev.tommyjs.futur.promise.Promise; import dev.tommyjs.futur.promise.PromiseCompletion; import dev.tommyjs.futur.promise.PromiseFactory; import dev.tommyjs.futur.util.ConcurrentResultArray; import org.jetbrains.annotations.NotNull; import java.util.*; public class MappedResultJoiner extends PromiseJoiner>, K, V, Map> { private final @NotNull ConcurrentResultArray> results; public MappedResultJoiner(@NotNull PromiseFactory factory, @NotNull Iterator>> promises, int expectedSize) { super(factory); this.results = new ConcurrentResultArray<>(expectedSize); join(promises); } @Override protected K getChildKey(Map.Entry> entry) { return entry.getKey(); } @Override protected @NotNull Promise getChildPromise(Map.Entry> entry) { return entry.getValue(); } @Override protected void onChildComplete(int index, K key, @NotNull PromiseCompletion res) { results.set(index, new AbstractMap.SimpleImmutableEntry<>(key, res.getResult())); } @Override protected Map getResult() { List> list = results.toList(); Map map = new HashMap<>(list.size()); for (Map.Entry entry : list) { map.put(entry.getKey(), entry.getValue()); } return map; } }