Function sort_dag

Source
pub fn sort_dag<T, P, C>(nodes: &mut [T], parents: P, children: C)
where P: Fn(&mut T) -> &mut [usize], C: Fn(&mut T) -> &mut [usize],
Expand description

The same algorithm as sort, but for Directed Acyclic Graphs (DAGs), encoded as trees with shared nodes.

WARNING: To avoid an infinite loop, one must be careful about the order of children. E.g. if A has children C, B and B has child C, then the tree is not a DAG. This is because the order of children is preserved after sorting.

Examples found in repository?
examples/dag.rs (line 41)
17fn main() {
18    let mut nodes: Vec<Node> = vec![
19        Node {
20            val: 0,
21            parents: vec![],
22            children: vec![2, 3],
23        },
24        // Shared between `1` and `2`.
25        Node {
26            val: 3,
27            parents: vec![2, 3],
28            children: vec![]
29        },
30        Node {
31            val: 1,
32            parents: vec![0],
33            children: vec![1],
34        },
35        Node {
36            val: 2,
37            parents: vec![0],
38            children: vec![1],
39        },
40    ];
41    sort_dag(&mut nodes, |n| &mut n.parents, |n| &mut n.children);
42    assert_eq!(
43        nodes,
44        vec![
45            Node { val: 0, parents: vec![], children: vec![1, 2] },
46            Node { val: 1, parents: vec![0], children: vec![3] },
47            Node { val: 2, parents: vec![0], children: vec![3] },
48            Node { val: 3, parents: vec![1, 2], children: vec![] }
49        ]
50    );
51
52    let mut nodes: Vec<Node> = vec![
53        Node {
54            val: 0,
55            parents: vec![],
56            children: vec![1, 3],
57        },
58        Node {
59            val: 1,
60            parents: vec![0],
61            children: vec![2],
62        },
63        Node {
64            val: 3,
65            parents: vec![1, 3],
66            children: vec![]
67        },
68        Node {
69            val: 2,
70            parents: vec![0],
71            children: vec![2],
72        },
73    ];
74    sort_dag(&mut nodes, |n| &mut n.parents, |n| &mut n.children);
75    assert_eq!(
76        nodes,
77        vec![
78            Node { val: 0, parents: vec![], children: vec![1, 2] },
79            Node { val: 1, parents: vec![0], children: vec![3] },
80            Node { val: 2, parents: vec![0], children: vec![3] },
81            Node { val: 3, parents: vec![1, 2], children: vec![] }
82        ]
83    );
84
85    let mut nodes: Vec<Node> = vec![
86        Node {
87            val: 0,
88            parents: vec![],
89            children: vec![3, 1],
90        },
91        Node {
92            val: 2,
93            parents: vec![0],
94            children: vec![2],
95        },
96        Node {
97            val: 3,
98            parents: vec![3, 1],
99            children: vec![]
100        },
101        Node {
102            val: 1,
103            parents: vec![0],
104            children: vec![2],
105        },
106    ];
107    sort_dag(&mut nodes, |n| &mut n.parents, |n| &mut n.children);
108    assert_eq!(
109        nodes,
110        vec![
111            Node { val: 0, parents: vec![], children: vec![1, 2] },
112            Node { val: 1, parents: vec![0], children: vec![3] },
113            Node { val: 2, parents: vec![0], children: vec![3] },
114            Node { val: 3, parents: vec![1, 2], children: vec![] }
115        ]
116    );
117
118    let mut nodes: Vec<Node> = vec![
119        Node {
120            val: 0,
121            parents: vec![],
122            children: vec![3, 1],
123        },
124        Node {
125            val: 2,
126            parents: vec![0],
127            children: vec![2],
128        },
129        Node {
130            val: 3,
131            parents: vec![3, 1],
132            children: vec![]
133        },
134        Node {
135            val: 1,
136            parents: vec![0],
137            children: vec![2],
138        },
139    ];
140    sort_dag(&mut nodes, |n| &mut n.parents, |n| &mut n.children);
141    assert_eq!(
142        nodes,
143        vec![
144            Node { val: 0, parents: vec![], children: vec![1, 2] },
145            Node { val: 1, parents: vec![0], children: vec![3] },
146            Node { val: 2, parents: vec![0], children: vec![3] },
147            Node { val: 3, parents: vec![1, 2], children: vec![] }
148        ]
149    );
150
151    let mut nodes: Vec<Node> = vec![
152        Node {
153            val: 0,
154            parents: vec![],
155            children: vec![3, 2],
156        },
157        Node {
158            val: 3,
159            parents: vec![3, 2],
160            children: vec![]
161        },
162        Node {
163            val: 2,
164            parents: vec![0],
165            children: vec![1],
166        },
167        Node {
168            val: 1,
169            parents: vec![0],
170            children: vec![1],
171        },
172    ];
173    sort_dag(&mut nodes, |n| &mut n.parents, |n| &mut n.children);
174    assert_eq!(
175        nodes,
176        vec![
177            Node { val: 0, parents: vec![], children: vec![1, 2] },
178            Node { val: 1, parents: vec![0], children: vec![3] },
179            Node { val: 2, parents: vec![0], children: vec![3] },
180            Node { val: 3, parents: vec![1, 2], children: vec![] }
181        ]
182    );
183
184    let mut nodes: Vec<Node> = vec![
185        Node {
186            val: 0,
187            parents: vec![],
188            children: vec![3, 2],
189        },
190        Node {
191            val: 3,
192            parents: vec![3, 2],
193            children: vec![]
194        },
195        Node {
196            val: 2,
197            parents: vec![0],
198            children: vec![1],
199        },
200        Node {
201            val: 1,
202            parents: vec![0],
203            // The sibling-as-child must become before shared children.
204            children: vec![2, 1],
205        },
206    ];
207    sort_dag(&mut nodes, |n| &mut n.parents, |n| &mut n.children);
208    assert_eq!(
209        nodes,
210        vec![
211            Node { val: 0, parents: vec![], children: vec![1, 2] },
212            Node { val: 1, parents: vec![0], children: vec![2, 3] },
213            Node { val: 2, parents: vec![0], children: vec![3] },
214            Node { val: 3, parents: vec![1, 2], children: vec![] }
215        ]
216    );
217}