Skip to content

Instantly share code, notes, and snippets.

@majgis
Created January 29, 2017 03:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save majgis/ca2239e609779ec77da60fbcf51971f7 to your computer and use it in GitHub Desktop.
Save majgis/ca2239e609779ec77da60fbcf51971f7 to your computer and use it in GitHub Desktop.
// var depPairs = [
// "KittenService: ",
// "Leetmeme: Cyberportal",
// "Cyberportal: Ice",
// "CamelCaser: KittenService",
// "Fraudstream: Leetmeme",
// "Ice: "
// ];
//
// Turn that into: `'KittenService, Ice, Cyberportal, Leetmeme, CamelCaser, Fraudstream'`
// Also guard against cycles
const depPairsGood = [
"KittenService: ",
"Leetmeme: Cyberportal",
"Cyberportal: Ice",
"CamelCaser: KittenService",
"Fraudstream: Leetmeme",
"Ice: "
];
const depPairsBad = [
"KittenService: ",
"Leetmeme: Cyberportal",
"Cyberportal: Ice",
"CamelCaser: KittenService",
"Fraudstream: ",
"Ice: Leetmeme"
];
function generateDeps(deps) {
const finalItems = [];
const rootItems = [];
const lookup= {};
const visited = {};
deps.forEach( depName => {
const [parent, child] = depName.split(': ');
store(parent, child, lookup);
rootItems.push(parent);
});
rootItems.forEach( depName => recurse(depName, lookup, finalItems, visited));
return finalItems;
}
function recurse (depName, lookup, items, visited, ancestors={}){
const dep = lookup[depName];
if (dep && dep.child){
if (ancestors[depName]) throw new Error('No bueno');
ancestors[depName] = true;
recurse(dep.child, lookup, items, visited, ancestors);
}
if (!visited[depName]){
visited[depName] = true;
items.push(depName)
}
}
function store (parent, child, lookup){
if (parent && !lookup[parent]) lookup[parent] = {};
if (child) lookup[parent]['child'] = child;
}
console.log(generateDeps(depPairsGood));
console.log(generateDeps(depPairsBad));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment