lambda-calculus-with-js
Version:
Using JS' anonymous functions to perform lambda calculus
32 lines (31 loc) • 1.32 kB
JavaScript
import { yC } from '..';
import { getNumber, n0, pred, succ } from './number';
import { np1ParamsFn } from './struct';
import { deTuple, former, latter, tuple } from './tuple';
export const l0 = tuple(F => F)(n0);
export function getList(l) {
return tuple(F => l.reduce((p, n) => p(n), F))(getNumber(l.length));
}
function getReceiver(r) {
return n => {
r.push(n);
return getReceiver(r);
};
}
export function deList(l) {
const [f] = deTuple(l);
const r = [];
f(getReceiver(r));
return r;
}
export const pushedHead = l => x => tuple(F => l(former)(F(x)))(succ(l(latter)));
export const pushedTail = l => x => tuple(F => l(former)(F)(x))(succ(l(latter)));
export const deletedHead = l => tuple(F => l(former)(_ => F))(pred(l(latter)));
export const deletedMany = l => n => n(deletedHead)(l);
export const head = l => l(former)(np1ParamsFn(pred(l(latter))));
export const indexed = l => n => head(deletedMany(l)(n));
const revedOne = t => tuple(pushedHead(t(former))(head(t(latter))))(deletedHead(t(latter)));
export const reversed = l => l(latter)(revedOne)(tuple(l0)(l))(former);
export const tail = l => head(reversed(l));
export const deletedTail = l => reversed(deletedHead(reversed(l)));
export const deletedTailUntil = yC(s => l => f => f(tail(l))(l)(s(deletedTail(l))(f)));