Blame view

node_modules/toposort/README.md 2.51 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  # 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