package org.warp.commonutils.concurrency.future; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.concurrent.CompletableFuture; public class SizedFutureSet { private final CompletableFuture>> data; private final CompletableFuture size; public SizedFutureSet(CompletableFuture>> data, CompletableFuture size) { this.data = data; this.size = size; } public static SizedFutureSet empty() { return new SizedFutureSet<>(CompletableFuture.completedFuture(List.of()), CompletableFuture.completedFuture(0)); } public CompletableFuture>> getFutureDataOrdered() { return data.thenApply(LinkedHashSet::new); } public CompletableFuture>> getFutureDataUnordered() { return data.thenApply(HashSet::new); } public LinkedHashSet getDataOrdered() { return CompletableFutureUtils.collectToLinkedSetFuture(data); } public Set getDataUnordered() { return CompletableFutureUtils.collectToSet(data); } public CompletableFuture getSize() { return size; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } SizedFutureSet that = (SizedFutureSet) o; return Objects.equals(data, that.data) && Objects.equals(size, that.size); } @Override public int hashCode() { return Objects.hash(data, size); } @Override public String toString() { return "SizedFutureList{" + "data=" + data + ", size=" + size + '}'; } }