Skip to content

Repository files navigation

combinators-js

npm versionBuild Status

Getting Started

Install (other package managers are available):

npm i -S combinators-js

Import (other module systems are available):

import{B,B1,B2,B3,C,C_,C__,D,D1,D2,E,F,F_,F__G,H,I,I_,I__,J,K,L,M,M2,O,Q,Q1,Q2,Q3,Q4,R,R_,R__,S,T,U,V,V_,V__,W,W_,W__,W1,Y,}from'combinators-js'

Definitions

Here are the included combinators with their definitions:

constB=a=>b=>c=>a(b(c))constB1=a=>b=>c=>d=>a(b(c)(d))constB2=a=>b=>c=>d=>e=>a(b(c)(d)(e))constB3=a=>b=>c=>d=>a(b(c(d)))constC=a=>b=>c=>a(c)(b)constC_=a=>b=>c=>d=>a(b)(d)(c)constC__=a=>b=>c=>d=>e=>a(b)(c)(e)(d)constD=a=>b=>c=>d=>a(b)(c(d))constD1=a=>b=>c=>d=>e=>a(b)(c)(d(e))constD2=a=>b=>c=>d=>e=>a(b(c))(d(e))constE=a=>b=>c=>d=>e=>a(b)(c(d)(e))constF=a=>b=>c=>c(b)(a)constF_=a=>b=>c=>d=>a(d)(c)(b)constF__=a=>b=>c=>d=>e=>a(b)(e)(d)(c)constG=a=>b=>c=>d=>a(d)(b(c))constH=a=>b=>c=>a(b)(c)(b)constI=a=>aconstI_=a=>b=>a(b)constI__=a=>b=>c=>a(b)(c)constJ=a=>b=>c=>d=>a(b)(a(d)(c))constK=a=>b=>aconstL=a=>b=>a(b(b))constM=a=>a(a)constM2=a=>b=>a(b)(a(b))constO=a=>b=>b(a(b))constQ=a=>b=>c=>b(a(c))constQ1=a=>b=>c=>a(c(b))constQ2=a=>b=>c=>b(c(a))constQ3=a=>b=>c=>c(a(b))constQ4=a=>b=>c=>c(b(a))constR=a=>b=>c=>b(c)(a)constR_=a=>b=>c=>d=>a(c)(d)(b)constR__=a=>b=>c=>d=>e=>a(b)(d)(e)(c)constS=a=>b=>c=>a(c)(b(c))constT=a=>b=>b(a)constU=a=>b=>b(a(a)(b))constV=a=>b=>c=>c(a)(b)constV_=a=>b=>c=>d=>a(c)(b)(d)constV__=a=>b=>c=>d=>e=>a(b)(e)(c)(d)constW=a=>b=>a(b)(b)constW_=a=>b=>c=>a(b)(c)(c)constW__=a=>b=>c=>d=>a(b)(c)(d)(d)constW1=a=>b=>b(a)(a)constY=a=>(b=>b(b))(b=>a(c=>b(b)(c)))

Tests

