2017-07-25 21:57:14 -07:00
|
|
|
package org.nwapw.abacus.function;
|
|
|
|
|
|
|
|
import org.nwapw.abacus.number.NumberInterface;
|
2017-07-24 14:26:09 -07:00
|
|
|
|
2017-07-25 22:47:48 -07:00
|
|
|
/**
|
|
|
|
* A function that operates on one or more
|
|
|
|
* inputs and returns a single number.
|
|
|
|
*/
|
2017-07-24 13:44:38 -07:00
|
|
|
public abstract class Function {
|
|
|
|
|
2017-07-25 22:47:48 -07:00
|
|
|
/**
|
|
|
|
* Checks whether the given params will work for the given function.
|
2017-07-30 21:11:32 -07:00
|
|
|
*
|
2017-07-25 22:47:48 -07:00
|
|
|
* @param params the given params
|
|
|
|
* @return true if the params can be used with this function.
|
|
|
|
*/
|
2017-07-25 13:58:09 -07:00
|
|
|
protected abstract boolean matchesParams(NumberInterface[] params);
|
2017-07-25 22:47:48 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Internal apply implementation, which already receives appropriately promoted
|
|
|
|
* parameters that have bee run through matchesParams
|
2017-07-30 21:11:32 -07:00
|
|
|
*
|
2017-07-25 22:47:48 -07:00
|
|
|
* @param params the promoted parameters.
|
|
|
|
* @return the return value of the function.
|
|
|
|
*/
|
2017-07-25 13:58:09 -07:00
|
|
|
protected abstract NumberInterface applyInternal(NumberInterface[] params);
|
2017-07-24 13:44:38 -07:00
|
|
|
|
2017-07-25 22:47:48 -07:00
|
|
|
/**
|
|
|
|
* Function to check, promote arguments and run the function.
|
2017-07-30 21:11:32 -07:00
|
|
|
*
|
2017-07-25 22:47:48 -07:00
|
|
|
* @param params the raw input parameters.
|
|
|
|
* @return the return value of the function, or null if an error occurred.
|
|
|
|
*/
|
2017-07-30 21:11:32 -07:00
|
|
|
public NumberInterface apply(NumberInterface... params) {
|
|
|
|
if (!matchesParams(params)) return null;
|
2017-07-24 13:44:38 -07:00
|
|
|
return applyInternal(params);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|