If that is mathematically possible, any P->R can be turned into P->R->R and snap into a recursive loop via code below. That would be awesome! :-)
I use this code to snuggle P->R->R into a recursive function , which turns the example function into a counter
var funct=function(p1:Int, r:Int):Int return p + r;
trace (func.recurseToArray(1, function(r) return r <= 10, 0)); // [1,2,3,4,5,6,7,8,9,10]
public static function recursion<P1,R>(operation:P1->R->R, p1:P1, condition:R->Bool, result:R, ?beforeRecursion:R->R):R {
if (beforeRecursion == null){
beforeRecursion = function(result:R):R{
return result;
};
}
var op = operation(p1, result);
if (condition(op)){
return recursion(operation, p1, condition, beforeRecursion(op), beforeRecursion);
}
return result;
}
public static function recurseToArray<P1,R>(operation:P1->R->R, p1:P1, condition:R->Bool, result:R, ?resultArr:Array<R>, ?beforeRecursion:R->R):Array<R> {
if (resultArr == null){
resultArr = new Array<R>();
}
if (beforeRecursion == null){
beforeRecursion = function(result:R):R{
return result;
};
}
var op = operation(p1, result);
if (condition(op)){
resultArr.push(op);
return recurseToArray(operation,p1,condition,beforeRecursion(op),resultArr,beforeRecursion);
}
return resultArr;
}