| { | ||
| "name": "toposort", | ||
| "author": "Marcel Klehr <mklehr@gmx.net>", | ||
| "repo": "marcelklehr/toposort", | ||
| "description": "Topological sort of directed ascyclic graphs (like dependecy lists)", | ||
| "version": "0.2.7", | ||
| "keywords": [ | ||
| "topological", | ||
| "sort", | ||
| "sorting", | ||
| "graphs", | ||
| "graph", | ||
| "dependency", | ||
| "list", | ||
| "dependencies", | ||
| "acyclic" | ||
| ], | ||
| "dependencies": {}, | ||
| "development": {}, | ||
| "license": "MIT", | ||
| "scripts": [ | ||
| "index.js" | ||
| ] | ||
| } |
+11
| build: components index.js | ||
| @component build --dev | ||
| components: component.json | ||
| @component install --dev | ||
| clean: | ||
| rm -fr build components template.js | ||
| .PHONY: clean |
+30
-28
@@ -45,30 +45,32 @@ /*! | ||
| for (var i=0; i < nodes.length; i++) { | ||
| (function visit(node, predecessors) { | ||
| if (!predecessors) predecessors = [] | ||
| else // The node is a dependency of itself?! I'd say, we're free to throw | ||
| if(predecessors.indexOf(node) > 0) | ||
| throw new Error('Cyclic dependency! The following node is a dependency of itself: '+JSON.stringify(node)) | ||
| // if it's not in nodes[] anymore, we've already had this node | ||
| if (nodes.indexOf(node) < 0) return; | ||
| // remove this node from nodes[] | ||
| nodes.splice(nodes.indexOf(node), 1) | ||
| if (predecessors.length == 0) i--; | ||
| var predsCopy = predecessors.map(function(n) {return n}) | ||
| predsCopy.push(node) | ||
| edges | ||
| .filter(function(e) { return e[0] === node }) | ||
| .forEach(function(e) { | ||
| // visit all dependencies of this node | ||
| // and provide them with a *copy* of their predecessors (including *this* node) | ||
| visit(e[1], predsCopy) | ||
| }) | ||
| sorted.unshift(node) | ||
| })(nodes[i]) | ||
| } | ||
| while (nodes.length > 0) | ||
| visit(nodes[0], null, edges, nodes, sorted) | ||
| return sorted; | ||
| } | ||
| } | ||
| function visit(node, predecessors, edges, nodes, sorted) { | ||
| if (!predecessors) predecessors = [] | ||
| else // The node is a dependency of itself?! I'd say, we're free to throw | ||
| if(predecessors.indexOf(node) > 0) | ||
| throw new Error('Cyclic dependency! The following node is a dependency of itself: '+JSON.stringify(node)) | ||
| // if it's not in nodes[] anymore, we've already had this node | ||
| if (nodes.indexOf(node) < 0) return; | ||
| // remove this node from nodes[] | ||
| nodes.splice(nodes.indexOf(node), 1) | ||
| var predsCopy = predecessors.map(function(n) {return n}) | ||
| predsCopy.push(node) | ||
| edges | ||
| .filter(function(e) { return e[0] === node }) | ||
| .forEach(function(e) { | ||
| // visit all dependencies of this node | ||
| // and provide them with a *copy* of their predecessors (including *this* node) | ||
| visit(e[1], predsCopy, edges, nodes, sorted) | ||
| }) | ||
| sorted.unshift(node) | ||
| } |
+2
-2
| { | ||
| "name": "toposort", | ||
| "version": "0.2.5", | ||
| "version": "0.2.7", | ||
| "description": "Topological sort of directed ascyclic graphs (like dependecy lists)", | ||
@@ -11,3 +11,3 @@ "main": "index.js", | ||
| "type": "git", | ||
| "url": "https://github.com/marcelklehr/node-toposort.git" | ||
| "url": "https://github.com/marcelklehr/toposort.git" | ||
| }, | ||
@@ -14,0 +14,0 @@ "devDependencies": { |
+2
-2
| # Sorting directed acyclic graphs | ||
| [](https://travis-ci.org/marcelklehr/node-toposort) | ||
| [](https://travis-ci.org/marcelklehr/toposort) | ||
| ## Installation | ||
| `npm install toposort` | ||
| `npm install toposort` or `component install toposort` | ||
@@ -7,0 +7,0 @@ ## Example |
7519
8.25%8
33.33%157
17.16%