package xmp_func;

import java.util.function.Function; // Java 1.8 Interface: “apply” method
import java.util.Arrays;

public class Mapper {

	/* map instance method (but doesn't use "this") */
	public static double[ ] map(double[ ] array, Function<Double, Double> fn) {
		double[ ] temp = null;
		if(array != null) {
			temp = new double[array.length];
			for(int i = 0; i < array.length; i++) {
				temp[i] = fn.apply(array[i]);
			}
		}
		return temp;
	}

	/* Anonymous inner class, makes static variable "square" */
	static Function<Double, Double> square = new Function<Double, Double>() {
		@Override
		public Double apply(Double t) {	return t*t; }
	};

	/* Static class method */
	public static double sqr(double d) { return d*d; }

	public static void main(String[ ] args){
		double[] data = {1,2,3,4};
		double[] sq1 = Mapper.map(data, square);
		double[] sq2 = map(data, Mapper::sqr); // Note ::
		double[] sq3 = map(data, Math::sqrt); // sqrt in Java lib
		double[] sq4 = map(data, d -> d*d); // lambda
		System.out.println("Data \t\t\t: " + Arrays.toString(data));
		System.out.println("Mapped w/ square\t: " + Arrays.toString(sq1));
		System.out.println("Mapped w/ sqr\t\t: " + Arrays.toString(sq2));
		System.out.println("Mapped w/ sqrt\t\t: " + Arrays.toString(sq3));
		System.out.println("Mapped w/ lambda\t: " + Arrays.toString(sq4));
	}
}