-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathadapt.js
48 lines (38 loc) · 1.07 KB
/
adapt.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
'use strict';
let { reduce, adapt, ConcatReducer, PlusReducer, MonoidalReducer } = require('..');
function countNodes(tree) {
let reducer = adapt(data => data + 1, new PlusReducer);
return reduce(reducer, tree);
}
function flatten(tree) {
let reducer = adapt((data, node) => [node].concat(data), new ConcatReducer);
return reduce(reducer, tree);
}
function findParents(tree) {
let monoid = {
empty: () => ({
pairs: [],
children: [],
}),
concat: (a, b) => ({
pairs: a.pairs.concat(b.pairs),
children: a.children.concat(b.children),
}),
};
let reducer = adapt(
({ pairs, children }, node) => ({
pairs: pairs.concat(children.map(child => [child, node])),
children: [node],
}),
new MonoidalReducer(monoid)
);
let pairs = reduce(reducer, tree).pairs;
return new Map(pairs);
}
let sample = require('shift-parser').parseScript('0 + 1');
console.log('Count:');
console.log(countNodes(sample));
console.log('Flattened:');
console.log(flatten(sample));
console.log('Parents:');
console.log(findParents(sample));