/******************************************************************************* * 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; } }