/*******************************************************************************
* Copyright (c) 2007 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial implementation
*******************************************************************************/
package melnorme.utilbox.misc;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.ListIterator;
import melnorme.utilbox.collections.ChainedIterable;
public class IteratorUtil {
public static final Iterator<?> EMPTY_ITERATOR = Collections.EMPTY_LIST.iterator();
/** @return an empty iterator */
@SuppressWarnings("unchecked")
public static <E> Iterator<E> emptyIterator() {
return (Iterator<E>) EMPTY_ITERATOR;
}
/** @return an iterable with no elements. */
public static <E> Iterable<E> emptyIterable() {
return Collections.EMPTY_LIST;
}
/** Recasts the type parameter of given iterator to a more specific type.
* Safe to do if the returned iterator is used in a read only way with regards to the underlying collection.
* @return the recasted iterator. */
@SuppressWarnings("unchecked")
public static <E> Iterator<E> recast(Iterator<? extends E> iterator) {
return ((Iterator<E>) iterator);
}
public static <E> Iterator<E> singletonIterator(E obj) {
return Collections.singletonList(obj).iterator();
}
/** @return the iterator for given iterable, or an empty {@link Iterator} if iterable is null */
public static <E> Iterator<E> nonNullIterator(Iterable<E> iterable) {
return iterable == null ? Collections.<E>emptyIterator() : iterable.iterator();
}
/** @return the given iterable, or an empty {@link Iterable} if given iterable is null */
public static <E> Iterable<E> nonNullIterable(Iterable<E> iterable) {
return iterable == null ? Collections.<E>emptyList() : iterable;
}
/** @return an {@link Iterable} for given array. A null array is treated as if it's an empty one. */
@SafeVarargs
public static <E> Iterable<E> iterable(E... array) {
if(array == null) {
return Collections.EMPTY_LIST;
}
return Arrays.asList(array);
}
/** @return the given iterable if non-null, an empty iterable otherwise. */
public static <E> Iterable<E> iterable(Iterable<E> iterable) {
if(iterable == null) {
return Collections.EMPTY_LIST;
}
return iterable;
}
/** @return combine two {@link Iterable}s to form a single chained iterable.
* Each given {@link Iterable} can be null, in which case they will be treated as empty. */
public static <E> Iterable<? extends E> chainedIterable(
Iterable<? extends E> firstIter, Iterable<? extends E> secondIter) {
if(firstIter != null && secondIter != null) {
return new ChainedIterable<E>(firstIter, secondIter);
} else if(firstIter != null) {
return firstIter;
} else if(secondIter != null) {
return secondIter;
} else {
return emptyIterable();
}
}
/* ----------------- ----------------- */
/** @return the element the given listIterator currently refers to. (uses #previous and #next) */
public static <E> E getCurrentElement(ListIterator<E> listIterator) {
listIterator.previous();
return listIterator.next();
}
}