import curry2 from "../function/curry2";
import reduce from "../list/reduce";
import concat from "../list/concat";
import map from "../list/map";
/**
* Applies a list of functions to a list of values.
* If functions are provided for both arguments, returns a function that's equivalent to f(x, g(x)).
* Defers to the `ap` method of `applyF`, if present.
*
* @param {applicative|function|function[]} applyF
* @param {array|function} applyX
* @returns {any}
*/
const ap = (applyF, applyX) => {
if (typeof applyF.ap === "function") {
return applyF.ap(applyX);
}
if (typeof applyF === "function") {
return (x) => applyF(x, applyX(x));
}
return reduce((acc, f) => concat(acc, map(f, applyX)), [], applyF);
};
export default curry2(ap);