blob: d5cefd7b2381b59e2f4d77fb7316b51b0993174a [file] [log] [blame]
/*******************************************************************************
* 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 v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* 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;
}
}