/******************************************************************************
 * Copyright (c) 2010 Oracle
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *    Konstantin Komissarchik - initial implementation and ongoing maintenance
 ******************************************************************************/

package org.eclipse.wst.common.project.facet.core.util.internal;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
 */

public final class CollectionsUtil
{
    private CollectionsUtil() {}
    
    @SuppressWarnings( "rawtypes" )
    
    private static final Comparator<Comparable<? super Comparable>> INVERTING_COMPARATOR 
        = new Comparator<Comparable<? super Comparable>>()
    {
        public int compare( final Comparable<? super Comparable> obj1,
                            final Comparable<? super Comparable> obj2 )
        {
            return obj2.compareTo( obj1 );
        }
    };

    /**
     * Returns a comparator that simply inverts the results of comparing to 
     * <code>Comparable</code> objects. This is useful for sorting a list in
     * reverse of it's natural order.
     *  
     * @return an inverting comparator
     */
    
    @SuppressWarnings( { "unchecked", "rawtypes" } )
    
    public static <T extends Comparable> Comparator<T> getInvertingComparator()
    {
        return (Comparator<T>) INVERTING_COMPARATOR;
    }
    
    public static <T> Set<T> set( final T... entries )
    {
        switch( entries.length )
        {
            case 0:
            {
                return Collections.emptySet();
            }
            case 1:
            {
                return Collections.singleton( entries[ 0 ] );
            }
            default:
            {
                final Set<T> result = new HashSet<T>();
                
                for( T entry : entries )
                {
                    result.add( entry );
                }
                
                return result;
            }
        }
    }

    public static <T> List<T> list( final T... entries )
    {
        switch( entries.length )
        {
            case 0:
            {
                return Collections.emptyList();
            }
            case 1:
            {
                return Collections.singletonList( entries[ 0 ] );
            }
            default:
            {
                final List<T> result = new ArrayList<T>();
                
                for( T entry : entries )
                {
                    result.add( entry );
                }
                
                return result;
            }
        }
    }
    
}
