All Downloads are FREE. Search and download functionalities are using the official Maven repository.

se.softhouse.common.guavaextensions.Suppliers2 Maven / Gradle / Ivy

/* Copyright 2013 Jonatan Jönsson
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package se.softhouse.common.guavaextensions;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Lists.newArrayListWithCapacity;

import java.util.List;

import javax.annotation.concurrent.Immutable;

import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;

/**
 * Additional implementations of the {@link Supplier} interface, as a complement of
 * {@link Suppliers}
 */
@Immutable
public final class Suppliers2
{
	private Suppliers2()
	{
	}

	/**
	 * Creates a {@link Supplier} that supplies {@code elementsToSupply} number of elements from
	 * {@code elementSupplier}
	 * 
	 * @throws IllegalArgumentException if {@code elementsToSupply} is less than zero
	 */
	public static  Supplier> ofRepeatedElements(Supplier elementSupplier, int elementsToSupply)
	{
		checkNotNull(elementSupplier);
		checkArgument(elementsToSupply >= 0, "elementsToSupply may not be negative");
		return new ListSupplier(elementSupplier, elementsToSupply);
	}

	private static final class ListSupplier implements Supplier>
	{
		private final Supplier elementSupplier;
		private final int elementsToSupply;

		private ListSupplier(Supplier elementSupplier, final int elementsToSupply)
		{
			this.elementSupplier = elementSupplier;
			this.elementsToSupply = elementsToSupply;
		}

		@Override
		public List get()
		{
			List result = newArrayListWithCapacity(elementsToSupply);
			for(int i = 0; i < elementsToSupply; i++)
			{
				result.add(elementSupplier.get());
			}
			return result;
		}
	}

	/**
	 * Returns true if {@code Supplier} is likely to supply values very fast
	 */
	public static boolean isSuppliedAlready(Supplier supplier)
	{
		if(supplier.getClass().equals(OF_INSTANCE))
			return true;
		else if(supplier instanceof ListSupplier)
		{
			ListSupplier listSupplier = (ListSupplier) supplier;
			if(listSupplier.elementSupplier.getClass().equals(OF_INSTANCE))
				return true;
		}
		return false;
	}

	private static final Class OF_INSTANCE = Suppliers.ofInstance(null).getClass();
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy