/* * This file is part of ReadonlyREST. * * ReadonlyREST is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ReadonlyREST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ReadonlyREST. If not, see http://www.gnu.org/licenses/ */ package org.elasticsearch.plugin.readonlyrest.utils; import java.util.Iterator; import java.util.concurrent.CompletableFuture; import java.util.function.BiFunction; import java.util.function.Function; public final class FuturesSequencer { private FuturesSequencer() { } public static <A, B, C> CompletableFuture<C> runInSeqUntilConditionIsUndone(Iterator<A> iterator, Function<A, CompletableFuture<B>> asyncFunc, Function<B, Boolean> breakCondition, Function<B, C> breakReturn, Function<Void, C> noBreakReturn) { return runInSeqUntilConditionIsUndone(iterator, asyncFunc, (a, b) -> breakCondition.apply(b), breakReturn, noBreakReturn); } public static <A, B> CompletableFuture<B> runInSeqUntilConditionIsUndone(Iterator<A> iterator, Function<A, CompletableFuture<B>> asyncFunc, BiFunction<A, B, Boolean> breakCondition, Function<Void, B> noBreakReturn) { return runInSeqUntilConditionIsUndone(iterator, asyncFunc, breakCondition, res -> res, noBreakReturn); } public static <A, B, C> CompletableFuture<C> runInSeqUntilConditionIsUndone(Iterator<A> iterator, Function<A, CompletableFuture<B>> asyncFunc, BiFunction<A, B, Boolean> breakCondition, Function<B, C> breakReturn, Function<Void, C> noBreakReturn) { if (iterator.hasNext()) { A value = iterator.next(); return asyncFunc.apply(value) .thenCompose(result -> { if (breakCondition.apply(value, result)) { return CompletableFuture.completedFuture(breakReturn.apply(result)); } else { return runInSeqUntilConditionIsUndone(iterator, asyncFunc, breakCondition, breakReturn, noBreakReturn); } }); } else { return CompletableFuture.completedFuture(noBreakReturn.apply(null)); } } }