blob: be1ff3b87ae38e341fbc514c841b57100fdec9b7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 itemis AG (http://www.itemis.eu) and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.xtext.xbase.lib;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.internal.FunctionDelegate;
import org.eclipse.xtext.xbase.lib.internal.KeyComparator;
import com.google.common.annotations.GwtCompatible;
import com.google.common.collect.Lists;
/**
* This is an extension library for {@link List lists}.
*
* @author Sebastian Zarnekow - Initial contribution and API
*/
/* To be discussed:
* List#binarySearch(Comparator<T>)
* List#binarySearchBy(T->Comparable<?>)
* List#reverseView should return a list and not an iterable
* List#tail -> List
* List#take -> List
* List#drop -> List
*/
@GwtCompatible public class ListExtensions {
/**
* Sorts the specified list itself into ascending order, according to the natural ordering of its elements.
*
* @param list
* the list to be sorted. May not be <code>null</code>.
* @return the sorted list itself.
* @see Collections#sort(List)
*/
public static <T extends Comparable<? super T>> List<T> sortInplace(List<T> list) {
Collections.sort(list);
return list;
}
/**
* Sorts the specified list itself according to the order induced by the specified comparator.
*
* @param list
* the list to be sorted. May not be <code>null</code>.
* @param comparator
* the comparator to be used. May be <code>null</code> to indicate that the natural ordering of the
* elements should be used.
* @return the sorted list itself.
* @see Collections#sort(List, Comparator)
* @see #sortInplace(List)
* @see #sortInplaceBy(List, org.eclipse.xtext.xbase.lib.Functions.Function1)
*/
public static <T> List<T> sortInplace(List<T> list, Comparator<? super T> comparator) {
Collections.sort(list, comparator);
return list;
}
/**
* Sorts the specified list itself according to the order induced by applying a key function to each element which
* yields a comparable criteria.
*
* @param list
* the list to be sorted. May not be <code>null</code>.
* @param key
* the key function to-be-used. May not be <code>null</code>.
* @return the sorted list itself.
* @see Collections#sort(List)
*/
public static <T, C extends Comparable<? super C>> List<T> sortInplaceBy(List<T> list,
final Functions.Function1<? super T, C> key) {
if (key == null)
throw new NullPointerException("key");
Collections.sort(list, new KeyComparator<T, C>(key));
return list;
}
/**
* Provides a reverse view on the given list which is especially useful to traverse a list backwards in a for-each
* loop. The list itself is not modified by calling this method.
*
* @param list
* the list whose elements should be traversed in reverse. May not be <code>null</code>.
* @return a list with the same elements as the given list, in reverse
*/
@Pure
public static <T> List<T> reverseView(List<T> list) {
return Lists.reverse(list);
}
/**
* Reverses the order of the elements in the specified list. The list itself will be modified.
*
* @param list
* the list whose elements are to be reversed.
* @return the list itself
* @throws UnsupportedOperationException
* if the specified list or its list-iterator does not support the <tt>set</tt> method.
*/
public static <T> List<T> reverse(List<T> list) {
Collections.reverse(list);
return list;
}
/**
* Returns a list that performs the given {@code transformation} for each element of {@code original} when
* requested. The mapping is done lazily. That is, subsequent iterations of the elements in the list will
* repeatedly apply the transformation. The returned list is a transformed view of {@code original}; changes to
* {@code original} will be reflected in the returned list and vice versa (e.g. invocations of {@link List#remove(int)}).
*
*
* @param original
* the original list. May not be <code>null</code>.
* @param transformation
* the transformation. May not be <code>null</code>.
* @return a list that effectively contains the results of the transformation. Never <code>null</code>.
*/
@Pure
public static <T, R> List<R> map(List<T> original, Function1<? super T, ? extends R> transformation) {
return Lists.transform(original, new FunctionDelegate<T, R>(transformation));
}
}