use heapless_graphs::{
algorithms::{kahns, topological_sort_dfs},
containers::{
maps::{staticdict::Dictionary, MapTrait},
queues::CircularQueue,
},
edgelist::edge_list::EdgeList,
visited::NodeState,
};
fn main() {
let graph = EdgeList::<16, _, _>::new([
(0_usize, 1), (0, 2), (1, 3), (2, 4), (3, 4), (4, 5), ]);
let tasks = [
"setup",
"compile",
"test_setup",
"link",
"run_tests",
"deploy",
];
println!("Graph edges:");
for (src, dst) in [(0, 1), (0, 2), (1, 3), (2, 4), (3, 4), (4, 5)] {
println!(" {} -> {}", tasks[src], tasks[dst]);
}
println!();
println!("=== DFS-based Topological Sort ===");
let mut visited = [NodeState::Unvisited; 8];
let mut sorted_nodes = [0usize; 8];
match topological_sort_dfs(&graph, visited.as_mut_slice(), &mut sorted_nodes) {
Ok(result) => {
print!("DFS order: ");
for (i, &node) in result.iter().enumerate() {
if i > 0 {
print!(" -> ");
}
print!("{}", tasks[node]);
}
println!();
}
Err(e) => {
println!("DFS failed: {:?}", e);
}
}
println!("\n=== Kahn's Algorithm (BFS-based) ===");
let queue = CircularQueue::<usize, 8>::new();
let in_degree_map = Dictionary::<usize, isize, 8>::new();
let mut sorted_nodes = [0usize; 8];
match kahns(&graph, queue, in_degree_map, &mut sorted_nodes) {
Ok(result) => {
print!("Kahn order: ");
for (i, &node) in result.iter().enumerate() {
if i > 0 {
print!(" -> ");
}
print!("{}", tasks[node]);
}
println!();
}
Err(e) => {
println!("Kahn's failed: {:?}", e);
}
}
println!("\nBoth algorithms should produce valid topological orderings!");
println!("Note: The exact order may differ between algorithms but both are correct.");
}