MutationPolicyHandlerResolver.java

package net.bmahe.genetics4j.core.mutation;

import java.util.List;
import java.util.Objects;

import net.bmahe.genetics4j.core.spec.AbstractEAExecutionContext;
import net.bmahe.genetics4j.core.spec.mutation.MutationPolicy;

public class MutationPolicyHandlerResolver<T extends Comparable<T>> {

	private final AbstractEAExecutionContext<T> eaExecutionContext;
	private final List<MutationPolicyHandler<T>> mutationPolicyHandlers;

	public MutationPolicyHandlerResolver(final AbstractEAExecutionContext<T> _eaExecutionContext) {
		Objects.requireNonNull(_eaExecutionContext);

		this.eaExecutionContext = _eaExecutionContext;
		mutationPolicyHandlers = eaExecutionContext.mutationPolicyHandlers();
	}

	public boolean canHandle(final MutationPolicy mutationPolicy) {
		Objects.requireNonNull(mutationPolicy);

		return mutationPolicyHandlers.stream().anyMatch(sph -> sph.canHandle(this, mutationPolicy));
	}

	public MutationPolicyHandler<T> resolve(final MutationPolicy mutationPolicy) {
		Objects.requireNonNull(mutationPolicy);

		return mutationPolicyHandlers.stream()
				.dropWhile(sph -> sph.canHandle(this, mutationPolicy) == false)
				.findFirst()
				.orElseThrow(
						() -> new IllegalStateException(
								"Could not find suitable mutation policy handler for policy: " + mutationPolicy));

	}
}