Class Trampoline<A,B>

java.lang.Object
com.jnape.palatable.lambda.functions.recursion.Trampoline<A,B>
Type Parameters:
A - the trampolined function's input type
B - the trampolined function's output type
All Implemented Interfaces:
Fn1<Fn1<? super A,? extends RecursiveResult<A,B>>,Fn1<A,B>>, Fn2<Fn1<? super A,? extends RecursiveResult<A,B>>,A,B>, Applicative<Fn1<A,B>,Fn1<Fn1<? super A,? extends RecursiveResult<A,B>>,?>>, Cartesian<Fn1<? super A,? extends RecursiveResult<A,B>>,Fn1<A,B>,Fn1<?,?>>, Cocartesian<Fn1<? super A,? extends RecursiveResult<A,B>>,Fn1<A,B>,Fn1<?,?>>, Contravariant<Fn1<? super A,? extends RecursiveResult<A,B>>,Profunctor<?,Fn1<A,B>,Fn1<?,?>>>, Functor<Fn1<A,B>,Fn1<Fn1<? super A,? extends RecursiveResult<A,B>>,?>>, Profunctor<Fn1<? super A,? extends RecursiveResult<A,B>>,Fn1<A,B>,Fn1<?,?>>, Monad<Fn1<A,B>,Fn1<Fn1<? super A,? extends RecursiveResult<A,B>>,?>>, MonadReader<Fn1<? super A,? extends RecursiveResult<A,B>>,Fn1<A,B>,Fn1<Fn1<? super A,? extends RecursiveResult<A,B>>,?>>, MonadRec<Fn1<A,B>,Fn1<Fn1<? super A,? extends RecursiveResult<A,B>>,?>>, MonadWriter<Fn1<? super A,? extends RecursiveResult<A,B>>,Fn1<A,B>,Fn1<Fn1<? super A,? extends RecursiveResult<A,B>>,?>>

public final class Trampoline<A,B> extends Object implements Fn2<Fn1<? super A,? extends RecursiveResult<A,B>>,A,B>
Given an Fn1<A, CoProduct2<A, B, ?>> (analogous to "recurse" and "return" tail position instructions, respectively), produce a Fn1<A, B> that unrolls the original function by iteratively passing each result that matches the input (A) back to the original function, and then terminating on and returning the first output (B).

This is isomorphic to - though presumably faster than - taking the last element of an Unfoldr call.

  • Field Details

    • INSTANCE

      private static final Trampoline<?,?> INSTANCE
  • Constructor Details

    • Trampoline

      public Trampoline()
  • Method Details