Skip to content

Instantly share code, notes, and snippets.

@aykutyaman
Created January 27, 2020 15:23
Show Gist options
  • Save aykutyaman/8952f5ef550ba9c2b744ac70873e7b78 to your computer and use it in GitHub Desktop.
Save aykutyaman/8952f5ef550ba9c2b744ac70873e7b78 to your computer and use it in GitHub Desktop.
/*** FIX ***/
var fix = f => x => f(fix(f))(x);
/*** TRAMPOLINE ***/
const rec = (...args) => ({ rec: true, args });
const ret = x => ({ rec: false, x });
var trampoline = f => (...args) => {
var res = f(...args);
while (res.rec) {
res = f(...res.args);
}
return res.x;
}
/*** SUM ***/
var sumTramp = xs => trampoline((acc, i) =>
i === xs.length
? ret(acc)
: rec(acc + xs[i], i + 1))(0, 0)
const sumFix = fix(rec => acc => i => xs =>
i === xs.length
? acc
: rec(acc + xs[i])(i + 1)(xs))(0)(0);
/** MAIN ***/
const mainFix = sumFix([1, 2, 3, 4, 5]);
const mainTramp = sumTramp([1, 2, 3, 4]);
console.log('trampoline sum', mainTramp);
console.log('fix sum', mainFix);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment