daggy 0.5.0

A directed acyclic graph data structure library. It is Implemented on top of petgraph's Graph data structure and attempts to follow similar conventions where suitable.
Documentation

extern crate daggy;

use daggy::{Dag, WouldCycle};
use daggy::NodeIndex;
use std::iter::once;

struct Weight;

#[test]
fn add_edges_ok() {

    let mut dag = Dag::<Weight, u32, u32>::new();
    let root = dag.add_node(Weight);
    let a = dag.add_node(Weight);
    let b = dag.add_node(Weight);
    let c = dag.add_node(Weight);

    let mut new_edges = dag.add_edges(once((root, a, 0))
        .chain(once((root, b, 1)))
        .chain(once((root, c, 2))))
        .unwrap();

    assert_eq!(new_edges.next(), dag.find_edge(root, a));
    assert_eq!(new_edges.next(), dag.find_edge(root, b));
    assert_eq!(new_edges.next(), dag.find_edge(root, c));

}


#[test]
fn add_edges_err() {

    let mut dag = Dag::<Weight, u32, u32>::new();
    let root = dag.add_node(Weight);
    let a = dag.add_node(Weight);
    let b = dag.add_node(Weight);
    let c = dag.add_node(Weight);

    let add_edges_result = dag.add_edges(once((root, a, 0))
        .chain(once((root, b, 1)))
        .chain(once((root, c, 2)))
        .chain(once((c, root, 3))));

    match add_edges_result {
        Err(WouldCycle(returned_weights)) => assert_eq!(returned_weights, vec![3, 2, 1, 0]),
        Ok(_) => panic!("Should have been an error"),
    }
}

#[test]
fn add_edges_more() {
    let mut dag = Dag::<Weight, u32, u32>::new();
    let root = dag.add_node(Weight);
    let a = dag.add_node(Weight);
    let b = dag.add_node(Weight);
    let c = dag.add_node(Weight);

    assert!(dag.add_edge(root, a, 0).is_ok());
    assert!(dag.add_edge(root, b, 0).is_ok());
    assert!(dag.add_edge(root, c, 0).is_ok());
    assert!(dag.add_edge(c, root, 0).is_err());
}

#[test]
fn add_edges_more2() {
    let max_node = 10;
    let edges = &[(1, 4), (3, 4), (2, 5), (3, 5), (2, 8), (1, 9), (1, 8),
                  (1, 3), (2, 7), (1, 7), (0, 6), (1, 2), (0, 7), (1, 6),
                  (2, 4), (0, 1), (0, 9), (2, 9), (2, 6), (0, 4), (2, 3),
                  (0, 2), (0, 3), (0, 5), (0, 8), (1, 5)];
    let mut dag = Dag::<Weight, u32, u32>::with_capacity(max_node, edges.len());
    for _ in 0..max_node {
        dag.add_node(Weight);
    }
    for &(a, b) in edges {
        assert!(dag.add_edge(NodeIndex::new(a), NodeIndex::new(b), 0).is_ok());
    }
}