package org.zwobble.mammoth.internal.util; import java.util.*; import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; import static java.util.Arrays.asList; import static org.zwobble.mammoth.internal.util.Iterables.stream; public class Lists { public static List list() { return Collections.emptyList(); } public static List list(T value1) { return Collections.singletonList(value1); } public static List list(T value1, T value2) { return asList(value1, value2); } public static List list(T value1, T value2, T value3) { return asList(value1, value2, value3); } @SafeVarargs public static List list(T... values) { return asList(values); } public static List cons(T head, Iterable tail) { return eagerConcat(list(head), tail); } public static List eagerConcat(Iterable first, Iterable second) { return Stream.concat(stream(first), stream(second)).collect(Collectors.toList()); } public static List eagerConcat(Collection first, Collection second, Collection third) { List result = new ArrayList<>(first.size() + second.size() + third.size()); result.addAll(first); result.addAll(second); result.addAll(third); return result; } public static List eagerFilter(Iterable iterable, Predicate predicate) { return stream(iterable).filter(predicate).collect(Collectors.toList()); } public static List eagerMap(Iterable iterable, Function function) { return stream(iterable).map(function).collect(Collectors.toList()); } public static List eagerMapWithIndex(Iterable iterable, BiFunction function) { return toList(Iterables.lazyMapWithIndex(iterable, function)); } public static List eagerFlatMap(Iterable iterable, Function> function) { return stream(iterable) .flatMap(element -> stream(function.apply(element))) .collect(Collectors.toList()); } public static > List orderedBy(Iterable iterable, Function getKey) { return stream(iterable) .sorted(orderBy(getKey)) .collect(Collectors.toList()); } private static > Comparator orderBy(Function getKey) { return (first, second) -> getKey.apply(first).compareTo(getKey.apply(second)); } public static List toList(Iterable iterable) { return stream(iterable).collect(Collectors.toList()); } public static Optional tryGetFirst(List list) { if (list.isEmpty()) { return Optional.empty(); } else { return Optional.of(list.get(0)); } } public static Optional tryGetLast(List list) { if (list.isEmpty()) { return Optional.empty(); } else { return Optional.of(list.get(list.size() - 1)); } } public static List skip(List list, int count) { return list.subList(Math.min(list.size(), count), list.size()); } public static Iterable reversed(List list) { return new Iterable() { @Override public Iterator iterator() { ListIterator iterator = list.listIterator(list.size()); return new Iterator() { @Override public boolean hasNext() { return iterator.hasPrevious(); } @Override public T next() { return iterator.previous(); } }; } }; } }