package jetbrains.mps.internal.collections.runtime;
/*Generated by MPS */
import java.util.List;
import java.io.Serializable;
import java.util.Collections;
import jetbrains.mps.internal.collections.runtime.impl.NullListSequence;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class ListSequence<T> extends AbstractListSequence<T> implements IListSequence<T>, List<T>, Serializable {
private static final long serialVersionUID = 7823717404349215342L;
private List<T> list;
protected ListSequence(List<T> list) {
super(list);
}
protected ListSequence(ListSequence<T> other) {
super(other);
}
@Override
public IListSequence<T> reversedList() {
ListSequence<T> reversed = new ListSequence<T>(this);
reversed._reverse();
return reversed;
}
@Override
public IListSequence<T> subListSequence(int fromIdx, int upToIdx) {
return new ListSequence<T>(getList().subList(fromIdx, upToIdx));
}
@Override
public IListSequence<T> headListSequence(int upToIdx) {
return new ListSequence<T>(getList().subList(0, upToIdx));
}
@Override
public IListSequence<T> tailListSequence(int fromIdx) {
return new ListSequence<T>(getList().subList(fromIdx, getList().size()));
}
@Override
public IListSequence<T> asUnmodifiable() {
return new ListSequence<T>(Collections.unmodifiableList(getList()));
}
@Override
public IListSequence<T> asSynchronized() {
return new ListSequence<T>(CollectionUtils.synchronizedList(getList()));
}
public static <U> IListSequence<U> fromArray(U... array) {
if (Sequence.USE_NULL_SEQUENCE) {
if (array == null) {
return NullListSequence.instance();
}
}
return ListSequence.fromListAndArray(new ArrayList<U>(), array);
}
public static <U> IListSequence<U> fromList(List<U> list) {
if (Sequence.USE_NULL_SEQUENCE) {
if (list == null) {
return NullListSequence.instance();
}
}
if (list instanceof IListSequence<?>) {
return (IListSequence<U>) list;
}
return new ListSequence<U>(list);
}
public static <U> IListSequence<U> fromListAndArray(List<U> list, U... array) {
if (Sequence.NULL_ARRAY_IS_SINGLETON) {
if (array == null) {
array = (U[]) Sequence.nullSingletonArray();
}
}
if (Sequence.USE_NULL_SEQUENCE) {
if (list == null && array == null) {
return NullListSequence.instance();
} else
if (list == null) {
list = new ArrayList<U>();
} else
if (array == null) {
if (list instanceof IListSequence<?>) {
return (IListSequence<U>) list;
}
return new ListSequence<U>(list);
}
}
List<U> input = Arrays.asList(array);
if (Sequence.IGNORE_NULL_VALUES) {
for (U u : input) {
if (u != null) {
list.add(u);
}
}
} else {
list.addAll(input);
}
if (list instanceof IListSequence<?>) {
return (IListSequence<U>) list;
}
return new ListSequence<U>(list);
}
public static <U> IListSequence<U> fromIterable(Iterable<U> it) {
if (Sequence.USE_NULL_SEQUENCE) {
if (it == null) {
return NullListSequence.instance();
}
}
if (it instanceof IListSequence<?>) {
return (IListSequence<U>) it;
}
List<U> list = new ArrayList<U>();
if (Sequence.IGNORE_NULL_VALUES) {
for (U u : it) {
if (u != null) {
list.add(u);
}
}
} else
if (it instanceof Collection<?>) {
list.addAll((Collection<? extends U>) it);
} else {
for (U u : it) {
list.add(u);
}
}
return new ListSequence<U>(list);
}
public static <U> IListSequence<U> fromListWithValues(List<U> list, Iterable<? extends U> it) {
List<U> tmp = list;
if (Sequence.USE_NULL_SEQUENCE) {
if (list == null && it == null) {
return NullListSequence.instance();
} else
if (list == null) {
tmp = new ArrayList<U>();
} else
if (it == null) {
return ListSequence.fromList(list);
}
}
if (Sequence.IGNORE_NULL_VALUES) {
for (U u : it) {
if (u != null) {
tmp.add(u);
}
}
} else
if (it instanceof Collection<?>) {
tmp.addAll((Collection<? extends U>) it);
} else {
for (U u : it) {
tmp.add(u);
}
}
if (tmp instanceof IListSequence<?>) {
return (IListSequence<U>) tmp;
}
return new ListSequence<U>(tmp);
}
}