Skip to content

ultraschemer/yoyo

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Yoyo

Yoyo is a tiny trampoline (iteratively invokes thunk-returning functions) library with partial application support.

Install

Available via bower:

bower install yoyo

Available via npm:

npm install yoyojs

Usage

Factorial example:

var yoyo = require('yoyojs');

function factorial(n, acc) {
  if (n < 2) {
    return acc;
  }
  return factorial.bind(null, n-1, n * acc);
}

yoyo(factorial, 3,1); // 6
yoyo(factorial)(3,1); // 6
yoyo(factorial)(3)(1); // 6

Is even/odd example:

var yoyo = require('yoyojs');

function even(n) {
  return n === 0 ? true : odd.bind(null, n - 1);
}

function odd(n) {
  return n === 0 ? false : even.bind(null, n - 1);
}

yoyo(even, 2); // true
yoyo(even)(2); // true

Why

Without trampolining, a new stack frame is created on each iteration call and thus overflowing the maximum call stack size:

function fac(n, acc) {
  if (n < 2) {
    return acc;
  }
  return fac(n-1, n * acc);
}

fac(30000, 1);

Failures:

  1) Yoyo Should return fail with stackoverflow
    Message:
        RangeError: Maximum call stack size exceeded

    Stacktrace:
      undefined

With trampolining, there is not a new stack created because of tail-call elimation, meaning that after each iteration the result is returned and the trampoline takes care of calling it again with the new result if the returned result is thunk:

function fac(n, acc) {
  if (n < 2) {
    return acc;
  }
  return fac.bind(n-1, n * acc);
}

yoyo(fac(30000, 1));

Infinity

For large values, you can use the BigInteger library.

Test

npm test

Credits

JavaScript Allongé by Reg "Raganwald" Braithwaite.

License

Released under the MIT License.

About

A tiny JavaScript trampoline library.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages

  • JavaScript 100.0%