/**
 * 
 */
package eu.dnetlib.miscutils.collections;

import java.util.Collection;
import java.util.Iterator;

import eu.dnetlib.miscutils.functional.UnaryFunction;

/**
 * @author marko
 * 
 */
public class MappedCollection<T, K> implements Iterable<T> {
	private transient final Collection<K> coll;
	private transient final UnaryFunction<T, K> mapper;

	public MappedCollection(final Collection<K> coll, final UnaryFunction<T, K> mapper) {
		this.coll = coll;
		this.mapper = mapper;
	}

	class MappedIterator implements Iterator<T> {
		private transient final Iterator<K> iter;

		public MappedIterator() {
			this.iter = coll.iterator();
		}

		public T next() {
			return mapper.evaluate(iter.next());
		}

		public boolean hasNext() {
			return iter.hasNext();
		}

		public void remove() {
			iter.remove();
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Iterable#iterator()
	 */
	public Iterator<T> iterator() {
		return new MappedIterator();
	}

}
