Class LazyRec<A,B>

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