https://github.com/1999/topological-sort
Topological sort implemented in Javascript / Typescript
https://github.com/1999/topological-sort
topological-sort
Last synced: 2 months ago
JSON representation
Topological sort implemented in Javascript / Typescript
- Host: GitHub
- URL: https://github.com/1999/topological-sort
- Owner: 1999
- License: mit
- Created: 2016-06-09T05:49:29.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2022-12-30T17:13:14.000Z (over 2 years ago)
- Last Synced: 2025-02-27T10:37:43.401Z (3 months ago)
- Topics: topological-sort
- Language: TypeScript
- Homepage:
- Size: 198 KB
- Stars: 18
- Watchers: 2
- Forks: 2
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Topological sort
[](https://greenkeeper.io/)
[](https://travis-ci.org/1999/topological-sort)
[](https://david-dm.org/1999/topological-sort#info=devDependencies)This package is distributed as Javascript, but you can also use it in your TypeScript project.
## API
### Javascript example```javascript
const { TopologicalSort } = require('topological-sort');// you can pass nodes as a map into constructor:
const nodes = new Map();
nodes.set('variables', variablesObj);
nodes.set('mixins', mixinsObj);
const sortOp = new TopologicalSort(nodes);// ...or add them to existing object instance with addNode() or addNodes():
sortOp.addNode('block', blocksObj);
sortOp.addNodes(new Map([
['block_mod_val1', blockModObj1],
['block_mod_val2', blockModObj2]
]));// then you should add adges between nodes
sortOp.addEdge('variables', 'mixins'); // from, to
sortOp.addEdge('mixins', 'block');
sortOp.addEdge('variables', 'block');
sortOp.addEdge('block', 'block_mod_val2');
sortOp.addEdge('block', 'block_mod_val1');// sorting is simple: it returns a new map wih sorted elements
// if circular dependency is found, sort() operation throws an AssertionError
const sorted = sortOp.sort();
const sortedKeys = [...sorted.keys()]; // ['variables', 'mixins', 'block', 'block_mod_val1', 'block_mod_val2']// values of the `sorted` map are objects with this shape: `{ children, node }`
// where node is the node object that you provided
// and children is a map which values have the same shape
const { node: variablesObj, children: variablesChildren } = sorted.get('variables');
const { node: blocksObj1 } = variablesChildren.get('block');
const { node: blocksObj2 } = sorted.get('block');
assert(blocksObj1 === blocksObj2); // true
```### Typescript example
```typescript
import TopologicalSort from 'topological-sort';// TopologicalSort class instances have a map inside.
// This map stores the references between your nodes (edges)
// "NodesKeyType" is the type for your tree node identifiers
// "NodesValueType" is the type for your tree nodes
const nodes = new Map();
nodes.set('variables', variablesObj);
nodes.set('mixins', mixinsObj);
const sortOp = new TopologicalSort(nodes);// `sortedKeys` is a topologically sorted list of node keys
sortOp.addEdge('variables', 'mixins');
const sorted = sortOp.sort();
const sortedKeys = [...sorted.keys()]; // ['variables', 'mixins']// `sorted` contains all nodes and their children
const { node: variablesObj, children: variablesChildren } = sorted.get('variables');
const { node: blocksObj1 } = variablesChildren.get('block');
const { node: blocksObj2 } = sorted.get('block');
assert(blocksObj1 === blocksObj2); // true
```## More info:
* https://en.wikipedia.org/wiki/Topological_sorting
* https://www.cs.usfca.edu/~galles/visualization/TopoSortDFS.html
* http://www.geeksforgeeks.org/topological-sorting/
* https://www.youtube.com/watch?v=ddTC4Zovtbc