/*******************************************************************************
 * Copyright (c) 2006, 2012 Oracle Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.util;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/**
 * A little bit of LISP.
 *
 * @author Michal Chmielewski (michal.chmielewski@oracle.com)
 * @date Jul 19, 2006
 *
 */
public class ListMap {

	/**
	 *
	 */
	static final public Object IGNORE = new Object();

	/**
	 * Interface visitor. The object returned from visit need not be the same
	 * object as passed to visit. If IGNORE is returned (above), then
	 * the resulting value will not be added to the resulting list.
	 */

	static public interface Visitor {
		/**
		 * @param obj the object to visit.
		 * @return some other object, the object itself, or IGNORE
		 */
		public Object visit ( Object obj );
	}



	/**
	 *  Map the visitor "visitor" on the list "list" and return the result as a list. If the list argument
	 *  is passed (ret) the result is returned as an array of the results, otherwise it is a list.
	 *
	 * @param list the list of objects
	 * @param visitor the visitor
	 * @param ret the array class to convert the results into.
	 * @return the resulting (new) list
	 */
	static public Object Map ( List<?> list, Visitor visitor , Object[] ret ) {
		List<Object> output = new ArrayList<Object>(list.size());
		for(Object n : list) {
			Object result = visitor.visit(n);
			if (result != IGNORE) {
				output.add( result );
			}
		}
		if (ret == null) {
			return output;
		}

		return output.toArray(ret);
	}


	/**
	 *  Map the visitor "visitor" on the list "list" and return the result as a list. If the list argument
	 *  is passed (ret) the result is returned as an array of the results, otherwise it is a list.
	 *
	 * @param list the list of objects
	 * @param visitor the visitor
	 * @param ret the array class to convert the results into.
	 * @return the resulting (new) list
	 */

	static public Object Map (Object[] list, Visitor visitor, Object[] ret) {
		List<Object> l2 = new ArrayList<Object>(list.length);
		for( Object n : list) {
			l2.add(n);
		}
		return Map ( l2, visitor , ret);
	}


	/**
	 * @param list the list of objects.
	 * @param visitor the visitor
	 * @return the object found or null
	 */
	static public final Object Find (List<?> list, Visitor visitor) {
		for(Object n : list) {
			Object result = visitor.visit ( n );
			if (result != IGNORE) {
				return result;
			}
		}
		return null;
	}





	/**
	 * Find the element using the comparator in the list.
	 *
	 * @param list
	 * @param key
	 * @param comparator
	 * @return the element found or null
	 */

	public static Object findElement (List<?> list, Object key, Comparator<Object> comparator) {
		for (Object n : list) {
			if (comparator.compare(n, key) == 0) {
				return n;
			}
		}
		return null;
	}


}
