package jetbrains.mps.internal.collections.runtime; /*Generated by MPS */ import jetbrains.mps.baseLanguage.closures.runtime.AdapterClass; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import java.util.Iterator; import java.util.NoSuchElementException; public class IterableUtils { public IterableUtils() { } public static <E> void visitAll(Iterable<E> seq, @AdapterClass(value = "IVisitor") _FunctionTypes._void_P1_E0<? super E> visitor) { for (Iterator<E> it = seq.iterator(); it.hasNext();) { try { visitor.invoke(it.next()); } catch (StopIteratingException stop) { break; } } } public static <E> boolean contains(Iterable<E> seq, E e) { return IterableUtils.indexOf(seq, e) >= 0; } public static <E> int indexOf(Iterable<E> seq, E e) { int index = 0; for (Iterator<E> it = seq.iterator(); it.hasNext(); index++) { if (IterableUtils.eq(it.next(), e)) { return index; } } return -1; } public static <E> int lastIndexOf(Iterable<E> seq, E e) { int lastIndex = -1; int index = 0; for (Iterator<E> it = seq.iterator(); it.hasNext(); index++) { if (IterableUtils.eq(it.next(), e)) { lastIndex = index; } } return lastIndex; } public static <E> int count(Iterable<E> seq) { int count = 0; for (Iterator<E> it = seq.iterator(); it.hasNext(); it.next()) { count++; } return count; } public static <E> boolean isEmpty(Iterable<E> seq) { return !((seq.iterator().hasNext())); } public static <E> boolean isNotEmpty(Iterable<E> seq) { return seq.iterator().hasNext(); } public static <E> E first(Iterable<E> seq) { Iterator<E> it = seq.iterator(); if (it.hasNext()) { return it.next(); } if (Sequence.NULL_WHEN_EMPTY) { return null; } throw new NoSuchElementException("Empty iterator"); } public static <E> E last(Iterable<E> seq) { E last = null; boolean hasLast = false; Iterator<E> it = seq.iterator(); if (Sequence.NULL_WHEN_EMPTY) { if (!(it.hasNext())) { return null; } } while (it.hasNext()) { last = it.next(); hasLast = true; } if (hasLast) { return last; } throw new NoSuchElementException("Empty iterator"); } public static String join(Iterable<? extends String> seq, String delimiter) { StringBuilder sb = new StringBuilder(); String sep = ""; for (Iterator<? extends String> it = seq.iterator(); it.hasNext();) { sb.append(sep).append(it.next()); sep = delimiter; } return sb.toString(); } public static <T> T reduceLeft(Iterable<T> seq, _FunctionTypes._return_P2_E0<? extends T, ? super T, ? super T> combinator) { Iterator<T> it = seq.iterator(); if (!(it.hasNext())) { if (Sequence.NULL_WHEN_EMPTY) { return null; } throw new NoSuchElementException("Empty iterator"); } T left = it.next(); while (it.hasNext()) { left = combinator.invoke(left, it.next()); } return left; } public static <T> T reduceRight(Iterable<T> revSeq, _FunctionTypes._return_P2_E0<? extends T, ? super T, ? super T> combinator) { Iterator<T> it = revSeq.iterator(); if (!(it.hasNext())) { if (Sequence.NULL_WHEN_EMPTY) { return null; } throw new NoSuchElementException("Empty iterator"); } T right = it.next(); while (it.hasNext()) { right = combinator.invoke(it.next(), right); } return right; } public static <T, S> S foldLeft(Iterable<T> seq, S seed, _FunctionTypes._return_P2_E0<? extends S, ? super S, ? super T> combinator) { S s = seed; for (Iterator<T> it = seq.iterator(); it.hasNext();) { s = combinator.invoke(s, it.next()); } return s; } public static <T, S> S foldRight(Iterable<T> revSeq, S seed, _FunctionTypes._return_P2_E0<? extends S, ? super T, ? super S> combinator) { S s = seed; for (Iterator<T> it = revSeq.iterator(); it.hasNext();) { s = combinator.invoke(it.next(), s); } return s; } private static boolean eq(Object a, Object b) { return (a == b) || (((a != null) ? a.equals(b) : false)); } }