package org.javers.common.collections;
import java.util.*;
import java.util.Collections;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import static java.util.Collections.EMPTY_LIST;
import static java.util.Collections.unmodifiableList;
import static org.javers.common.validation.Validate.argumentsAreNotNull;
public class Lists {
public static List wrapNull(Object list){
if (list == null){
return Collections.emptyList();
}
return (List)list;
}
public static <T> List<T> immutableListOf(T... elements){
return unmodifiableList(java.util.Arrays.asList(elements));
}
public static <E> List<E> asList(E... elements) {
return (List)Arrays.asList(elements);
}
/**
* @return index -> value
*/
public static <T> Map<Integer, T> asMap(List<T> input) {
if (input == null){
return null;
}
Map<Integer, T> result = new HashMap<>();
int i = 0;
for (T element : input) {
result.put(i, element);
i++;
}
return result;
}
/**
* returns new list with elements from input that satisfies given filter condition
*/
public static <T> List<T> positiveFilter(List<T> input, Predicate<T> filter) {
argumentsAreNotNull(input, filter);
return input.stream().filter(filter).collect(Collectors.toList());
}
/**
* returns new list with elements from input that don't satisfies given filter condition
*/
public static <T> List<T> negativeFilter(List<T> input, final Predicate<T> filter) {
argumentsAreNotNull(input, filter);
return input.stream().filter(element -> !filter.test(element)).collect(Collectors.toList());
}
public static <F, T> List<T> transform(Collection<F> input, Function<F, T> transformation) {
argumentsAreNotNull(input, transformation);
return input.stream().map(transformation::apply).collect(Collectors.toList());
}
public static <E> List<E> difference(List<E> first, List<E> second) {
if (first == null) {
return EMPTY_LIST;
}
if (second == null) {
return first;
}
List<E> difference = new ArrayList<>(first);
difference.removeAll(second);
return difference;
}
public static <t> Collector<t, List<t>, List<t>> toImmutableList() {
return Collector.of(ArrayList::new, List::add, (left, right) -> {
left.addAll(right);
return left;
}, Collections::unmodifiableList);
}
}