// Copyright © 2015 HSL <https://www.hsl.fi>
// This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses.
package fi.hsl.parkandride.back;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
public class ListUtil {
public static <T> List<List<T>> transpose(List<List<T>> sources) {
List<Iterator<T>> iterators = sources.stream()
.map(List::iterator)
.collect(Collectors.toList());
List<List<T>> results = new ArrayList<>();
while (hasNexts(iterators)) {
results.add(nexts(iterators));
}
return results;
}
private static <T> boolean hasNexts(List<Iterator<T>> heads) {
return heads.stream().anyMatch(Iterator::hasNext);
}
private static <T> List<T> nexts(List<Iterator<T>> heads) {
return heads.stream()
.filter(Iterator::hasNext)
.map(Iterator::next)
.collect(Collectors.toList());
}
}