• Jump To … +
    _.array.builders.js.md _.array.selectors.js.md _.collections.walk.js.md _.function.arity.js.md _.function.combinators.js.md _.function.iterators.js.md _.function.predicates.js.md _.object.builders.js.md _.object.selectors.js.md _.util.existential.js.md _.util.operators.js.md _.util.strings.js.md _.util.trampolines.js.md index.md
  • _.util.trampolines.js.md

  • ¶

    util.trampolines

    Trampoline functions.


  • ¶

    done

    Signature: _.done(value:Any)

    A utility for wrapping a function’s return values so they can be used by _.trampoline. See below.


  • ¶

    trampoline

    Signature: _.trampoline(fun:Function[, args:Any...])

    Provides a way of creating recursive functions that won’t exceed a JavaScript engine’s maximum recursion depth. Rather than writing a naive recursive function, the function’s base cases must return _.done(someValue), and recursive calls must be wrapped in a returned function.

    In order to create a trampolined function that can be used in the same way as a naive recursive function, use _.partial as illustrated below.

    function isEvenNaive (num) {
        if (num === 0) return true;
        if (num === 1) return false;
        return isEvenNaive(num - 2);
    }
    
    isEvenNaive(99999);
    // => InternalError: too much recursion
    
    function isEvenInner (num) {
        if (num === 0) return _.done(true);
        if (num === 1) return _.done(false);
        return function () { return isEvenInner(Math.abs(num) - 2); };
    }
    
    _.trampoline(isEvenInner, 99999);
    // => false
    
    var isEven = _.partial(_.trampoline, isEvenInner);
    
    isEven(99999);
    // => false
    

  • ¶