test('B')(S(K(S))(K))test('B1')(S(K(S(K(S))(K)))(S(K(S))(K)))test('B2')(S(K(S(K(S(K(S))(K)))(S(K(S))(K))))(S(K(S))(K)))test('C')(S(S(K(S(K(S))(K)))(S))(K(K)))test('C_')(S(K(S(S(K(S(K(S))(K)))(S))(K(K)))))test('C__')(S(K(S(K(S(S(K(S(K(S))(K)))(S))(K(K)))))))test('D')(S(K(S(K(S))(K))))test('D1')(S(K(S(K(S(K(S))(K))))))test('D2')(S(K(S(K(S))(K)))(S(K(S(K(S))(K)))))test('E')(S(K(S(K(S(K(S))(K)))(S(K(S))(K)))))test('F')(S(K(S(S(K)(K))(K(S(K(S(S(K)(K))))(K)))))(S(K(S(K(S(K(S))(K)))(S(K(S))(K))))(S(K(S(S(K)(K))))(K))))test('F_')(S(K(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))))(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))(S(K(S(S(K(S(K(S))(K)))(S))(K(K)))))))test('F__')(S(K(S(K(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))))(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))(S(K(S(S(K(S(K(S))(K)))(S))(K(K)))))))))test('G')(S(K(S(K(S))(K)))(S(S(K(S(K(S))(K)))(S))(K(K))))test('H')(S(K(S(K(S(S(K(S(S(K)(K))(S(K)(K))))(S(K(S(K(S))(K)))(S(K(S(S(K)(K))))(K))))))(K)))(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))))test('I')(S(K)(K))test('I_')(S(S(K)))test('J')(S(K(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))))(S(S(K(S(S(K)(K))(S(K)(K))))(S(K(S(K(S))(K)))(S(K(S(S(K)(K))))(K))))(K(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))(S(K(S(K(S(K(S))(K)))(S(K(S))(K)))))))))test('K')(K)test('L')(S(S(K(S))(K))(K(S(S(K)(K))(S(K)(K)))))test('M')(S(S(K)(K))(S(K)(K)))test('M2')(S(K(S(S(K)(K))(S(K)(K)))))test('O')(S(S(K)(K)))test('Q')(S(K(S(S(K(S))(K))))(K))test('Q1')(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))(S(K(S))(K)))test('Q2')(S(K(S(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))(S(K(S))(K)))))(K))test('Q3')(S(K(S(K(S(S(K)(K))))(K))))test('Q4')(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))(S(K(S(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))(S(K(S))(K)))))(K)))test('R')(S(K(S(K(S))(K)))(S(K(S(S(K)(K))))(K)))test('R_')(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))))test('R__')(S(K(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))))))test('S')(S)test('T')(S(K(S(S(K)(K))))(K))test('U')(S(K(S(S(K)(K))))(S(S(K)(K))(S(K)(K))))test('V')(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))(S(K(S(S(K)(K))))(K)))test('V_')(S(K(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))(S(K(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))))(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))(S(K(S(S(K(S(K(S))(K)))(S))(K(K))))))))))test('W')(S(K(S(S(K(S(S(K)(K))(S(K)(K))))(S(K(S(K(S))(K)))(S(K(S(S(K)(K))))(K))))))(K))test('W_')(S(K(S(K(S(S(K(S(S(K)(K))(S(K)(K))))(S(K(S(K(S))(K)))(S(K(S(S(K)(K))))(K))))))(K))))test('W__')(S(K(S(K(S(K(S(S(K(S(S(K)(K))(S(K)(K))))(S(K(S(K(S))(K)))(S(K(S(S(K)(K))))(K))))))(K))))))test('W1')(S(K(S(S(K(S(S(K(S(S(K)(K))(S(K)(K))))(S(K(S(K(S))(K)))(S(K(S(S(K)(K))))(K))))))(K))))(K))

Ideas

// LISP data structuresconstKI=K(I)constcons=(a,b)=>V(a)(b)// manual uncurryconstcar=T(K)constcdr=T(KI)console.log(car(cons(0,1)))// => 0console.log(cdr(cons(0,1)))// => 1constnil=()=>{}constlist=(...args)=>args.reduce((l,arg)=>V(arg)(l),nil)constreverse=(l,m=nil)=>l===nil ? m : reverse(l(KI),V(l(K))(m))constreduce=f=>l=>m=>l(KI)===undefined ? m : f(reduce(f)(l(KI))(m))(l(K))constmap=f=>l=>reduce(acc=>val=>V(f(val))(acc))(l)(nil)constlength=l=>reduce(acc=>val=>1+acc)(l)(0)constfilter=f=>l=>reduce(acc=>val=>f(val) ? V(val)(acc) : acc)(l)(nil)constarbitraryList=list(0,1,2,3,4,5)console.log(length(arbitraryList))// => 6constreduced=reduce(acc=>val=>V(val)(acc))(arbitraryList)(nil)constfiltered=filter(x=>x>2)(reduced)constmapped=map(x=>x**2)(filtered)constreversed=reverse(mapped)console.log(length(reversed))// => 3map(::console.log)(reversed)// => 25 16 9
// recursion of anonymous functionsY(recur=>x=>x===1 ? 1 : x*recur(x-1))(5)// => 120// TCO'd recursion of anonymous functions using a modified Y// taking a variadic non-combinator functionconstY_=a=>(b=>a((...c)=>b(b)(...c)))(b=>a((...c)=>b(b)(...c)))Y_(recur=>(x,y=1)=>x===1 ? y : recur(x-1,x*y))(5)// => 120
// omega bird (mock a mockingbird)M(M)

Practical Ideas

¯\_(ツ)_/¯

See Also

I built a Church encoding library too.

Further Reading

About

🐦 Some combinators

Topics

Resources

Stars

139 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages