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
use crate;
/// An iterator that visits nodes in topological (Post-Order) order.
///
/// This iterator traverses the graph starting from the roots, ensuring that **children are yielded
/// before their parents**. This is the optimal order for tasks like:
/// * **Evaluation:** You can compute child results before processing the parent.
/// * **Compilation:** You can generate code for sub-expressions before the main expression.
/// * **Serialization:** You can serialize dependencies first.
///
/// # Behavior
/// * **Iterative:** Uses an explicit stack, so it is safe for very deep graphs (no stack overflow).
/// * **Deduplicated:** Shared nodes (diamonds in the graph) are yielded exactly once.
/// * **Pruned:** Only nodes reachable from the `Expression`'s roots are visited.