import ImageRegion from './ImageRegion.mjs';

function compose(input1, input2, fn, {target = null} = {}) {
	input1.checkCompatible(input2);
	const tgt = input1.checkOrMakeTarget(target);

	const {width, height, dim} = tgt;

	for(let x = 0; x < width; ++ x) {
		for(let y = 0; y < height; ++ y) {
			const pt = tgt.indexOf(x, y);
			const p1 = input1.indexOf(x, y);
			const p2 = input2.indexOf(x, y);
			for(let d = 0; d < dim; ++ d) {
				tgt.values[pt + d] = fn(
					input1.values[p1 + d],
					input2.values[p2 + d],
				);
			}
		}
	}

	return tgt;
}

export function subtract(input1, input2, options) {
	return compose(input1, input2, (a, b) => (a - b), options);
}

export function difference(input1, input2, options) {
	return compose(input1, input2, (a, b) => Math.abs(a - b), options);
}

ImageRegion.prototype.subtract = function(b, options) {
	return subtract(this, b, options);
};

ImageRegion.prototype.difference = function(b, options) {
	return difference(this, b, options);
};
