@@ -13,109 +13,109 @@ You may also consume the ES2015 source directly using [Rollup](https://github.co
13
13
``` javascript
14
14
import {
15
15
B , C , D , E , F , G , H , I , J , K , KI , L , M , O , Q , R , S , T , U , V , W , Y ,
16
- } from ' combinators-js' ;
16
+ } from ' combinators-js'
17
17
18
18
// or use require or whatever, but you're good to go!
19
19
```
20
20
21
21
Here are the included combinators with their definitions (they are transpiled to standard functions so will run in any JS evironmment):
22
22
23
23
``` javascript
24
- const B = a => b => c => a (b (c));
25
- const C = a => b => c => a (c)(b);
26
- const D = a => b => c => d => a (b)(c (d));
27
- const E = a => b => c => d => e => a (b)(c (d)(e));
28
- const F = a => b => c => c (b)(a);
29
- const G = a => b => c => d => a (d)(b (c));
30
- const H = a => b => c => a (b)(c)(b);
31
- const I = a => a;
32
- const J = a => b => c => d => a (b)(a (d)(c));
33
- const K = a => b => a;
34
- const KI = a => b => b;
35
- const L = a => b => a (b (b));
36
- const M = a => a (a);
37
- const O = a => b => b (a (b));
38
- const Q = a => b => c => b (a (c));
39
- const R = a => b => c => b (c)(a);
40
- const S = a => b => c => a (c)(b (c));
41
- const T = a => b => b (a);
42
- const U = a => b => b (a (a)(b));
43
- const V = a => b => c => c (a)(b);
44
- const W = a => b => a (b)(b);
45
- const Y = a => (b => b (b))(b => a (c => b (b)(c)));
24
+ const B = a => b => c => a (b (c))
25
+ const C = a => b => c => a (c)(b)
26
+ const D = a => b => c => d => a (b)(c (d))
27
+ const E = a => b => c => d => e => a (b)(c (d)(e))
28
+ const F = a => b => c => c (b)(a)
29
+ const G = a => b => c => d => a (d)(b (c))
30
+ const H = a => b => c => a (b)(c)(b)
31
+ const I = a => a
32
+ const J = a => b => c => d => a (b)(a (d)(c))
33
+ const K = a => b => a
34
+ const KI = a => b => b
35
+ const L = a => b => a (b (b))
36
+ const M = a => a (a)
37
+ const O = a => b => b (a (b))
38
+ const Q = a => b => c => b (a (c))
39
+ const R = a => b => c => b (c)(a)
40
+ const S = a => b => c => a (c)(b (c))
41
+ const T = a => b => b (a)
42
+ const U = a => b => b (a (a)(b))
43
+ const V = a => b => c => c (a)(b)
44
+ const W = a => b => a (b)(b)
45
+ const Y = a => (b => b (b))(b => a (c => b (b)(c)))
46
46
```
47
47
48
48
Here are the tests:
49
49
50
50
``` javascript
51
- test (' B' )(S (K (S ))(K ));
52
- test (' C' )(S (S (K (S (K (S ))(K )))(S ))(K (K )));
53
- test (' D' )(S (K (S (K (S ))(K ))));
54
- test (' E' )(S (K (S (K (S (K (S ))(K )))(S (K (S ))(K )))));
55
- 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 ))));
56
- test (' G' )(S (K (S (K (S ))(K )))(S (S (K (S (K (S ))(K )))(S ))(K (K ))));
57
- 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 ))))));
58
- test (' I' )(S (K )(K ));
59
- 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 )))))))));
60
- test (' K' )(K );
61
- test (' KI' )(K (S (K )(K )));
62
- test (' L' )(S (S (K (S ))(K ))(K (S (S (K )(K ))(S (K )(K )))));
63
- test (' M' )(S (S (K )(K ))(S (K )(K )));
64
- test (' O' )(S (S (K )(K )));
65
- test (' Q' )(S (K (S (S (K (S ))(K ))))(K ));
66
- test (' R' )(S (K (S (K (S ))(K )))(S (K (S (S (K )(K ))))(K )));
67
- test (' S' )(S );
68
- test (' T' )(S (K (S (S (K )(K ))))(K ));
69
- test (' U' )(S (K (S (S (K )(K ))))(S (S (K )(K ))(S (K )(K ))));
70
- test (' V' )(S (K (S (S (K (S (K (S ))(K )))(S ))(K (K ))))(S (K (S (S (K )(K ))))(K )));
71
- 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 ));
51
+ test (' B' )(S (K (S ))(K ))
52
+ test (' C' )(S (S (K (S (K (S ))(K )))(S ))(K (K )))
53
+ test (' D' )(S (K (S (K (S ))(K ))))
54
+ test (' E' )(S (K (S (K (S (K (S ))(K )))(S (K (S ))(K )))))
55
+ 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 ))))
56
+ test (' G' )(S (K (S (K (S ))(K )))(S (S (K (S (K (S ))(K )))(S ))(K (K ))))
57
+ 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 ))))))
58
+ test (' I' )(S (K )(K ))
59
+ 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 )))))))))
60
+ test (' K' )(K )
61
+ test (' KI' )(K (S (K )(K )))
62
+ test (' L' )(S (S (K (S ))(K ))(K (S (S (K )(K ))(S (K )(K )))))
63
+ test (' M' )(S (S (K )(K ))(S (K )(K )))
64
+ test (' O' )(S (S (K )(K )))
65
+ test (' Q' )(S (K (S (S (K (S ))(K ))))(K ))
66
+ test (' R' )(S (K (S (K (S ))(K )))(S (K (S (S (K )(K ))))(K )))
67
+ test (' S' )(S )
68
+ test (' T' )(S (K (S (S (K )(K ))))(K ))
69
+ test (' U' )(S (K (S (S (K )(K ))))(S (S (K )(K ))(S (K )(K ))))
70
+ test (' V' )(S (K (S (S (K (S (K (S ))(K )))(S ))(K (K ))))(S (K (S (S (K )(K ))))(K )))
71
+ 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 ))
72
72
```
73
73
74
74
Here are some ideas:
75
75
76
76
``` javascript
77
77
// LISP data structures
78
- const cons = (a , b ) => V (a)(b); // manual uncurry
79
- const car = T (K );
80
- const cdr = T (KI );
78
+ const cons = (a , b ) => V (a)(b) // manual uncurry
79
+ const car = T (K )
80
+ const cdr = T (KI )
81
81
82
- console .log (car (cons (0 , 1 ))); // => 0
83
- console .log (cdr (cons (0 , 1 ))); // => 1
82
+ console .log (car (cons (0 , 1 ))) // => 0
83
+ console .log (cdr (cons (0 , 1 ))) // => 1
84
84
85
- const nil = () => {};
86
- const list = (... args ) => args .reduce ((l , arg ) => V (arg)(l), nil);
87
- const reverse = (l , m = nil ) => l === nil ? m : reverse (l (KI ), V (l (K ))(m));
85
+ const nil = () => {}
86
+ const list = (... args ) => args .reduce ((l , arg ) => V (arg)(l), nil)
87
+ const reverse = (l , m = nil ) => l === nil ? m : reverse (l (KI ), V (l (K ))(m))
88
88
const reduce = f => l => m => l (KI ) === undefined ? m : f (reduce (f)(l (KI ))(m))(l (K ))
89
- const map = f => l => reduce (acc => val => V (f (val))(acc))(l)(nil);
90
- const length = l => reduce (acc => val => 1 + acc)(l)(0 );
91
- const filter = f => l => reduce (acc => val => f (val) ? V (val)(acc) : acc)(l)(nil);
89
+ const map = f => l => reduce (acc => val => V (f (val))(acc))(l)(nil)
90
+ const length = l => reduce (acc => val => 1 + acc)(l)(0 )
91
+ const filter = f => l => reduce (acc => val => f (val) ? V (val)(acc) : acc)(l)(nil)
92
92
93
- const arbitraryList = list (0 , 1 , 2 , 3 , 4 , 5 );
93
+ const arbitraryList = list (0 , 1 , 2 , 3 , 4 , 5 )
94
94
95
- console .log (length (arbitraryList)); // => 6
95
+ console .log (length (arbitraryList)) // => 6
96
96
97
- const reduced = reduce (acc => val => V (val)(acc))(arbitraryList)(nil);
98
- const filtered = filter (x => x > 2 )(reduced);
99
- const mapped = map (x => x ** 2 )(filtered);
100
- const reversed = reverse (mapped);
97
+ const reduced = reduce (acc => val => V (val)(acc))(arbitraryList)(nil)
98
+ const filtered = filter (x => x > 2 )(reduced)
99
+ const mapped = map (x => x ** 2 )(filtered)
100
+ const reversed = reverse (mapped)
101
101
102
- console .log (length (reversed)); // => 3
103
- map (:: console .log )(reversed); // => 25 16 9
102
+ console .log (length (reversed)) // => 3
103
+ map (:: console .log )(reversed) // => 25 16 9
104
104
```
105
105
106
106
``` javascript
107
107
// recursion of anonymous functions
108
- Y (recur => x => (x === 1 ? 1 : x * recur (x - 1 )))(5 ); // => 120
108
+ Y (recur => x => (x === 1 ? 1 : x * recur (x - 1 )))(5 ) // => 120
109
109
110
110
// TCO'd recursion of anonymous functions using a modified Y
111
111
// taking a variadic non-combinator function
112
- const Y_ = a => (b => a ((... c ) => b (b)(... c)))(b => a ((... c ) => b (b)(... c)));
113
- Y_ (recur => (x , y = 1 ) => x === 1 ? y : recur (x - 1 , x * y))(5 ); // => 120
112
+ const Y_ = a => (b => a ((... c ) => b (b)(... c)))(b => a ((... c ) => b (b)(... c)))
113
+ Y_ (recur => (x , y = 1 ) => x === 1 ? y : recur (x - 1 , x * y))(5 ) // => 120
114
114
```
115
115
116
116
``` javascript
117
117
// omega bird (mock a mockingbird)
118
- M (M );
118
+ M (M )
119
119
```
120
120
121
121
Here are some practical ideas:
0 commit comments