package sudoku.technique;

import java.util.function.Function;
import sudoku.Rule;
import sudoku.Sudoku;
import sudoku.time.TechniqueEvent;

public interface Technique extends Function<Sudoku,Technique>{
	
	/**
	 * <p>Performs this technique's analysis on the underlying sudoku graph.</p>
	 * 
	 * <p>If opportunities to set values in any cells or to mark values
	 * impossible in any cells arise, such an opportunity must be 
	 * exploited before the method returns.<p>
	 * @return a {@link sudoku.time.TechniqueEvent Time node} describing the 
	 * solution event that was performed, and whose subordinate Time nodes 
	 * describe subordinate steps of the solution event, such as 
	 * {@link Rule#validateFinalState() automatic resolution} of Rule-subset 
	 * scenarios, or returns null of no changes were made
	 */
	public TechniqueEvent digest();
}

@@ -843,10 +843,1016 @@
 gest();%0A
+%09%0A%09/**%0A%09 * %3Cp%3EOutputs a new Technique of the same type as the type that %0A%09 * implements this method which will work to solve the specified %0A%09 * Sudoku.%3C/p%3E%0A%09 * %3Cp%3EThis method exists because the code in Solver can be made %0A%09 * much more compact and readable by using a lambda expression to %0A%09 * describe the inheritance of techniques from one Solver thread %0A%09 * to its children and because it cannot be guaranteed that %0A%09 * every concrete Technique will have a constructor capable of %0A%09 * making a new instance of that type using only the target Sudoku %0A%09 * as a parameter. Additional parameters may need to be specified %0A%09 * in order to properly construct a new instance of a type.  So, %0A%09 * to get a new instance of a concrete Technique from an existing %0A%09 * instance, this method must be used, allowing the concrete type %0A%09 * to include any other necessary parameters and operations in the %0A%09 * construction of the new instance to be returned.%3C/p%3E%0A%09 */%0A%09@Override%0A%09public Technique apply(Sudoku sudoku);%0A
 %7D%0A

document the purpose of Function as an ancestor of Technique