package org.zwobble.mammoth.internal.docx; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import org.zwobble.mammoth.internal.documents.DocumentElement; import org.zwobble.mammoth.internal.results.InternalResult; import java.util.List; import java.util.Set; import java.util.function.BiFunction; import java.util.function.Function; import static org.zwobble.mammoth.internal.util.MammothLists.list; import static org.zwobble.mammoth.internal.util.MammothSets.set; public class ReadResult { public static final ReadResult EMPTY_SUCCESS = success(list()); public static ReadResult concat(Iterable results) { ImmutableList.Builder elements = ImmutableList.builder(); ImmutableList.Builder extra = ImmutableList.builder(); ImmutableSet.Builder warnings = ImmutableSet.builder(); for (ReadResult result : results) { elements.addAll(result.elements); extra.addAll(result.extra); warnings.addAll(result.warnings); } return new ReadResult(elements.build(), extra.build(), warnings.build()); } public static ReadResult map( InternalResult first, ReadResult second, BiFunction, DocumentElement> function) { return new ReadResult( list(function.apply(first.getValue(), second.elements)), second.extra, Sets.union(first.getWarnings(), second.warnings).immutableCopy()); } public static ReadResult success(DocumentElement element) { return success(list(element)); } public static ReadResult success(List elements) { return new ReadResult(elements, list(), set()); } public static ReadResult emptyWithWarning(String warning) { return new ReadResult(list(), list(), set(warning)); } public static ReadResult withWarning(DocumentElement element, String warning) { return new ReadResult(list(element), list(), set(warning)); } private final List elements; private final List extra; private final Set warnings; public ReadResult(List elements, List extra, Set warnings) { this.elements = elements; this.extra = extra; this.warnings = warnings; } public ReadResult map(Function, DocumentElement> function) { return new ReadResult( list(function.apply(elements)), extra, warnings); } public ReadResult toExtra() { return new ReadResult(list(), concat(extra, elements), warnings); } public ReadResult appendExtra() { return new ReadResult(concat(elements, extra), list(), warnings); } public InternalResult> toResult() { return new InternalResult<>(elements, warnings); } private static List concat(List first, List second) { ImmutableList.Builder builder = ImmutableList.builder(); builder.addAll(first); builder.addAll(second); return builder.build(); } }