package jetbrains.mps.internal.collections.runtime;
/*Generated by MPS */
import jetbrains.mps.baseLanguage.closures.runtime.AdapterClass;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import jetbrains.mps.internal.collections.runtime.impl.FilteringSequence;
import jetbrains.mps.internal.collections.runtime.impl.NegateWhereFilter;
import jetbrains.mps.internal.collections.runtime.impl.TranslatingSequence;
import jetbrains.mps.internal.collections.runtime.impl.SelectingSequence;
import jetbrains.mps.internal.collections.runtime.impl.OfTypeSequence;
import jetbrains.mps.internal.collections.runtime.impl.SortingSequence;
import java.util.Comparator;
import jetbrains.mps.internal.collections.runtime.impl.LimitedCardinalitySequence;
import jetbrains.mps.internal.collections.runtime.impl.PagingSequence;
import jetbrains.mps.internal.collections.runtime.impl.ConcatingSequence;
import jetbrains.mps.internal.collections.runtime.impl.NullSequence;
import jetbrains.mps.internal.collections.runtime.impl.ComparingSequence;
import jetbrains.mps.internal.collections.runtime.impl.ReversingSequence;
import jetbrains.mps.internal.collections.runtime.impl.EnumeratorIterator;
public abstract class AbstractSequence<T> implements ISequence<T>, Iterable<T> {
public static final boolean USE_NULL_SEQUENCE = true;
public static final boolean IGNORE_NULL_VALUES = false;
public static final boolean NULL_WHEN_EMPTY = true;
public static final boolean NULL_ARRAY_IS_SINGLETON = true;
protected static final Object[] ARRAY_WITH_NULL = new Object[]{null};
public AbstractSequence() {
}
@Override
public ISequence<T> where(@AdapterClass(value = "IWhereFilter") _FunctionTypes._return_P1_E0<? extends Boolean, ? super T> filter) {
return new FilteringSequence<T>(this, filter);
}
@Override
public T findFirst(@AdapterClass(value = "IWhereFilter") _FunctionTypes._return_P1_E0<? extends Boolean, ? super T> filter) {
return where(filter).first();
}
@Override
public T findLast(@AdapterClass(value = "IWhereFilter") _FunctionTypes._return_P1_E0<? extends Boolean, ? super T> filter) {
return where(filter).last();
}
@Override
public boolean any(@AdapterClass(value = "IWhereFilter") _FunctionTypes._return_P1_E0<? extends Boolean, ? super T> filter) {
return where(filter).isNotEmpty();
}
@Override
public boolean all(@AdapterClass(value = "IWhereFilter") _FunctionTypes._return_P1_E0<? extends Boolean, ? super T> filter) {
return where(new NegateWhereFilter<T>(filter)).isEmpty();
}
@Override
public <U> ISequence<U> translate(@AdapterClass(value = "ITranslator2") _FunctionTypes._return_P1_E0<? extends Iterable<U>, ? super T> translator) {
return new TranslatingSequence<T, U>(this, translator);
}
@Override
public <U> ISequence<U> select(@AdapterClass(value = "ISelector") _FunctionTypes._return_P1_E0<? extends U, ? super T> selector) {
return new SelectingSequence<T, U>(this, selector);
}
@Override
public <U> ISequence<U> ofType(Class<U> type) {
return new OfTypeSequence<T, U>(this, type);
}
@Override
public ISequence<T> sort(@AdapterClass(value = "ISelector") _FunctionTypes._return_P1_E0<? extends Comparable<?>, ? super T> selector, boolean ascending) {
return new SortingSequence<T>(this, new SelectComparator<T>(selector), ascending);
}
@Override
public ISequence<T> alsoSort(@AdapterClass(value = "ISelector") _FunctionTypes._return_P1_E0<? extends Comparable<?>, ? super T> selector, boolean ascending) {
return sort(selector, ascending);
}
@Override
public ISequence<T> sort(Comparator<? super T> comparator, boolean ascending) {
return new SortingSequence<T>(this, comparator, ascending);
}
@Override
public ISequence<T> distinct() {
return new LimitedCardinalitySequence<T>(this, 1);
}
@Override
public void visitAll(@AdapterClass(value = "IVisitor") _FunctionTypes._void_P1_E0<? super T> visitor) {
IterableUtils.visitAll(toIterable(), visitor);
}
@Override
public ISequence<T> take(int length) {
return new PagingSequence<T>(this, PagingSequence.Page.TAKE, length);
}
@Override
public ISequence<T> skip(int length) {
return new PagingSequence<T>(this, PagingSequence.Page.SKIP, length);
}
@Override
public ISequence<T> cut(int length) {
return new PagingSequence<T>(this, PagingSequence.Page.CUT, length);
}
@Override
public ISequence<T> tail(int length) {
return new PagingSequence<T>(this, PagingSequence.Page.TAIL, length);
}
@Override
public ISequence<T> page(int skip, int skipplustake) {
int take = skipplustake - skip;
return skip(skip).take(take);
}
@Override
public ISequence<T> concat(ISequence<? extends T> that) {
if (USE_NULL_SEQUENCE) {
if (that == null) {
return this;
}
}
return new ConcatingSequence<T>(this, that);
}
@Override
public ISequence<T> intersect(ISequence<?> that) {
if (USE_NULL_SEQUENCE) {
if (that == null) {
return NullSequence.instance();
}
}
return new ComparingSequence<T>(ComparingSequence.Kind.INTERSECTION, this, that);
}
@Override
public ISequence<T> subtract(ISequence<?> that) {
if (USE_NULL_SEQUENCE) {
if (that == null) {
return this;
}
}
return new ComparingSequence<T>(ComparingSequence.Kind.SUBSTRACTION, this, that);
}
@Override
public ISequence<T> union(ISequence<? extends T> that) {
if (USE_NULL_SEQUENCE) {
if (that == null) {
return this;
}
}
return new ComparingSequence<T>(this, that, ComparingSequence.Kind.UNION);
}
@Override
public ISequence<T> disjunction(ISequence<? extends T> that) {
if (USE_NULL_SEQUENCE) {
if (that == null) {
return this;
}
}
return new ComparingSequence<T>(this, that, ComparingSequence.Kind.DISJUNCTION);
}
@Override
public ISequence<T> reverse() {
return new ReversingSequence<T>(this);
}
@Override
public boolean contains(Object o) {
return IterableUtils.contains(toIterable(), (T) o);
}
@Override
public boolean containsSequence(ISequence<? extends T> that) {
if (USE_NULL_SEQUENCE) {
if (that == null) {
return false;
}
}
return this.intersect(that).disjunction(that).isEmpty();
}
@Override
public int indexOf(T t) {
return IterableUtils.indexOf(toIterable(), t);
}
@Override
public int lastIndexOf(T t) {
return IterableUtils.lastIndexOf(toIterable(), t);
}
@Override
public int count() {
return IterableUtils.count(toIterable());
}
@Override
public boolean isEmpty() {
return IterableUtils.isEmpty(toIterable());
}
@Override
public boolean isNotEmpty() {
return IterableUtils.isNotEmpty(toIterable());
}
@Override
public T first() {
return IterableUtils.first(toIterable());
}
@Override
public T last() {
return IterableUtils.last(toIterable());
}
@Override
public T reduceLeft(_FunctionTypes._return_P2_E0<? extends T, ? super T, ? super T> comb) {
return IterableUtils.reduceLeft(this, comb);
}
@Override
public T reduceRight(_FunctionTypes._return_P2_E0<? extends T, ? super T, ? super T> comb) {
return IterableUtils.reduceRight(reverse(), comb);
}
@Override
public <S> S foldLeft(S seed, _FunctionTypes._return_P2_E0<? extends S, ? super S, ? super T> comb) {
return IterableUtils.foldLeft(this, seed, comb);
}
@Override
public <S> S foldRight(S seed, _FunctionTypes._return_P2_E0<? extends S, ? super T, ? super S> comb) {
return IterableUtils.foldRight(reverse(), seed, comb);
}
@Override
public Iterable<T> toIterable() {
return this;
}
@Override
public IListSequence<T> toListSequence() {
return ListSequence.fromIterable(toIterable());
}
@Override
public T[] toGenericArray() {
return toListSequence().toGenericArray();
}
@Override
public T[] toGenericArray(Class<T> runtimeClass) {
return toListSequence().toGenericArray(runtimeClass);
}
@Override
public IEnumerator<T> enumerator() {
return EnumeratorIterator.fromIterator(toIterable().iterator());
}
@Override
public String toString() {
Iterable<T> iterable = toIterable();
if (iterable == null) {
return "null";
}
StringBuilder sb = new StringBuilder("[");
String sep = "";
for (T t : iterable) {
sb.append(sep).append(String.valueOf(t));
sep = ", ";
}
sb.append("]");
return sb.toString();
}
}