UNPKG

lambda-calculus-with-js

Version:

Using JS' anonymous functions to perform lambda calculus

32 lines (31 loc) 1.32 kB
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)));