mirror of
https://github.com/DanilaFe/abacus
synced 2024-12-22 07:20:09 -08:00
Abstract some of the Function functionality further.
This commit is contained in:
parent
553c7354c1
commit
01f80bbb53
38
core/src/main/java/org/nwapw/abacus/function/Applicable.java
Normal file
38
core/src/main/java/org/nwapw/abacus/function/Applicable.java
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
package org.nwapw.abacus.function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class that represents something that can be applied to one or more
|
||||||
|
* arguments of the same type, and returns a single value from that application.
|
||||||
|
* @param <T> the type of the parameters passed to this applicable.
|
||||||
|
* @param <O> the return type of the applicable.
|
||||||
|
*/
|
||||||
|
public abstract class Applicable<T, O> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the given applicable can be used with the given parameters.
|
||||||
|
* @param params the parameter array to verify for compatibility.
|
||||||
|
* @return whether the array can be used with applyInternal.
|
||||||
|
*/
|
||||||
|
protected abstract boolean matchesParams(T[] params);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies the applicable object to the given parameters,
|
||||||
|
* without checking for compatibility.
|
||||||
|
* @param params the parameters to apply to.
|
||||||
|
* @return the result of the application.
|
||||||
|
*/
|
||||||
|
protected abstract O applyInternal(T[] params);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the parameters can be used with this applicable, returns
|
||||||
|
* the result of the application of the applicable to the parameters.
|
||||||
|
* Otherwise, returns null.
|
||||||
|
* @param params the parameters to apply to.
|
||||||
|
* @return the result of the operation, or null if parameters do not match.
|
||||||
|
*/
|
||||||
|
public O apply(T... params){
|
||||||
|
if(!matchesParams(params)) return null;
|
||||||
|
return applyInternal(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -6,34 +6,6 @@ import org.nwapw.abacus.number.NumberInterface;
|
||||||
* A function that operates on one or more
|
* A function that operates on one or more
|
||||||
* inputs and returns a single number.
|
* inputs and returns a single number.
|
||||||
*/
|
*/
|
||||||
public abstract class Function {
|
public abstract class Function extends Applicable<NumberInterface, NumberInterface> {
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether the given params will work for the given function.
|
|
||||||
*
|
|
||||||
* @param params the given params
|
|
||||||
* @return true if the params can be used with this function.
|
|
||||||
*/
|
|
||||||
protected abstract boolean matchesParams(NumberInterface[] params);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Internal apply implementation, which already receives appropriately promoted
|
|
||||||
* parameters that have bee run through matchesParams
|
|
||||||
*
|
|
||||||
* @param params the promoted parameters.
|
|
||||||
* @return the return value of the function.
|
|
||||||
*/
|
|
||||||
protected abstract NumberInterface applyInternal(NumberInterface[] params);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function to check, promote arguments and run the function.
|
|
||||||
*
|
|
||||||
* @param params the raw input parameters.
|
|
||||||
* @return the return value of the function, or null if an error occurred.
|
|
||||||
*/
|
|
||||||
public NumberInterface apply(NumberInterface... params) {
|
|
||||||
if (!matchesParams(params)) return null;
|
|
||||||
return applyInternal(params);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user