Skip to content

Instantly share code, notes, and snippets.

@RReverser
Created April 17, 2014 07:33
Show Gist options
  • Save RReverser/10961185 to your computer and use it in GitHub Desktop.
Save RReverser/10961185 to your computer and use it in GitHub Desktop.
Promise Tree traversal
function when(value, func) {
var promise = Promise.cast(value);
if (func) {
promise = promise.then(function (value) {
return Promise.cast(func(value)).then(function (newValue) {
return newValue === undefined ? value : newValue;
});
});
}
return promise;
}
function traverse(node, handlers) {
if (handlers instanceof Function) {
handlers = {leave: handlers};
}
return when(node, handlers.enter).then(function (node) {
if (typeof node !== 'object' || node === null || node === traverse.skip) {
return node;
}
var promises = Object.keys(node).map(function (key) {
var subNode = node[key];
return traverse(subNode, handlers).then(function (newSubNode) {
if (newSubNode !== traverse.skip) {
if (newSubNode !== subNode) {
node[key] = newSubNode;
}
} else {
delete node[key];
}
});
});
return Promise.all(promises).then(function () {
return node;
});
}).then(function (node) {
return when(node, handlers.leave);
});
}
traverse.skip = {};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment