Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/marcelklehr/toposort
Topologically sort directed acyclic graphs (such as dependency lists) in javascript
https://github.com/marcelklehr/toposort
directed-edges edges javascript toposort vertices
Last synced: 6 days ago
JSON representation
Topologically sort directed acyclic graphs (such as dependency lists) in javascript
- Host: GitHub
- URL: https://github.com/marcelklehr/toposort
- Owner: marcelklehr
- License: other
- Created: 2012-11-02T13:57:40.000Z (about 12 years ago)
- Default Branch: master
- Last Pushed: 2023-07-10T21:24:28.000Z (over 1 year ago)
- Last Synced: 2024-11-29T11:10:52.261Z (13 days ago)
- Topics: directed-edges, edges, javascript, toposort, vertices
- Language: JavaScript
- Homepage:
- Size: 169 KB
- Stars: 300
- Watchers: 6
- Forks: 38
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: License
Awesome Lists containing this project
- awesome-javascript - toposort
- awesome-javascript - toposort
README
# Toposort
Sort directed acyclic graphs
[![Build Status](https://travis-ci.org/marcelklehr/toposort.png)](https://travis-ci.org/marcelklehr/toposort)
## Installation
`npm install toposort` or `component install marcelklehr/toposort`
then in your code:
```js
toposort = require('toposort')
```## Usage
We want to sort the following graph.![graph](https://cdn.rawgit.com/marcelklehr/toposort/8b14e9fd/graph.svg)
```js
// First, we define our edges.
var graph = [
['put on your shoes', 'tie your shoes']
, ['put on your shirt', 'put on your jacket']
, ['put on your shorts', 'put on your jacket']
, ['put on your shorts', 'put on your shoes']
]// Now, sort the vertices topologically, to reveal a legal execution order.
toposort(graph)
// [ 'put on your shirt'
// , 'put on your shorts'
// , 'put on your jacket'
// , 'put on your shoes'
// , 'tie your shoes' ]
```(Note that there is no defined order for graph parts that are not connected
-- you could also put on your jacket after having tied your shoes...)### Sorting dependencies
It is usually more convenient to specify *dependencies* instead of "sequences".
```js
// This time, edges represent dependencies.
var graph = [
['tie your shoes', 'put on your shoes']
, ['put on your jacket', 'put on your shirt']
, ['put on your shoes', 'put on your shorts']
, ['put on your jacket', 'put on your shorts']
]toposort(graph)
// [ 'tie your shoes'
// , 'put on your shoes'
// , 'put on your jacket'
// , 'put on your shirt'
// , 'put on your shorts' ]// Now, reversing the list will reveal a legal execution order.
toposort(graph).reverse()
// [ 'put on your shorts'
// , 'put on your shirt'
// , 'put on your jacket'
// , 'put on your shoes'
// , 'tie your shoes' ]
```## API
### toposort(edges)
+ edges {Array} An array of directed edges describing a graph. An edge looks like this: `[node1, node2]` (vertices needn't be strings but can be of any type).
Returns: {Array} a list of vertices, sorted from "start" to "end"
Throws an error if there are any cycles in the graph.
### toposort.array(nodes, edges)
+ nodes {Array} An array of nodes
+ edges {Array} An array of directed edges. You don't need to mention all `nodes` here.This is a convenience method that allows you to define nodes that may or may not be connected to any other nodes. The ordering of unconnected nodes is not defined.
Returns: {Array} a list of vertices, sorted from "start" to "end"
Throws an error if there are any cycles in the graph.
## Tests
Run the tests with `node test.js`.
## Legal
MIT License