/*******************************************************************************
 * Copyright (c) 2011 protos software gmbh (http://www.protos.de).
 * 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:
 * 		Henrik Rentz-Reichert (initial contribution)
 * 
 *******************************************************************************/

package org.eclipse.etrice.generator.fsm.base;

import java.util.ArrayList;
import java.util.List;

/**
 * helper class to associate indices with collection items
 * 
 * @author Henrik Rentz-Reichert
 *
 */
public class Indexed<T> {

	private T value;
	private int index;
	private boolean first;
	private boolean last;

	/**
	 * @return the original item of the collection
	 */
	public T getValue() {
		return value;
	}

	/**
	 * @return the zero based index plus the offset
	 */
	public int getIndex0() {
		return index;
	}

	/**
	 * @return the one based index plus the offset
	 */
	public int getIndex1() {
		return index + 1;
	}

	/**
	 * @return true if this is the first element
	 */
	public boolean isFirst() {
		return first;
	}

	/**
	 * @return true if this is the last element
	 */
	public boolean isLast() {
		return last;
	}

	private Indexed(T value, int index, boolean first, boolean last) {
		super();
		this.value = value;
		this.index = index;
		this.first = first;
		this.last = last;
	}

	/**
	 * @param iterable the initial collection of items
	 * @return an indexed collection of items
	 */
	public static <T> Iterable<Indexed<T>> indexed(Iterable<T> iterable) {
		return indexed(iterable, 0);
	}
	
	/**
	 * @param iterable the initial collection of items
	 * @param offset index0 starts at offset, index1 at offset+1
	 * @return an indexed collection of items
	 */
	public static <T> Iterable<Indexed<T>> indexed(Iterable<T> iterable, int offset) {
		List<T> all = new ArrayList<T>();
		for (T t : iterable) {
			all.add(t);
		}
		List<Indexed<T>> result = new ArrayList<Indexed<T>>();
		int counter = 0;
		for (T e : all) {
			result.add(new Indexed<T>(e, offset+counter, counter == 0, counter == all.size() - 1));
			counter++;
		}
		return result;
	}

}