package demo_43;

import java.util.Arrays;
import java.util.function.Function;


public class Mapper {
	
	public static double[] map(double[] inArray,Function<Double,Double> fn) {
		double[] outArray=null;
		if (inArray!=null) {
			outArray=new double[inArray.length];
			for(int i=0;i<inArray.length;i++) {
				outArray[i]=fn.apply(inArray[i]);
			}
		}
		return outArray;
	}
	
	public static <T> void mapInPlace(T[] inArray,Function<T,T> fn) {
		if (inArray!=null) {
			for(int i=0;i<inArray.length;i++) {
				inArray[i]=fn.apply(inArray[i]);
			}
		}
	}
	
	public static double sqr(double d) { return d*d; }
	
	public static void main(String[] args) {
		
		double[] data= {1.1,2.2,3.3,4.4};
		System.out.println("Input: " + Arrays.toString(data));
		
		double[] sq_lambda=Mapper.map(data, d->2*d);
		System.out.println("sq_lambda: " + Arrays.toString(sq_lambda));
		
		double[] sq_ref1=Mapper.map(data, Mapper::sqr);
		System.out.println("sq_ref1: " + Arrays.toString(sq_ref1));
		
		double[] sq_ref2=Mapper.map(data, Math::sqrt);
		System.out.println("sq_ref2: " + Arrays.toString(sq_ref2));
		
		// mapInPlace needs an array of Doubles
		// Double[] sq_refD2 = new Double[sq_ref2.length];
		// for(int i=0;i<sq_ref2.length;i++) sq_refD2[i]=sq_ref2[i];
		Double[] sq_refD2 = Arrays.stream(sq_ref2).boxed().toArray(Double[]::new);
		
		Mapper.mapInPlace(sq_refD2,d->d+0.1);
		System.out.println("sq_refD2: " + Arrays.toString(sq_refD2));
	}

}
