An open API service indexing awesome lists of open source software.

https://github.com/andy2046/tco-node

javascript lib for tail call optimization
https://github.com/andy2046/tco-node

javascript tail-call-optimization tco trampoline

Last synced: 6 months ago
JSON representation

javascript lib for tail call optimization

Awesome Lists containing this project

README

          

# tco-node
tco-node is a JavaScript library for tail call optimization.

## Examples
```js
import { tco, trampoline } from 'tco-node';

const sum = tco(function(x, y) {
if (y > 0) {
return sum(x + 1, y - 1)
} else {
return x
}
})

console.log( sum(1, 100000) ) // => 100001

function isEvenInner (num) {
if (num === 0) {
return true
}

if (num === 1) {
return false
}

return function() {
return isEvenInner(Math.abs(num) - 2)
}
}

console.log( trampoline(isEvenInner, 99999) )
// => false

console.log( trampoline(isEvenInner, 99998) )
// => true

const isEven = trampoline.bind(null, isEvenInner)

console.log( isEven(99999) )
// => false

function factorial (n) {
function recur (n, acc) {
if (n === 0) {
return acc
} else {
return recur.bind(null, n-1, n*acc)
}
}
return function () {
return recur.bind(null, n, 1)
}
}

console.log( trampoline(factorial(100000)) )
// => Infinity

function _even (n) {
if (n === 0) {
return true
} else {
return _odd.bind(null, n-1)
}
}

function _odd (n) {
if (n === 0) {
return false
} else {
return _even.bind(null, n-1)
}
}

function even (n) {
return trampoline(_even.bind(null, n))
}

function odd (n) {
return trampoline(_odd.bind(null, n))
}

console.log(
even(99999),
odd(99999),
even(99998),
odd(99998)
)
// false true true false

```

## Installation

```
npm install --save tco-node
```

## Usage
You can import from `tco-node`:

```js
import { tco, trampoline } from 'tco-node';
// or
const { tco, trampoline } = require('tco-node');
```