cycles/
cycles.rs

1use ascii_dag::graph::DAG;
2
3fn main() {
4    println!("=== Cycle Detection Examples ===\n");
5
6    // Example 1: Simple cycle A → B → C → A
7    println!("1. Simple Cycle (A → B → C → A):");
8    let mut dag = DAG::new();
9    dag.add_node(1, "A");
10    dag.add_node(2, "B");
11    dag.add_node(3, "C");
12    dag.add_edge(1, 2); // A → B
13    dag.add_edge(2, 3); // B → C
14    dag.add_edge(3, 1); // C → A (creates cycle!)
15
16    println!("{}\n", dag.render());
17
18    // Example 2: Self-referencing cycle
19    println!("2. Self-Reference (A → A):");
20    let mut dag = DAG::new();
21    dag.add_node(1, "SelfRef");
22    dag.add_edge(1, 1); // Points to itself
23
24    println!("{}\n", dag.render());
25
26    // Example 3: Longer cycle chain
27    println!("3. Longer Cycle (E1 → E2 → E3 → E4 → E2):");
28    let mut dag = DAG::new();
29    dag.add_node(1, "Error1");
30    dag.add_node(2, "Error2");
31    dag.add_node(3, "Error3");
32    dag.add_node(4, "Error4");
33    dag.add_edge(1, 2); // E1 → E2
34    dag.add_edge(2, 3); // E2 → E3
35    dag.add_edge(3, 4); // E3 → E4
36    dag.add_edge(4, 2); // E4 → E2 (cycle!)
37
38    println!("{}\n", dag.render());
39
40    // Example 4: Valid DAG (no cycle)
41    println!("4. Valid DAG - No Cycle:");
42    let dag = DAG::from_edges(
43        &[(1, "Valid1"), (2, "Valid2"), (3, "Valid3")],
44        &[(1, 2), (2, 3)],
45    );
46
47    println!("{}", dag.render());
48}