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