Class FoldRight<A,​B>

  • Type Parameters:
    A - The Iterable element type
    B - The accumulation type
    All Implemented Interfaces:
    Fn1<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​Fn1<Lazy<B>,​Fn1<java.lang.Iterable<A>,​Lazy<B>>>>, Fn2<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​Lazy<B>,​Fn1<java.lang.Iterable<A>,​Lazy<B>>>, Fn3<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​Lazy<B>,​java.lang.Iterable<A>,​Lazy<B>>, Applicative<Fn1<Lazy<B>,​Fn1<java.lang.Iterable<A>,​Lazy<B>>>,​Fn1<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​?>>, Cartesian<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​Fn1<Lazy<B>,​Fn1<java.lang.Iterable<A>,​Lazy<B>>>,​Fn1<?,​?>>, Cocartesian<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​Fn1<Lazy<B>,​Fn1<java.lang.Iterable<A>,​Lazy<B>>>,​Fn1<?,​?>>, Contravariant<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​Profunctor<?,​Fn1<Lazy<B>,​Fn1<java.lang.Iterable<A>,​Lazy<B>>>,​Fn1<?,​?>>>, Functor<Fn1<Lazy<B>,​Fn1<java.lang.Iterable<A>,​Lazy<B>>>,​Fn1<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​?>>, Profunctor<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​Fn1<Lazy<B>,​Fn1<java.lang.Iterable<A>,​Lazy<B>>>,​Fn1<?,​?>>, Monad<Fn1<Lazy<B>,​Fn1<java.lang.Iterable<A>,​Lazy<B>>>,​Fn1<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​?>>, MonadReader<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​Fn1<Lazy<B>,​Fn1<java.lang.Iterable<A>,​Lazy<B>>>,​Fn1<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​?>>, MonadRec<Fn1<Lazy<B>,​Fn1<java.lang.Iterable<A>,​Lazy<B>>>,​Fn1<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​?>>, MonadWriter<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​Fn1<Lazy<B>,​Fn1<java.lang.Iterable<A>,​Lazy<B>>>,​Fn1<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​?>>

    public final class FoldRight<A,​B>
    extends java.lang.Object
    implements Fn3<Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>>,​Lazy<B>,​java.lang.Iterable<A>,​Lazy<B>>
    Given an Iterable of As, a starting lazy value B, and a Fn2<A, Lazy<B>, Lazy<B>>, iteratively accumulate over the Iterable, ultimately returning a final Lazy<B> value. If the Iterable is empty, just return the starting Lazy<B> value. This function is computationally the iterative inverse of FoldLeft, but uses Lazy to allow support stack-safe execution.

    Example:

     
     Lazy<Iterable<Integer>> lazyCopy = foldRight(
         (head, lazyTail) -&gt; lazy(cons(head, () -&gt; lazyTail.value().iterator())),
         lazy(emptyList()),
         iterate(x -&gt; x + 1, 0));
     Iterable<Integer> copy = () -&gt; lazyCopy.value().iterator();
     take(3, copy).forEach(System.out::println); // prints "1, 2, 3"
     take(3, copy).forEach(System.out::println); // prints "1, 2, 3"
     
     

    For more information, read about Catamorphisms.

    See Also:
    FoldLeft
    • Field Detail

      • INSTANCE

        private static final FoldRight<?,​?> INSTANCE
    • Constructor Detail

      • FoldRight

        private FoldRight()
    • Method Detail

      • foldRight

        public static <A,​B> FoldRight<A,​B> foldRight()
      • foldRight

        public static <A,​B> Fn2<Lazy<B>,​java.lang.Iterable<A>,​Lazy<B>> foldRight​(Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>> fn)
      • foldRight

        public static <A,​B> Fn1<java.lang.Iterable<A>,​Lazy<B>> foldRight​(Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>> fn,
                                                                                     Lazy<B> acc)
      • foldRight

        public static <A,​B> Lazy<B> foldRight​(Fn2<? super A,​? super Lazy<B>,​? extends Lazy<B>> fn,
                                                    Lazy<B> acc,
                                                    java.lang.Iterable<A> as)