/**
 * This example shows how easy it is to use the profiler tool  
 * in Epsilon.
 *
 * The fibonacci number can be calculated by using a simple recursive 
 * algorithm which uses an exponentially growing number of executions. 
 * 
 * This example is taken from 
 * http://www.eclipse.org/epsilon/doc/EpsilonProfilingTools.pdf
 * See also 
 * http://epsilonblog.wordpress.com/2007/12/16/cached-operations-in-eol/
 * 
 * HOW TO RUN THIS EXAMPLE:
 * 
 * 1. Open the Epsilon Profiling window:
 *     In Eclipse, open Window->Show View->Other.. and search for  
 *     "Profiling" in order to open the Epsilon Profiling view. 
 * 
 * 2. Launch the program:
 *     Select fibonacci.launch
 *     Open the context-menu (right-click) and select Run As-> fibonacci
 * 
 * 3. Refresh the data in the profiler window:
 *     In the top right corner of the profiling window, click 
 *     "Refresh view". You should now see that target "Program" has 
 *     been called once and "fib" has been called 1973 times.
 *
 * 4. Repeat with @cached annotation
 *     Reset the profiler (top right corner of profiling window) and  
 *     uncomment the @cached annotation located just before the 
 *     fib operation.
 *
 *     Repeat step 1 - 3. You should now see that "fib" has 
 *     been called only 16 times. 
 **/

// Instantiate the profiler through its native type
var profiler : new Native('org.eclipse.epsilon.eol.tools.ProfilerTool');

// Start profiling for a target called "Program"
profiler.start('Program');
// Calculate the 15th fibonacci number
15.fib();
// Stop profiling for the current target
profiler.stop();

/*
 * With caching, the fib operation is executed 1973 times, but when 
 * Epsilon is instructed to cache the return value for each combination 
 * of object and input parameters, it is only executed 16 times. 
 * 
 **/
 
// Uncomment the annotation @cached to stop Epsilon 
// from recalculating known values 
// @cached  
operation Integer fib() : Integer {
	// Start profiling for target "fib" with this integer as context
	profiler.start('fib', self);
	
	var fib : Integer;
	// Base cases for the fibonacci number
	if (self = 1 or self = 0) {
		fib = 1;
	} else {
		// Recursively calculate the fibonacci number 
		// (i.e. f(n) = f(n-1) + f(n-2) )  
		fib = (self-1).fib() + (self-2).fib();
	}
	// Stop profiling for the current target
	profiler.stop();

	return fib;
}