/** pass me an object with only one child at each level and will return a nodeStack * and pathStack which describes the only possibly descent top-to-bottom * * @param {Object} description eg { a: {foo: {a:'target'}}} */ function ascentFrom( description ) { function onlyMapping(obj) { // this for won't loop but it is the most obvious way to extract a // key/value pair where the key is unknown for( var i in obj ) { return {key:i, node:obj[i]}; } } var ascent = list({key:ROOT_PATH, node:description}), curDesc = description; while( typeof curDesc == 'object' ) { var mapping = onlyMapping(curDesc); curDesc = mapping.node; ascent = cons( mapping, ascent ); } return ascent; }