Class SafeT<M extends MonadRec<?,M>, A>

java.lang.Object
com.jnape.palatable.lambda.monad.SafeT<M,A>
Type Parameters:
M - the MonadRec instance
A - the carrier type
All Implemented Interfaces:
Applicative<A, SafeT<M,?>>, Functor<A, SafeT<M,?>>, Monad<A, SafeT<M,?>>, MonadBase<M, A, SafeT<?,?>>, MonadRec<A, SafeT<M,?>>, MonadT<M, A, SafeT<M,?>, SafeT<?,?>>

public final class SafeT<M extends MonadRec<?,M>, A> extends Object implements MonadT<M, A, SafeT<M,?>, SafeT<?,?>>
A stack-safe monad transformer that can safely interpret deeply nested left- or right-associated binds for any MonadRec.

Example:


Times.<Fn1<Integer, Integer>>times(100_000, f -> f.fmap(x -> x + 1), id()).apply(0); // stack-overflow
Times.<SafeT<Fn1<Integer, ?>, Integer>>times(100_000, f -> f.fmap(x -> x + 1), safeT(id()))
        .<Fn1<Integer, Integer>>runSafeT()
        .apply(0); // 100_000

Inspired by Phil Freeman's paper Stack Safety for Free.