/*
 * Java Genetic Algorithm Library (@__identifier__@).
 * Copyright (c) @__year__@ Franz Wilhelmstötter
 *
 * 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.
 *
 * Author:
 *    Franz Wilhelmstötter (franz.wilhelmstoetter@gmx.at)
 */
package org.jenetics.optimizer;

import java.util.function.DoubleFunction;

import org.jenetics.DoubleGene;
import org.jenetics.Gene;
import org.jenetics.RouletteWheelSelector;
import org.jenetics.Selector;

/**
 * @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
 * @version !__version__!
 * @since !__version__!
 */
public interface Ctor<T> {

	public int argsLength();

	public T cons(final double... args);

	@SafeVarargs
	public static <G extends Gene<?, G>, C extends Comparable<? super C>>
	Ctor<Selector<G, C>> ofSelector(
		final Class<? extends Selector> type,
		DoubleFunction<Object>... args
	) {
		return null;
	}


	static void foo() {
		Ctor<Selector<DoubleGene, Double>> c = ofSelector(RouletteWheelSelector.class);
	}

}

@@ -813,109 +813,75 @@
 on;%0A
-%0A
 import 
-org.jenetics.DoubleGene;%0Aimport org.jenetics.Gene;%0Aimport org.jenetics.RouletteWheelSelector;
+java.util.stream.IntStream;%0Aimport java.util.stream.Stream;%0A
 %0Aimp
@@ -897,24 +897,25 @@
 enetics.
-Selector
+util.ISeq
 ;%0A%0A/**%0A 
@@ -1089,35 +1089,87 @@
 lic 
-int argsLength
+Class%3CT%3E type();%0A%0A%09public ISeq%3CDoubleFunction%3CObject%3E%3E parameters
 ();%0A%0A
+%0A
 %09public 
 T co
@@ -1164,16 +1164,24 @@
 %09public 
+default 
 T cons(f
@@ -1204,208 +1204,264 @@
 rgs)
-;%0A%0A%09@SafeVarargs%0A%09public static %3CG extends Gene%3C?, G%3E, C extends Comparable%3C? super C%3E%3E%0A%09Ctor%3CSelector%3CG, C%3E%3E ofSelector(%0A%09%09final Class%3C? extends Selector%3E type,%0A%09%09DoubleFunction%3CObject%3E... args%0A%09)
+ %7B%0A%09%09final Object%5B%5D parameters = IntStream.range(0, args.length)%0A%09%09%09.mapToObj(i -%3E parameters().get(i).apply(args%5Bi%5D))%0A%09%09%09.toArray();%0A%0A%09%09final Class%3C?%3E%5B%5D parameterTypes = Stream.of(parameters)%0A%09%09%09.map(Object::getClass)%0A%09%09%09.toArray(Class%5B%5D::new);%0A%0A%09%09try
  %7B%0A
+%09
 %09%09re
@@ -1469,121 +1469,163 @@
 urn 
-null;%0A%09%7D%0A%0A%0A%09static void foo() %7B%0A%09%09Ctor%3CSelector%3CDoubleGene, Double%3E%3E c = ofSelector(RouletteWheelSelector.class);
+type()%0A%09%09%09%09.getConstructor(parameterTypes)%0A%09%09%09%09.newInstance(parameters);%0A%09%09%7D catch (ReflectiveOperationException e) %7B%0A%09%09%09throw new RuntimeException(e);%0A%09%09%7D
 %0A%09%7D%0A

Rename Constructor class to Ctor.