java.lang.Object
com.jnape.palatable.lambda.functions.builtin.fn2.LazyRec<A,B>
Type Parameters:
A - the input type
B - the output type
All Implemented Interfaces:
Fn1<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,Fn1<A,Lazy<B>>>, Fn2<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,A,Lazy<B>>, Applicative<Fn1<A,Lazy<B>>,Fn1<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,?>>, Cartesian<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,Fn1<A,Lazy<B>>,Fn1<?,?>>, Cocartesian<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,Fn1<A,Lazy<B>>,Fn1<?,?>>, Contravariant<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,Profunctor<?,Fn1<A,Lazy<B>>,Fn1<?,?>>>, Functor<Fn1<A,Lazy<B>>,Fn1<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,?>>, Profunctor<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,Fn1<A,Lazy<B>>,Fn1<?,?>>, Monad<Fn1<A,Lazy<B>>,Fn1<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,?>>, MonadReader<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,Fn1<A,Lazy<B>>,Fn1<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,?>>, MonadRec<Fn1<A,Lazy<B>>,Fn1<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,?>>, MonadWriter<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,Fn1<A,Lazy<B>>,Fn1<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,?>>

public final class LazyRec<A,B> extends Object implements Fn2<Fn2<Kleisli<? super A,? extends B,Lazy<?>,Lazy<B>>,A,Lazy<B>>,A,Lazy<B>>
Given a Fn2 that receives a recursive function and an input and yields a lazy result, and an input, produce a lazy result that, when forced, will recursively invoke the function until it terminates in a stack-safe way.

Example:

 
 Lazy<BigInteger> lazyFactorial = lazyRec((fact, x) -&gt; x.equals(ONE)
                                                       ? lazy(x)
                                                       : fact.apply(x.subtract(ONE)).fmap(y -&gt; y.multiply(x)),
                                                  BigInteger.valueOf(50_000));
 BigInteger value = lazyFactorial.value(); // 3.34732050959714483691547609407148647791277322381045 x 10^213236