libpitust 0.1.0

libpitust implements random utility functions I tend to use a lot
Documentation
use crate::graph::{GraphRooted, GraphSucc, node_map::NodeMap};

fn impl_postorder<G: GraphSucc>(
    graph: G,
    vis: &mut NodeMap<G, bool>,
    items: &mut Vec<G::Node>,
    node: G::Node,
) {
    debug_assert!(!vis[node]);
    vis[node] = true;
    for node in graph.succ_of(node) {
        if !vis[node] {
            impl_postorder(graph, vis, items, node);
        }
    }
    items.push(node);
}
pub fn postorder_from<G: GraphSucc>(graph: G, roots: &[G::Node]) -> Vec<G::Node> {
    let mut vis = NodeMap::new_with(graph, |_| false);
    let mut items = vec![];
    for &root in roots {
        if !vis[root] {
            impl_postorder(graph, &mut vis, &mut items, root);
        }
    }

    items
}
pub fn postorder_all<G: GraphSucc>(graph: G) -> Vec<G::Node> {
    let mut vis = NodeMap::new_with(graph, |_| false);
    let mut items = vec![];
    for node in graph.nodes() {
        if !vis[node] {
            impl_postorder(graph, &mut vis, &mut items, node);
        }
    }

    items
}
pub fn postorder<G: GraphSucc + GraphRooted>(graph: G) -> Vec<G::Node> {
    let mut vis = NodeMap::new_with(graph, |_| false);
    let mut items = vec![];
    impl_postorder(graph, &mut vis, &mut items, graph.root_node());

    items
}

pub fn reverse_postorder_from<G: GraphSucc>(graph: G, roots: &[G::Node]) -> Vec<G::Node> {
    let mut vis = NodeMap::new_with(graph, |_| false);
    let mut items = vec![];
    for &root in roots {
        if !vis[root] {
            impl_postorder(graph, &mut vis, &mut items, root);
        }
    }

    items.reverse();
    items
}
pub fn reverse_postorder_all<G: GraphSucc>(graph: G) -> Vec<G::Node> {
    let mut vis = NodeMap::new_with(graph, |_| false);
    let mut items = vec![];
    for node in graph.nodes() {
        if !vis[node] {
            impl_postorder(graph, &mut vis, &mut items, node);
        }
    }

    items.reverse();
    items
}
pub fn reverse_postorder<G: GraphSucc + GraphRooted>(graph: G) -> Vec<G::Node> {
    let mut vis = NodeMap::new_with(graph, |_| false);
    let mut items = vec![];
    impl_postorder(graph, &mut vis, &mut items, graph.root_node());

    items.reverse();
    items
}