-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathimmutable-optics.js
43 lines (39 loc) · 1.16 KB
/
immutable-optics.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
const Immutable = require('immutable');
function traversal(traversalFn) {
return function (fn) {
return function (obj) {
const paths = traversalFn(obj);
return paths.reduce((obj, path) =>
obj.updateIn(path, prev => fn(prev, path)), obj);
};
};
}
// TODO: Rename these, since they are not post/pre-order traversals, more like
// collectFor(Pre|Post)Order
function postOrderTraversal(obj) {
if (Immutable.Iterable.isIterable(obj)) {
return obj.keySeq()
.flatMap(key => postOrderTraversal(obj.get(key))
.map(path => path.unshift(key))
.push(Immutable.List([key])))
.toList();
} else {
return Immutable.List();
}
}
function preOrderTraversal(obj) {
if (Immutable.Iterable.isIterable(obj)) {
return obj.keySeq()
.flatMap(key => preOrderTraversal(obj.get(key))
.map(path => path.unshift(key))
.unshift(Immutable.List([key])))
.toList();
} else {
return Immutable.List();
}
}
module.exports = {
traversal,
postOrderTraversal,
preOrderTraversal
}