diff --git a/benches/common/factories.rs b/benches/common/factories.rs
index f20e7bf..8ab8068 100644
--- a/benches/common/factories.rs
+++ b/benches/common/factories.rs
@@ -1,8 +1,8 @@
 use std::marker::PhantomData;
 
+use petgraph::data::Build;
 use petgraph::prelude::*;
 use petgraph::visit::NodeIndexable;
-use petgraph::data::Build;
 
 use petgraph::EdgeType;
 
@@ -154,17 +154,15 @@
 
 /// Parse a text adjacency matrix format into a directed graph
 fn parse_graph<Ty, G>(s: &str) -> G
-    where Ty: EdgeType,
-          G: Default + Build<NodeWeight=(), EdgeWeight=()> + NodeIndexable,
+where
+    Ty: EdgeType,
+    G: Default + Build<NodeWeight = (), EdgeWeight = ()> + NodeIndexable,
 {
     let mut g: G = Default::default();
     let s = s.trim();
     let lines = s.lines().filter(|l| !l.is_empty());
     for (row, line) in lines.enumerate() {
-        for (col, word) in line.split(' ')
-                                .filter(|s| !s.is_empty())
-                                .enumerate()
-        {
+        for (col, word) in line.split(' ').filter(|s| !s.is_empty()).enumerate() {
             let has_edge = word.parse::<i32>().unwrap();
             assert!(has_edge == 0 || has_edge == 1);
             if has_edge == 0 {
@@ -187,8 +185,9 @@
 }
 
 impl<Ty, G> GraphFactory<Ty, G>
-    where Ty: EdgeType,
-          G: Default + Build<NodeWeight=(), EdgeWeight=()> + NodeIndexable,
+where
+    Ty: EdgeType,
+    G: Default + Build<NodeWeight = (), EdgeWeight = ()> + NodeIndexable,
 {
     fn new() -> Self {
         GraphFactory {
diff --git a/benches/iso.rs b/benches/iso.rs
index 008de39..f0875c1 100644
--- a/benches/iso.rs
+++ b/benches/iso.rs
@@ -1,7 +1,7 @@
 #![feature(test)]
 
-extern crate test;
 extern crate petgraph;
+extern crate test;
 
 use test::Bencher;
 
diff --git a/benches/matrix_graph.rs b/benches/matrix_graph.rs
index 6877a89..72f5aae 100644
--- a/benches/matrix_graph.rs
+++ b/benches/matrix_graph.rs
@@ -5,9 +5,9 @@
 
 use test::Bencher;
 
-use petgraph::{EdgeType, Directed, Outgoing, Incoming};
 use petgraph::algo;
-use petgraph::matrix_graph::{MatrixGraph, node_index};
+use petgraph::matrix_graph::{node_index, MatrixGraph};
+use petgraph::{Directed, EdgeType, Incoming, Outgoing};
 
 #[bench]
 fn add_100_nodes(b: &mut test::Bencher) {
@@ -41,7 +41,8 @@
     let nodes: Vec<_> = (0..100).map(|_| g.add_node(())).collect();
     let g = g;
 
-    let edges_to_add: Vec<_> = nodes.iter()
+    let edges_to_add: Vec<_> = nodes
+        .iter()
         .enumerate()
         .map(|(i, &node)| {
             let edges: Vec<_> = (0..5)
@@ -156,10 +157,7 @@
     let s = s.trim();
     let lines = s.lines().filter(|l| !l.is_empty());
     for (row, line) in lines.enumerate() {
-        for (col, word) in line.split(' ')
-                                .filter(|s| !s.is_empty())
-                                .enumerate()
-        {
+        for (col, word) in line.split(' ').filter(|s| !s.is_empty()).enumerate() {
             let has_edge = word.parse::<i32>().unwrap();
             assert!(has_edge == 0 || has_edge == 1);
             if has_edge == 0 {
diff --git a/benches/ograph.rs b/benches/ograph.rs
index 23ac271..d3f2986 100644
--- a/benches/ograph.rs
+++ b/benches/ograph.rs
@@ -13,9 +13,7 @@
         let n = og.add_node(x);
         og.add_edge(fst, n, ());
     }
-    b.iter(|| {
-        og.add_node(1)
-    })
+    b.iter(|| og.add_node(1))
 }
 
 #[bench]
@@ -47,7 +45,7 @@
     }
     //println!("{}", og);
     b.iter(|| {
-        for _ in 0 .. 100 {
+        for _ in 0..100 {
             og.remove_node(fst);
         }
     })
diff --git a/benches/stable_graph.rs b/benches/stable_graph.rs
index ca4aed8..9dffd91 100644
--- a/benches/stable_graph.rs
+++ b/benches/stable_graph.rs
@@ -3,8 +3,8 @@
 extern crate petgraph;
 extern crate test;
 
-use test::Bencher;
 use petgraph::prelude::*;
+use test::Bencher;
 
 #[allow(dead_code)]
 mod common;
diff --git a/benches/unionfind.rs b/benches/unionfind.rs
index cf7066e..dd4446a 100644
--- a/benches/unionfind.rs
+++ b/benches/unionfind.rs
@@ -1,7 +1,7 @@
 #![feature(test)]
 
-extern crate test;
 extern crate petgraph;
+extern crate test;
 
 use test::Bencher;
 
@@ -16,9 +16,7 @@
     let a = ungraph().praust_a();
     let b = ungraph().praust_b();
 
-    bench.iter(|| {
-        (connected_components(&a), connected_components(&b))
-    });
+    bench.iter(|| (connected_components(&a), connected_components(&b)));
 }
 
 #[bench]
@@ -26,9 +24,7 @@
     let a = digraph().praust_a();
     let b = digraph().praust_b();
 
-    bench.iter(|| {
-        (connected_components(&a), connected_components(&b))
-    });
+    bench.iter(|| (connected_components(&a), connected_components(&b)));
 }
 
 #[bench]
@@ -36,9 +32,7 @@
     let a = ungraph().full_a();
     let b = ungraph().full_b();
 
-    bench.iter(|| {
-        (connected_components(&a), connected_components(&b))
-    });
+    bench.iter(|| (connected_components(&a), connected_components(&b)));
 }
 
 #[bench]
@@ -46,9 +40,7 @@
     let a = digraph().full_a();
     let b = digraph().full_b();
 
-    bench.iter(|| {
-        (connected_components(&a), connected_components(&b))
-    });
+    bench.iter(|| (connected_components(&a), connected_components(&b)));
 }
 
 #[bench]
@@ -56,9 +48,7 @@
     let a = ungraph().petersen_a();
     let b = ungraph().petersen_b();
 
-    bench.iter(|| {
-        (connected_components(&a), connected_components(&b))
-    });
+    bench.iter(|| (connected_components(&a), connected_components(&b)));
 }
 
 #[bench]
@@ -66,9 +56,7 @@
     let a = digraph().petersen_a();
     let b = digraph().petersen_b();
 
-    bench.iter(|| {
-        (connected_components(&a), connected_components(&b))
-    });
+    bench.iter(|| (connected_components(&a), connected_components(&b)));
 }
 
 #[bench]
@@ -76,9 +64,7 @@
     let a = ungraph().praust_a();
     let b = ungraph().praust_b();
 
-    bench.iter(|| {
-        (is_cyclic_undirected(&a), is_cyclic_undirected(&b))
-    });
+    bench.iter(|| (is_cyclic_undirected(&a), is_cyclic_undirected(&b)));
 }
 
 #[bench]
@@ -86,9 +72,7 @@
     let a = digraph().praust_a();
     let b = digraph().praust_b();
 
-    bench.iter(|| {
-        (is_cyclic_undirected(&a), is_cyclic_undirected(&b))
-    });
+    bench.iter(|| (is_cyclic_undirected(&a), is_cyclic_undirected(&b)));
 }
 
 #[bench]
@@ -96,9 +80,7 @@
     let a = ungraph().full_a();
     let b = ungraph().full_b();
 
-    bench.iter(|| {
-        (is_cyclic_undirected(&a), is_cyclic_undirected(&b))
-    });
+    bench.iter(|| (is_cyclic_undirected(&a), is_cyclic_undirected(&b)));
 }
 
 #[bench]
@@ -106,9 +88,7 @@
     let a = digraph().full_a();
     let b = digraph().full_b();
 
-    bench.iter(|| {
-        (is_cyclic_undirected(&a), is_cyclic_undirected(&b))
-    });
+    bench.iter(|| (is_cyclic_undirected(&a), is_cyclic_undirected(&b)));
 }
 
 #[bench]
@@ -116,9 +96,7 @@
     let a = ungraph().petersen_a();
     let b = ungraph().petersen_b();
 
-    bench.iter(|| {
-        (is_cyclic_undirected(&a), is_cyclic_undirected(&b))
-    });
+    bench.iter(|| (is_cyclic_undirected(&a), is_cyclic_undirected(&b)));
 }
 
 #[bench]
@@ -126,9 +104,7 @@
     let a = digraph().petersen_a();
     let b = digraph().petersen_b();
 
-    bench.iter(|| {
-        (is_cyclic_undirected(&a), is_cyclic_undirected(&b))
-    });
+    bench.iter(|| (is_cyclic_undirected(&a), is_cyclic_undirected(&b)));
 }
 
 #[bench]
@@ -136,9 +112,7 @@
     let a = ungraph().praust_a();
     let b = ungraph().praust_b();
 
-    bench.iter(|| {
-        (min_spanning_tree(&a), min_spanning_tree(&b))
-    });
+    bench.iter(|| (min_spanning_tree(&a), min_spanning_tree(&b)));
 }
 
 #[bench]
@@ -146,9 +120,7 @@
     let a = digraph().praust_a();
     let b = digraph().praust_b();
 
-    bench.iter(|| {
-        (min_spanning_tree(&a), min_spanning_tree(&b))
-    });
+    bench.iter(|| (min_spanning_tree(&a), min_spanning_tree(&b)));
 }
 
 #[bench]
@@ -156,9 +128,7 @@
     let a = ungraph().full_a();
     let b = ungraph().full_b();
 
-    bench.iter(|| {
-        (min_spanning_tree(&a), min_spanning_tree(&b))
-    });
+    bench.iter(|| (min_spanning_tree(&a), min_spanning_tree(&b)));
 }
 
 #[bench]
@@ -166,9 +136,7 @@
     let a = digraph().full_a();
     let b = digraph().full_b();
 
-    bench.iter(|| {
-        (min_spanning_tree(&a), min_spanning_tree(&b))
-    });
+    bench.iter(|| (min_spanning_tree(&a), min_spanning_tree(&b)));
 }
 
 #[bench]
@@ -176,9 +144,7 @@
     let a = ungraph().petersen_a();
     let b = ungraph().petersen_b();
 
-    bench.iter(|| {
-        (min_spanning_tree(&a), min_spanning_tree(&b))
-    });
+    bench.iter(|| (min_spanning_tree(&a), min_spanning_tree(&b)));
 }
 
 #[bench]
@@ -186,7 +152,5 @@
     let a = digraph().petersen_a();
     let b = digraph().petersen_b();
 
-    bench.iter(|| {
-        (min_spanning_tree(&a), min_spanning_tree(&b))
-    });
+    bench.iter(|| (min_spanning_tree(&a), min_spanning_tree(&b)));
 }
diff --git a/serialization-tests/src/lib.rs b/serialization-tests/src/lib.rs
index e69de29..8b13789 100644
--- a/serialization-tests/src/lib.rs
+++ b/serialization-tests/src/lib.rs
@@ -0,0 +1 @@
+
diff --git a/serialization-tests/tests/serialization.rs b/serialization-tests/tests/serialization.rs
index a82ff88..e4d13c4 100644
--- a/serialization-tests/tests/serialization.rs
+++ b/serialization-tests/tests/serialization.rs
@@ -1,24 +1,25 @@
-
 extern crate petgraph;
-#[macro_use] extern crate quickcheck;
+#[macro_use]
+extern crate quickcheck;
+extern crate bincode;
 extern crate itertools;
 extern crate serde_json;
-extern crate bincode;
-#[macro_use] extern crate defmac;
+#[macro_use]
+extern crate defmac;
 
 use std::collections::HashSet;
 use std::fmt::Debug;
 use std::iter::FromIterator;
 
-use itertools::{Itertools, repeat_n};
 use itertools::assert_equal;
+use itertools::{repeat_n, Itertools};
 
+use petgraph::graph::{edge_index, node_index, IndexType};
 use petgraph::prelude::*;
-use petgraph::EdgeType;
-use petgraph::graph::{node_index, edge_index, IndexType};
 use petgraph::visit::EdgeRef;
-use petgraph::visit::NodeIndexable;
 use petgraph::visit::IntoEdgeReferences;
+use petgraph::visit::NodeIndexable;
+use petgraph::EdgeType;
 
 // graphs are the equal, down to graph indices
 // this is a strict notion of graph equivalence:
@@ -26,20 +27,27 @@
 // * Requires equal node and edge indices, equal weights
 // * Does not require: edge for node order
 pub fn assert_graph_eq<N, N2, E, Ty, Ix>(g: &Graph<N, E, Ty, Ix>, h: &Graph<N2, E, Ty, Ix>)
-    where N: PartialEq<N2> + Debug, N2: PartialEq<N2> + Debug, E: PartialEq + Debug,
-          Ty: EdgeType,
-          Ix: IndexType,
+where
+    N: PartialEq<N2> + Debug,
+    N2: PartialEq<N2> + Debug,
+    E: PartialEq + Debug,
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     assert_eq!(g.node_count(), h.node_count());
     assert_eq!(g.edge_count(), h.edge_count());
 
     // same node weigths
-    assert_equal(g.raw_nodes().iter().map(|n| &n.weight),
-                 h.raw_nodes().iter().map(|n| &n.weight));
+    assert_equal(
+        g.raw_nodes().iter().map(|n| &n.weight),
+        h.raw_nodes().iter().map(|n| &n.weight),
+    );
 
     // same edge weigths
-    assert_equal(g.raw_edges().iter().map(|n| &n.weight),
-                 h.raw_edges().iter().map(|n| &n.weight));
+    assert_equal(
+        g.raw_edges().iter().map(|n| &n.weight),
+        h.raw_edges().iter().map(|n| &n.weight),
+    );
 
     for e1 in g.edge_references() {
         let (a2, b2) = h.edge_endpoints(e1.id()).unwrap();
@@ -63,7 +71,9 @@
 // * Requires equal node and edge indices, equal weights
 // * Does not require: edge for node order
 pub fn assert_stable_graph_eq<N, E>(g: &StableGraph<N, E>, h: &StableGraph<N, E>)
-    where N: PartialEq + Debug, E: PartialEq + Debug,
+where
+    N: PartialEq + Debug,
+    E: PartialEq + Debug,
 {
     assert_eq!(g.node_count(), h.node_count());
     assert_eq!(g.edge_count(), h.edge_count());
@@ -71,7 +81,8 @@
     // same node weigths
     assert_equal(
         (0..g.node_bound()).map(|i| g.node_weight(node_index(i))),
-        (0..h.node_bound()).map(|i| h.node_weight(node_index(i))));
+        (0..h.node_bound()).map(|i| h.node_weight(node_index(i))),
+    );
 
     let last_edge_g = g.edge_references().next_back();
     let last_edge_h = h.edge_references().next_back();
@@ -83,7 +94,8 @@
         // same edge weigths
         assert_equal(
             (0..lgi).map(|i| g.edge_weight(edge_index(i))),
-            (0..lhi).map(|i| h.edge_weight(edge_index(i))));
+            (0..lhi).map(|i| h.edge_weight(edge_index(i))),
+        );
     }
 
     for e1 in g.edge_references() {
@@ -102,10 +114,10 @@
     }
 }
 
-
 fn make_graph<Ty, Ix>() -> Graph<&'static str, i32, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     let mut g = Graph::default();
     let a = g.add_node("A");
@@ -131,8 +143,9 @@
 }
 
 fn make_stable_graph<Ty, Ix>() -> StableGraph<&'static str, i32, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     let mut g = StableGraph::default();
     let a = g.add_node("A");
@@ -203,7 +216,6 @@
     "edges":[[0,1,7],[2,0,9],[0,3,14],[1,2,10],[3,2,2],[3,4,9],[1,5,15],[2,5,11],[4,5,6]]
     }"#;
 
-
 type DiGraphNils = DiGraph<(), ()>;
 type UnGraphNils = UnGraph<(), ()>;
 type DiGraphNilsU8 = DiGraph<(), (), u8>;
@@ -215,19 +227,19 @@
 }
 
 #[test]
-#[should_panic(expected="edge property mismatch")]
+#[should_panic(expected = "edge property mismatch")]
 fn from_json_graph_nils_edge_property_mismatch() {
     let _: UnGraphNils = fromjson!(DIGRAPH_NILS);
 }
 
 #[test]
-#[should_panic(expected="does not exist")]
+#[should_panic(expected = "does not exist")]
 fn from_json_graph_nils_index_oob() {
     let _: DiGraphNils = fromjson!(DIGRAPH_NILS_INDEX_OOB);
 }
 
 #[test]
-#[should_panic(expected="expected u8")]
+#[should_panic(expected = "expected u8")]
 fn from_json_graph_nils_index_too_large() {
     let _: DiGraphNilsU8 = fromjson!(DIGRAPH_NILS_INDEX_OUTSIDE_U8);
 }
@@ -238,21 +250,31 @@
 }
 
 #[test]
-#[should_panic(expected="expected unit")]
+#[should_panic(expected = "expected unit")]
 fn from_json_graph_from_edge_type_1() {
     let _: DiGraphNils = fromjson!(DIGRAPH_STRI32);
 }
 
 #[test]
-#[should_panic(expected="expected a string")]
+#[should_panic(expected = "expected a string")]
 fn from_json_graph_from_edge_type_2() {
     let _: DiGraphStrI32 = fromjson!(DIGRAPH_NILS);
 }
 
 #[test]
 fn from_json_digraph_str_i32() {
-    let g4nodes = ["A","B","C","D","E","F"];
-    let g4edges = [[0,1,7],[2,0,9],[0,3,14],[1,2,10],[3,2,2],[3,4,9],[1,5,15],[2,5,11],[4,5,6]];
+    let g4nodes = ["A", "B", "C", "D", "E", "F"];
+    let g4edges = [
+        [0, 1, 7],
+        [2, 0, 9],
+        [0, 3, 14],
+        [1, 2, 10],
+        [3, 2, 2],
+        [3, 4, 9],
+        [1, 5, 15],
+        [2, 5, 11],
+        [4, 5, 6],
+    ];
 
     type GSI = DiGraph<String, i32>;
     type GSISmall = DiGraph<String, i32, u8>;
@@ -280,17 +302,19 @@
     // ensure we fail if node or edge count exceeds index max
     use serde_json::from_str;
 
-    let j1_big = &format!("{}{}{}",
-                          r#"
+    let j1_big = &format!(
+        "{}{}{}",
+        r#"
                           {"nodes": [
                           "#,
-                          repeat_n(0, 300).format(", "),
-                          r#"
+        repeat_n(0, 300).format(", "),
+        r#"
                           ],
                           "edge_property": "directed",
                           "edges": []
                           }
-                          "#);
+                          "#
+    );
 
     type G8 = DiGraph<i32, (), u8>;
     type G16 = DiGraph<i32, (), u16>;
@@ -313,13 +337,15 @@
     // ensure we fail if node or edge count exceeds index max
     use serde_json::from_str;
 
-    let j1_big = format!("{}{}{}",
-                         r#"
+    let j1_big = format!(
+        "{}{}{}",
+        r#"
                          {"nodes": [0],
                          "edge_property": "directed",
                          "edges": ["#,
-                         repeat_n("[0, 0, 1]", (1 << 16) - 1).format(", "),
-                         "]}");
+        repeat_n("[0, 0, 1]", (1 << 16) - 1).format(", "),
+        "]}"
+    );
 
     type G8 = DiGraph<i32, i32, u8>;
     type G16 = DiGraph<i32, i32, u16>;
@@ -350,7 +376,6 @@
     assert_stable_graph_eq(&g1, &g2);
 }
 
-
 // bincode macros
 defmac!(encode ref g => bincode::serialize(g).unwrap());
 defmac!(decode ref data => bincode::deserialize(data).unwrap());
diff --git a/src/algo/dominators.rs b/src/algo/dominators.rs
index 4d39f2e..85c2b63 100644
--- a/src/algo/dominators.rs
+++ b/src/algo/dominators.rs
@@ -21,14 +21,16 @@
 /// The dominance relation for some graph and root.
 #[derive(Debug, Clone)]
 pub struct Dominators<N>
-    where N: Copy + Eq + Hash
+where
+    N: Copy + Eq + Hash,
 {
     root: N,
     dominators: HashMap<N, N>,
 }
 
 impl<N> Dominators<N>
-    where N: Copy + Eq + Hash
+where
+    N: Copy + Eq + Hash,
 {
     /// Get the root node used to construct these dominance relations.
     pub fn root(&self) -> N {
@@ -81,14 +83,16 @@
 
 /// Iterator for a node's dominators.
 pub struct DominatorsIter<'a, N>
-    where N: 'a + Copy + Eq + Hash
+where
+    N: 'a + Copy + Eq + Hash,
 {
     dominators: &'a Dominators<N>,
     node: Option<N>,
 }
 
 impl<'a, N> Iterator for DominatorsIter<'a, N>
-    where N: 'a + Copy + Eq + Hash
+where
+    N: 'a + Copy + Eq + Hash,
 {
     type Item = N;
 
@@ -115,8 +119,9 @@
 ///
 /// [0]: http://www.cs.rice.edu/~keith/EMBED/dom.pdf
 pub fn simple_fast<G>(graph: G, root: G::NodeId) -> Dominators<G::NodeId>
-    where G: IntoNeighbors + Visitable,
-          <G as GraphBase>::NodeId: Eq + Hash
+where
+    G: IntoNeighbors + Visitable,
+    <G as GraphBase>::NodeId: Eq + Hash,
 {
     let (post_order, predecessor_sets) = simple_fast_post_order(graph, root);
     let length = post_order.len();
@@ -129,7 +134,8 @@
     // convert our data structures to play along first.
 
     // Maps a node to its index into `post_order`.
-    let node_to_post_order_idx: HashMap<_, _> = post_order.iter()
+    let node_to_post_order_idx: HashMap<_, _> = post_order
+        .iter()
         .enumerate()
         .map(|(idx, &node)| (node, idx))
         .collect();
@@ -156,12 +162,14 @@
             // node.
 
             let new_idom_idx = {
-                let mut predecessors =
-                    idx_to_predecessor_vec[idx].iter().filter(|&&p| dominators[p] != UNDEFINED);
-                let new_idom_idx = predecessors.next()
-                    .expect("Because the root is initialized to dominate itself, and is the \
+                let mut predecessors = idx_to_predecessor_vec[idx]
+                    .iter()
+                    .filter(|&&p| dominators[p] != UNDEFINED);
+                let new_idom_idx = predecessors.next().expect(
+                    "Because the root is initialized to dominate itself, and is the \
                              first node in every path, there must exist a predecessor to this \
-                             node that also has a dominator");
+                             node that also has a dominator",
+                );
                 predecessors.fold(*new_idom_idx, |new_idom_idx, &predecessor_idx| {
                     intersect(&dominators, new_idom_idx, predecessor_idx)
                 })
@@ -182,7 +190,8 @@
 
     Dominators {
         root,
-        dominators: dominators.into_iter()
+        dominators: dominators
+            .into_iter()
             .enumerate()
             .map(|(idx, dom_idx)| (post_order[idx], post_order[dom_idx]))
             .collect(),
@@ -199,17 +208,22 @@
     }
 }
 
-fn predecessor_sets_to_idx_vecs<N>(post_order: &[N],
-                                   node_to_post_order_idx: &HashMap<N, usize>,
-                                   mut predecessor_sets: HashMap<N, HashSet<N>>)
-                                   -> Vec<Vec<usize>>
-    where N: Copy + Eq + Hash
+fn predecessor_sets_to_idx_vecs<N>(
+    post_order: &[N],
+    node_to_post_order_idx: &HashMap<N, usize>,
+    mut predecessor_sets: HashMap<N, HashSet<N>>,
+) -> Vec<Vec<usize>>
+where
+    N: Copy + Eq + Hash,
 {
-    post_order.iter()
+    post_order
+        .iter()
         .map(|node| {
-            predecessor_sets.remove(node)
+            predecessor_sets
+                .remove(node)
                 .map(|predecessors| {
-                    predecessors.into_iter()
+                    predecessors
+                        .into_iter()
                         .map(|p| *node_to_post_order_idx.get(&p).unwrap())
                         .collect()
                 })
@@ -218,11 +232,13 @@
         .collect()
 }
 
-fn simple_fast_post_order<G>(graph: G,
-                             root: G::NodeId)
-                             -> (Vec<G::NodeId>, HashMap<G::NodeId, HashSet<G::NodeId>>)
-    where G: IntoNeighbors + Visitable,
-          <G as GraphBase>::NodeId: Eq + Hash
+fn simple_fast_post_order<G>(
+    graph: G,
+    root: G::NodeId,
+) -> (Vec<G::NodeId>, HashMap<G::NodeId, HashSet<G::NodeId>>)
+where
+    G: IntoNeighbors + Visitable,
+    <G as GraphBase>::NodeId: Eq + Hash,
 {
     let mut post_order = vec![];
     let mut predecessor_sets = HashMap::new();
@@ -231,7 +247,8 @@
         post_order.push(node);
 
         for successor in graph.neighbors(node) {
-            predecessor_sets.entry(successor)
+            predecessor_sets
+                .entry(successor)
                 .or_insert_with(HashSet::new)
                 .insert(node);
         }
@@ -248,10 +265,7 @@
     fn test_iter_dominators() {
         let doms: Dominators<u32> = Dominators {
             root: 0,
-            dominators: [(2, 1), (1, 0), (0, 0)]
-                .iter()
-                .cloned()
-                .collect(),
+            dominators: [(2, 1), (1, 0), (0, 0)].iter().cloned().collect(),
         };
 
         let all_doms: Vec<_> = doms.dominators(2).unwrap().collect();
@@ -262,6 +276,9 @@
         let strict_doms: Vec<_> = doms.strict_dominators(2).unwrap().collect();
         assert_eq!(vec![1, 0], strict_doms);
 
-        assert_eq!(None::<()>, doms.strict_dominators(99).map(|_| unreachable!()));
+        assert_eq!(
+            None::<()>,
+            doms.strict_dominators(99).map(|_| unreachable!())
+        );
     }
 }
diff --git a/src/algo/mod.rs b/src/algo/mod.rs
index 6163a2b..aa54405 100644
--- a/src/algo/mod.rs
+++ b/src/algo/mod.rs
@@ -6,46 +6,27 @@
 
 pub mod dominators;
 
-use std::collections::{BinaryHeap, HashMap};
 use std::cmp::min;
+use std::collections::{BinaryHeap, HashMap};
 
 use crate::prelude::*;
 
-use super::{
-    EdgeType,
-};
-use crate::scored::MinScored;
-use super::visit::{
-    GraphRef,
-    GraphBase,
-    Visitable,
-    VisitMap,
-    IntoNeighbors,
-    IntoNeighborsDirected,
-    IntoNodeIdentifiers,
-    NodeCount,
-    NodeIndexable,
-    NodeCompactIndexable,
-    IntoEdgeReferences,
-    IntoEdges,
-    Reversed,
-};
+use super::graph::IndexType;
 use super::unionfind::UnionFind;
-use super::graph::{
-    IndexType,
+use super::visit::{
+    GraphBase, GraphRef, IntoEdgeReferences, IntoEdges, IntoNeighbors, IntoNeighborsDirected,
+    IntoNodeIdentifiers, NodeCompactIndexable, NodeCount, NodeIndexable, Reversed, VisitMap,
+    Visitable,
 };
-use crate::visit::{Data, NodeRef, IntoNodeReferences};
+use super::EdgeType;
+use crate::data::Element;
+use crate::scored::MinScored;
 use crate::visit::Walker;
-use crate::data::{
-    Element,
-};
+use crate::visit::{Data, IntoNodeReferences, NodeRef};
 
-pub use super::isomorphism::{
-    is_isomorphic,
-    is_isomorphic_matching,
-};
-pub use super::dijkstra::dijkstra;
 pub use super::astar::astar;
+pub use super::dijkstra::dijkstra;
+pub use super::isomorphism::{is_isomorphic, is_isomorphic_matching};
 pub use super::simple_paths::all_simple_paths;
 
 /// \[Generic\] Return the number of connected components of the graph.
@@ -87,7 +68,8 @@
 /// assert_eq!(connected_components(&graph),1);
 /// ```
 pub fn connected_components<G>(g: G) -> usize
-    where G: NodeCompactIndexable + IntoEdgeReferences,
+where
+    G: NodeCompactIndexable + IntoEdgeReferences,
 {
     let mut vertex_sets = UnionFind::new(g.node_bound());
     for edge in g.edge_references() {
@@ -102,12 +84,12 @@
     labels.len()
 }
 
-
 /// \[Generic\] Return `true` if the input graph contains a cycle.
 ///
 /// Always treats the input graph as if undirected.
 pub fn is_cyclic_undirected<G>(g: G) -> bool
-    where G: NodeIndexable + IntoEdgeReferences
+where
+    G: NodeIndexable + IntoEdgeReferences,
 {
     let mut edge_sets = UnionFind::new(g.node_bound());
     for edge in g.edge_references() {
@@ -116,13 +98,12 @@
         // union the two vertices of the edge
         //  -- if they were already the same, then we have a cycle
         if !edge_sets.union(g.to_index(a), g.to_index(b)) {
-            return true
+            return true;
         }
     }
     false
 }
 
-
 /// \[Generic\] Perform a topological sort of a directed graph.
 ///
 /// If the graph was acyclic, return a vector of nodes in topological order:
@@ -134,9 +115,12 @@
 ///
 /// If `space` is not `None`, it is used instead of creating a new workspace for
 /// graph traversal. The implementation is iterative.
-pub fn toposort<G>(g: G, space: Option<&mut DfsSpace<G::NodeId, G::Map>>)
-    -> Result<Vec<G::NodeId>, Cycle<G::NodeId>>
-    where G: IntoNeighborsDirected + IntoNodeIdentifiers + Visitable,
+pub fn toposort<G>(
+    g: G,
+    space: Option<&mut DfsSpace<G::NodeId, G::Map>>,
+) -> Result<Vec<G::NodeId>, Cycle<G::NodeId>>
+where
+    G: IntoNeighborsDirected + IntoNodeIdentifiers + Visitable,
 {
     // based on kosaraju scc
     with_dfs(g, space, |dfs| {
@@ -193,16 +177,16 @@
 /// This implementation is recursive; use `toposort` if an alternative is
 /// needed.
 pub fn is_cyclic_directed<G>(g: G) -> bool
-    where G: IntoNodeIdentifiers + IntoNeighbors + Visitable,
+where
+    G: IntoNodeIdentifiers + IntoNeighbors + Visitable,
 {
     use crate::visit::{depth_first_search, DfsEvent};
 
-    depth_first_search(g, g.node_identifiers(), |event| {
-        match event {
-            DfsEvent::BackEdge(_, _) => Err(()),
-            _ => Ok(()),
-        }
-    }).is_err()
+    depth_first_search(g, g.node_identifiers(), |event| match event {
+        DfsEvent::BackEdge(_, _) => Err(()),
+        _ => Ok(()),
+    })
+    .is_err()
 }
 
 type DfsSpaceType<G> = DfsSpace<<G as GraphBase>::NodeId, <G as Visitable>::Map>;
@@ -214,38 +198,42 @@
 }
 
 impl<N, VM> DfsSpace<N, VM>
-    where N: Copy + PartialEq,
-          VM: VisitMap<N>,
+where
+    N: Copy + PartialEq,
+    VM: VisitMap<N>,
 {
     pub fn new<G>(g: G) -> Self
-        where G: GraphRef + Visitable<NodeId=N, Map=VM>,
+    where
+        G: GraphRef + Visitable<NodeId = N, Map = VM>,
     {
-        DfsSpace {
-            dfs: Dfs::empty(g)
-        }
+        DfsSpace { dfs: Dfs::empty(g) }
     }
 }
 
 impl<N, VM> Default for DfsSpace<N, VM>
-    where VM: VisitMap<N> + Default,
+where
+    VM: VisitMap<N> + Default,
 {
     fn default() -> Self {
         DfsSpace {
             dfs: Dfs {
                 stack: <_>::default(),
                 discovered: <_>::default(),
-            }
+            },
         }
     }
 }
 
 /// Create a Dfs if it's needed
 fn with_dfs<G, F, R>(g: G, space: Option<&mut DfsSpaceType<G>>, f: F) -> R
-    where G: GraphRef + Visitable,
-          F: FnOnce(&mut Dfs<G::NodeId, G::Map>) -> R
+where
+    G: GraphRef + Visitable,
+    F: FnOnce(&mut Dfs<G::NodeId, G::Map>) -> R,
 {
     let mut local_visitor;
-    let dfs = if let Some(v) = space { &mut v.dfs } else {
+    let dfs = if let Some(v) = space {
+        &mut v.dfs
+    } else {
         local_visitor = Dfs::empty(g);
         &mut local_visitor
     };
@@ -258,10 +246,14 @@
 ///
 /// If `space` is not `None`, it is used instead of creating a new workspace for
 /// graph traversal.
-pub fn has_path_connecting<G>(g: G, from: G::NodeId, to: G::NodeId,
-                              space: Option<&mut DfsSpace<G::NodeId, G::Map>>)
-    -> bool
-    where G: IntoNeighbors + Visitable,
+pub fn has_path_connecting<G>(
+    g: G,
+    from: G::NodeId,
+    to: G::NodeId,
+    space: Option<&mut DfsSpace<G::NodeId, G::Map>>,
+) -> bool
+where
+    G: IntoNeighbors + Visitable,
 {
     with_dfs(g, space, |dfs| {
         dfs.reset(g);
@@ -273,7 +265,8 @@
 /// Renamed to `kosaraju_scc`.
 #[deprecated(note = "renamed to kosaraju_scc")]
 pub fn scc<G>(g: G) -> Vec<Vec<G::NodeId>>
-    where G: IntoNeighborsDirected + Visitable + IntoNodeIdentifiers,
+where
+    G: IntoNeighborsDirected + Visitable + IntoNodeIdentifiers,
 {
     kosaraju_scc(g)
 }
@@ -290,7 +283,8 @@
 ///
 /// This implementation is iterative and does two passes over the nodes.
 pub fn kosaraju_scc<G>(g: G) -> Vec<Vec<G::NodeId>>
-    where G: IntoNeighborsDirected + Visitable + IntoNodeIdentifiers,
+where
+    G: IntoNeighborsDirected + Visitable + IntoNodeIdentifiers,
 {
     let mut dfs = DfsPostOrder::empty(g);
 
@@ -299,7 +293,7 @@
     let mut finish_order = Vec::with_capacity(0);
     for i in g.node_identifiers() {
         if dfs.discovered.is_visited(&i) {
-            continue
+            continue;
         }
 
         dfs.move_to(i);
@@ -341,10 +335,10 @@
 ///
 /// This implementation is recursive and does one pass over the nodes.
 pub fn tarjan_scc<G>(g: G) -> Vec<Vec<G::NodeId>>
-    where G: IntoNodeIdentifiers + IntoNeighbors + NodeIndexable
+where
+    G: IntoNodeIdentifiers + IntoNeighbors + NodeIndexable,
 {
-    #[derive(Copy, Clone)]
-    #[derive(Debug)]
+    #[derive(Copy, Clone, Debug)]
     struct NodeData {
         index: Option<usize>,
         lowlink: usize,
@@ -353,8 +347,9 @@
 
     #[derive(Debug)]
     struct Data<'a, G>
-        where G: NodeIndexable,
-          G::NodeId: 'a
+    where
+        G: NodeIndexable,
+        G::NodeId: 'a,
     {
         index: usize,
         nodes: Vec<NodeData>,
@@ -363,10 +358,13 @@
     }
 
     fn scc_visit<G>(v: G::NodeId, g: G, data: &mut Data<G>)
-        where G: IntoNeighbors + NodeIndexable
+    where
+        G: IntoNeighbors + NodeIndexable,
     {
         macro_rules! node {
-            ($node:expr) => (data.nodes[g.to_index($node)])
+            ($node:expr) => {
+                data.nodes[g.to_index($node)]
+            };
         }
 
         if node![v].index.is_some() {
@@ -405,7 +403,9 @@
                     let w = data.stack.pop().unwrap();
                     node![w].on_stack = false;
                     cur_scc.push(w);
-                    if g.to_index(w) == g.to_index(v) { break; }
+                    if g.to_index(w) == g.to_index(v) {
+                        break;
+                    }
                 }
                 data.sccs.push(cur_scc);
             }
@@ -414,7 +414,14 @@
 
     let mut sccs = Vec::new();
     {
-        let map = vec![NodeData { index: None, lowlink: !0, on_stack: false }; g.node_bound()];
+        let map = vec![
+            NodeData {
+                index: None,
+                lowlink: !0,
+                on_stack: false
+            };
+            g.node_bound()
+        ];
 
         let mut data = Data {
             index: 0,
@@ -510,9 +517,13 @@
 /// assert_eq!(acyclic_condensed_graph.edge_count(), 1);
 /// assert_eq!(acyclic_condensed_graph.neighbors(B).collect::<Vec<_>>(), vec![A]);
 /// ```
-pub fn condensation<N, E, Ty, Ix>(g: Graph<N, E, Ty, Ix>, make_acyclic: bool) -> Graph<Vec<N>, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+pub fn condensation<N, E, Ty, Ix>(
+    g: Graph<N, E, Ty, Ix>,
+    make_acyclic: bool,
+) -> Graph<Vec<N>, E, Ty, Ix>
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     let sccs = kosaraju_scc(&g);
     let mut condensed: Graph<Vec<N>, E, Ty, Ix> = Graph::with_capacity(sccs.len(), g.edge_count());
@@ -558,11 +569,11 @@
 ///
 /// Use `from_elements` to create a graph from the resulting iterator.
 pub fn min_spanning_tree<G>(g: G) -> MinSpanningTree<G>
-    where G::NodeWeight: Clone,
-          G::EdgeWeight: Clone + PartialOrd,
-          G: IntoNodeReferences + IntoEdgeReferences + NodeIndexable,
+where
+    G::NodeWeight: Clone,
+    G::EdgeWeight: Clone + PartialOrd,
+    G: IntoNodeReferences + IntoEdgeReferences + NodeIndexable,
 {
-
     // Initially each vertex is its own disjoint subgraph, track the connectedness
     // of the pre-MST with a union & find datastructure.
     let subgraphs = UnionFind::new(g.node_bound());
@@ -570,7 +581,10 @@
     let edges = g.edge_references();
     let mut sort_edges = BinaryHeap::with_capacity(edges.size_hint().0);
     for edge in edges {
-        sort_edges.push(MinScored(edge.weight().clone(), (edge.source(), edge.target())));
+        sort_edges.push(MinScored(
+            edge.weight().clone(),
+            (edge.source(), edge.target()),
+        ));
     }
 
     MinSpanningTree {
@@ -581,12 +595,12 @@
         node_map: HashMap::new(),
         node_count: 0,
     }
-
 }
 
 /// An iterator producing a minimum spanning forest of a graph.
 pub struct MinSpanningTree<G>
-    where G: Data + IntoNodeReferences,
+where
+    G: Data + IntoNodeReferences,
 {
     graph: G,
     node_ids: Option<G::NodeReferences>,
@@ -596,11 +610,11 @@
     node_count: usize,
 }
 
-
 impl<G> Iterator for MinSpanningTree<G>
-    where G: IntoNodeReferences + NodeIndexable,
-          G::NodeWeight: Clone,
-          G::EdgeWeight: PartialOrd,
+where
+    G: IntoNodeReferences + NodeIndexable,
+    G::NodeWeight: Clone,
+    G::EdgeWeight: PartialOrd,
 {
     type Item = Element<G::NodeWeight, G::EdgeWeight>;
 
@@ -610,7 +624,9 @@
             if let Some(node) = iter.next() {
                 self.node_map.insert(g.to_index(node.id()), self.node_count);
                 self.node_count += 1;
-                return Some(Element::Node { weight: node.weight().clone() });
+                return Some(Element::Node {
+                    weight: node.weight().clone(),
+                });
             }
         }
         self.node_ids = None;
@@ -628,11 +644,11 @@
             // check if the edge would connect two disjoint parts
             let (a_index, b_index) = (g.to_index(a), g.to_index(b));
             if self.subgraphs.union(a_index, b_index) {
-                let (&a_order, &b_order) = match (self.node_map.get(&a_index),
-                                                  self.node_map.get(&b_index)) {
-                    (Some(a_id), Some(b_id)) => (a_id, b_id),
-                    _ => panic!("Edge references unknown node"),
-                };
+                let (&a_order, &b_order) =
+                    match (self.node_map.get(&a_index), self.node_map.get(&b_index)) {
+                        (Some(a_id), Some(b_id)) => (a_id, b_id),
+                        _ => panic!("Edge references unknown node"),
+                    };
                 return Some(Element::Edge {
                     source: a_order,
                     target: b_order,
@@ -651,7 +667,8 @@
 impl<N> Cycle<N> {
     /// Return a node id that participates in the cycle
     pub fn node_id(&self) -> N
-        where N: Copy
+    where
+        N: Copy,
     {
         self.0
     }
@@ -725,10 +742,13 @@
 ///
 /// assert!(bellman_ford(&graph_with_neg_cycle, NodeIndex::new(0)).is_err());
 /// ```
-pub fn bellman_ford<G>(g: G, source: G::NodeId)
-    -> Result<(Vec<G::EdgeWeight>, Vec<Option<G::NodeId>>), NegativeCycle>
-    where G: NodeCount + IntoNodeIdentifiers + IntoEdges + NodeIndexable,
-          G::EdgeWeight: FloatMeasure,
+pub fn bellman_ford<G>(
+    g: G,
+    source: G::NodeId,
+) -> Result<(Vec<G::EdgeWeight>, Vec<Option<G::NodeId>>), NegativeCycle>
+where
+    G: NodeCount + IntoNodeIdentifiers + IntoEdges + NodeIndexable,
+    G::EdgeWeight: FloatMeasure,
 {
     let mut predecessor = vec![None; g.node_bound()];
     let mut distance = vec![<_>::infinite(); g.node_bound()];
@@ -771,29 +791,34 @@
     Ok((distance, predecessor))
 }
 
-use std::ops::Add;
 use std::fmt::Debug;
+use std::ops::Add;
 
 /// Associated data that can be used for measures (such as length).
-pub trait Measure : Debug + PartialOrd + Add<Self, Output=Self> + Default + Clone {
-}
+pub trait Measure: Debug + PartialOrd + Add<Self, Output = Self> + Default + Clone {}
 
-impl<M> Measure for M
-    where M: Debug + PartialOrd + Add<M, Output=M> + Default + Clone,
-{ }
+impl<M> Measure for M where M: Debug + PartialOrd + Add<M, Output = M> + Default + Clone {}
 
 /// A floating-point measure.
-pub trait FloatMeasure : Measure + Copy {
+pub trait FloatMeasure: Measure + Copy {
     fn zero() -> Self;
     fn infinite() -> Self;
 }
 
 impl FloatMeasure for f32 {
-    fn zero() -> Self { 0. }
-    fn infinite() -> Self { 1./0. }
+    fn zero() -> Self {
+        0.
+    }
+    fn infinite() -> Self {
+        1. / 0.
+    }
 }
 
 impl FloatMeasure for f64 {
-    fn zero() -> Self { 0. }
-    fn infinite() -> Self { 1./0. }
+    fn zero() -> Self {
+        0.
+    }
+    fn infinite() -> Self {
+        1. / 0.
+    }
 }
diff --git a/src/astar.rs b/src/astar.rs
index b9435f5..56b3e2e 100644
--- a/src/astar.rs
+++ b/src/astar.rs
@@ -1,22 +1,10 @@
-use std::collections::{
-    HashMap,
-    BinaryHeap,
-};
-use std::collections::hash_map::Entry::{
-    Occupied,
-    Vacant,
-};
+use std::collections::hash_map::Entry::{Occupied, Vacant};
+use std::collections::{BinaryHeap, HashMap};
 
 use std::hash::Hash;
 
+use super::visit::{EdgeRef, GraphBase, IntoEdges, VisitMap, Visitable};
 use crate::scored::MinScored;
-use super::visit::{
-    EdgeRef,
-    GraphBase,
-    IntoEdges,
-    VisitMap,
-    Visitable,
-};
 
 use crate::algo::Measure;
 
@@ -75,15 +63,20 @@
 ///
 /// Returns the total cost + the path of subsequent `NodeId` from start to finish, if one was
 /// found.
-pub fn astar<G, F, H, K, IsGoal>(graph: G, start: G::NodeId, mut is_goal: IsGoal,
-                                     mut edge_cost: F, mut estimate_cost: H)
-    -> Option<(K, Vec<G::NodeId>)>
-    where G: IntoEdges + Visitable,
-          IsGoal: FnMut(G::NodeId) -> bool,
-          G::NodeId: Eq + Hash,
-          F: FnMut(G::EdgeRef) -> K,
-          H: FnMut(G::NodeId) -> K,
-          K: Measure + Copy,
+pub fn astar<G, F, H, K, IsGoal>(
+    graph: G,
+    start: G::NodeId,
+    mut is_goal: IsGoal,
+    mut edge_cost: F,
+    mut estimate_cost: H,
+) -> Option<(K, Vec<G::NodeId>)>
+where
+    G: IntoEdges + Visitable,
+    IsGoal: FnMut(G::NodeId) -> bool,
+    G::NodeId: Eq + Hash,
+    F: FnMut(G::EdgeRef) -> K,
+    H: FnMut(G::NodeId) -> K,
+    K: Measure + Copy,
 {
     let mut visited = graph.visit_map();
     let mut visit_next = BinaryHeap::new();
@@ -104,7 +97,7 @@
         // Don't visit the same node several times, as the first time it was visited it was using
         // the shortest available path.
         if !visited.visit(node) {
-            continue
+            continue;
         }
 
         // This lookup can be unwrapped without fear of panic since the node was necessarily scored
@@ -114,7 +107,7 @@
         for edge in graph.edges(node) {
             let next = edge.target();
             if visited.is_visited(&next) {
-                continue
+                continue;
             }
 
             let mut next_score = node_score + edge_cost(edge);
@@ -128,7 +121,7 @@
                     } else {
                         next_score = old_score;
                     }
-                },
+                }
                 Vacant(ent) => {
                     ent.insert(next_score);
                     path_tracker.set_predecessor(next, node);
@@ -144,15 +137,17 @@
 }
 
 struct PathTracker<G>
-    where G: GraphBase,
-          G::NodeId: Eq + Hash,
+where
+    G: GraphBase,
+    G::NodeId: Eq + Hash,
 {
     came_from: HashMap<G::NodeId, G::NodeId>,
 }
 
 impl<G> PathTracker<G>
-    where G: GraphBase,
-          G::NodeId: Eq + Hash,
+where
+    G: GraphBase,
+    G::NodeId: Eq + Hash,
 {
     fn new() -> PathTracker<G> {
         PathTracker {
diff --git a/src/csr.rs b/src/csr.rs
index a8ffcb0..8a75e3f 100644
--- a/src/csr.rs
+++ b/src/csr.rs
@@ -1,25 +1,21 @@
 //! Compressed Sparse Row (CSR) is a sparse adjacency matrix graph.
 
-use std::marker::PhantomData;
 use std::cmp::max;
-use std::ops::{Range, Index, IndexMut};
 use std::iter::{Enumerate, Zip};
+use std::marker::PhantomData;
+use std::ops::{Index, IndexMut, Range};
 use std::slice::Windows;
 
-use crate::visit::{EdgeRef, GraphBase, IntoNeighbors, NodeIndexable, IntoEdges};
-use crate::visit::{NodeCompactIndexable, IntoNodeIdentifiers, Visitable};
-use crate::visit::{Data, IntoEdgeReferences, NodeCount, GraphProp};
+use crate::visit::{Data, GraphProp, IntoEdgeReferences, NodeCount};
+use crate::visit::{EdgeRef, GraphBase, IntoEdges, IntoNeighbors, NodeIndexable};
+use crate::visit::{IntoNodeIdentifiers, NodeCompactIndexable, Visitable};
 
 use crate::util::zip;
 
 #[doc(no_inline)]
-pub use crate::graph::{IndexType, DefaultIx};
+pub use crate::graph::{DefaultIx, IndexType};
 
-use crate::{
-    EdgeType,
-    Directed,
-    IntoWeightedEdge,
-};
+use crate::{Directed, EdgeType, IntoWeightedEdge};
 
 /// Csr node index type, a plain integer.
 pub type NodeIndex<Ix = DefaultIx> = Ix;
@@ -60,8 +56,9 @@
 }
 
 impl<N, E, Ty, Ix> Default for Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn default() -> Self {
         Self::new()
@@ -82,8 +79,9 @@
 }
 
 impl<N, E, Ty, Ix> Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     /// Create an empty `Csr`.
     pub fn new() -> Self {
@@ -115,7 +113,8 @@
     /// assert_eq!(graph[4],0);
     /// ```
     pub fn with_nodes(n: usize) -> Self
-        where N: Default,
+    where
+        N: Default,
     {
         Csr {
             column: Vec::new(),
@@ -135,9 +134,9 @@
 }
 
 impl<N, E, Ix> Csr<N, E, Directed, Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
-
     /// Create a new `Csr` from a sorted sequence of edges
     ///
     /// Edges **must** be sorted and unique, where the sort order is the default
@@ -157,13 +156,17 @@
     /// ]);
     /// ```
     pub fn from_sorted_edges<Edge>(edges: &[Edge]) -> Result<Self, EdgesNotSorted>
-        where Edge: Clone + IntoWeightedEdge<E, NodeId=NodeIndex<Ix>>,
-              N: Default,
+    where
+        Edge: Clone + IntoWeightedEdge<E, NodeId = NodeIndex<Ix>>,
+        N: Default,
     {
-        let max_node_id = match edges.iter().map(|edge|
-            match edge.clone().into_weighted_edge() {
-                (x, y, _) => max(x.index(), y.index())
-            }).max() {
+        let max_node_id = match edges
+            .iter()
+            .map(|edge| match edge.clone().into_weighted_edge() {
+                (x, y, _) => max(x.index(), y.index()),
+            })
+            .max()
+        {
             None => return Ok(Self::with_nodes(0)),
             Some(x) => x,
         };
@@ -229,10 +232,10 @@
 }
 
 impl<N, E, Ty, Ix> Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
-
     pub fn node_count(&self) -> usize {
         self.row.len() - 1
     }
@@ -276,7 +279,8 @@
     ///
     /// **Panics** if `a` or `b` are out of bounds.
     pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> bool
-        where E: Clone,
+    where
+        E: Clone,
     {
         let ret = self.add_edge_(a, b, weight.clone());
         if ret && !self.is_directed() {
@@ -336,7 +340,11 @@
 
     fn neighbors_range(&self, a: NodeIndex<Ix>) -> Range<usize> {
         let index = self.row[a.index()];
-        let end = self.row.get(a.index() + 1).cloned().unwrap_or_else(|| self.column.len());
+        let end = self
+            .row
+            .get(a.index() + 1)
+            .cloned()
+            .unwrap_or_else(|| self.column.len());
         index..end
     }
 
@@ -408,35 +416,48 @@
     }
 }
 
-impl<'a, E, Ty, Ix: Copy> Copy for EdgeReference<'a, E, Ty, Ix> { }
+impl<'a, E, Ty, Ix: Copy> Copy for EdgeReference<'a, E, Ty, Ix> {}
 
 impl<'a, Ty, E, Ix> EdgeReference<'a, E, Ty, Ix>
-    where Ty: EdgeType,
+where
+    Ty: EdgeType,
 {
     /// Access the edge’s weight.
     ///
     /// **NOTE** that this method offers a longer lifetime
     /// than the trait (unfortunately they don't match yet).
-    pub fn weight(&self) -> &'a E { self.weight }
+    pub fn weight(&self) -> &'a E {
+        self.weight
+    }
 }
 
 impl<'a, E, Ty, Ix> EdgeRef for EdgeReference<'a, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type NodeId = NodeIndex<Ix>;
     type EdgeId = EdgeIndex;
     type Weight = E;
 
-    fn source(&self) -> Self::NodeId { self.source }
-    fn target(&self) -> Self::NodeId { self.target }
-    fn weight(&self) -> &E { self.weight }
-    fn id(&self) -> Self::EdgeId { self.index }
+    fn source(&self) -> Self::NodeId {
+        self.source
+    }
+    fn target(&self) -> Self::NodeId {
+        self.target
+    }
+    fn weight(&self) -> &E {
+        self.weight
+    }
+    fn id(&self) -> Self::EdgeId {
+        self.index
+    }
 }
 
 impl<'a, E, Ty, Ix> Iterator for Edges<'a, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Item = EdgeReference<'a, E, Ty, Ix>;
     fn next(&mut self) -> Option<Self::Item> {
@@ -455,16 +476,18 @@
 }
 
 impl<N, E, Ty, Ix> Data for Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type NodeWeight = N;
     type EdgeWeight = E;
 }
 
 impl<'a, N, E, Ty, Ix> IntoEdgeReferences for &'a Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type EdgeRef = EdgeReference<'a, E, Ty, Ix>;
     type EdgeReferences = EdgeReferences<'a, E, Ty, Ix>;
@@ -492,8 +515,9 @@
 }
 
 impl<'a, E, Ty, Ix> Iterator for EdgeReferences<'a, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Item = EdgeReference<'a, E, Ty, Ix>;
     fn next(&mut self) -> Option<Self::Item> {
@@ -507,7 +531,7 @@
                     target: j,
                     weight: w,
                     ty: PhantomData,
-                })
+                });
             }
             if let Some((i, w)) = self.edge_ranges.next() {
                 let a = w[0];
@@ -522,8 +546,9 @@
 }
 
 impl<'a, N, E, Ty, Ix> IntoEdges for &'a Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Edges = Edges<'a, E, Ty, Ix>;
     fn edges(self, a: Self::NodeId) -> Self::Edges {
@@ -532,8 +557,9 @@
 }
 
 impl<N, E, Ty, Ix> GraphBase for Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type NodeId = NodeIndex<Ix>;
     type EdgeId = EdgeIndex; // index into edges vector
@@ -542,8 +568,9 @@
 use fixedbitset::FixedBitSet;
 
 impl<N, E, Ty, Ix> Visitable for Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Map = FixedBitSet;
     fn visit_map(&self) -> FixedBitSet {
@@ -563,7 +590,8 @@
 }
 
 impl<'a, Ix> Iterator for Neighbors<'a, Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     type Item = NodeIndex<Ix>;
 
@@ -577,8 +605,9 @@
 }
 
 impl<'a, N, E, Ty, Ix> IntoNeighbors for &'a Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Neighbors = Neighbors<'a, Ix>;
 
@@ -597,23 +626,32 @@
 }
 
 impl<N, E, Ty, Ix> NodeIndexable for Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
-    fn node_bound(&self) -> usize { self.node_count() }
-    fn to_index(&self, a: Self::NodeId) -> usize { a.index() }
-    fn from_index(&self, ix: usize) -> Self::NodeId { Ix::new(ix) }
+    fn node_bound(&self) -> usize {
+        self.node_count()
+    }
+    fn to_index(&self, a: Self::NodeId) -> usize {
+        a.index()
+    }
+    fn from_index(&self, ix: usize) -> Self::NodeId {
+        Ix::new(ix)
+    }
 }
 
 impl<N, E, Ty, Ix> NodeCompactIndexable for Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
 }
 
 impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Output = N;
 
@@ -623,8 +661,9 @@
 }
 
 impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn index_mut(&mut self, ix: NodeIndex<Ix>) -> &mut N {
         &mut self.node_weights[ix.index()]
@@ -637,7 +676,8 @@
 }
 
 impl<Ix> Iterator for NodeIdentifiers<Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     type Item = NodeIndex<Ix>;
 
@@ -651,8 +691,9 @@
 }
 
 impl<'a, N, E, Ty, Ix> IntoNodeIdentifiers for &'a Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type NodeIdentifiers = NodeIdentifiers<Ix>;
     fn node_identifiers(self) -> Self::NodeIdentifiers {
@@ -664,8 +705,9 @@
 }
 
 impl<N, E, Ty, Ix> NodeCount for Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn node_count(&self) -> usize {
         (*self).node_count()
@@ -673,8 +715,9 @@
 }
 
 impl<N, E, Ty, Ix> GraphProp for Csr<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type EdgeType = Ty;
 }
@@ -696,11 +739,11 @@
 #[cfg(test)]
 mod tests {
     use super::Csr;
-    use crate::Undirected;
+    use crate::algo::bellman_ford;
+    use crate::algo::tarjan_scc;
     use crate::visit::Dfs;
     use crate::visit::VisitMap;
-    use crate::algo::tarjan_scc;
-    use crate::algo::bellman_ford;
+    use crate::Undirected;
 
     #[test]
     fn csr1() {
@@ -727,11 +770,11 @@
 
     #[test]
     fn csr_undirected() {
-    /*
-        [ 1 . 1
-          . . 1
-          1 1 1 ]
-     */
+        /*
+           [ 1 . 1
+             . . 1
+             1 1 1 ]
+        */
 
         let mut m: Csr<(), (), Undirected> = Csr::with_nodes(3);
         m.add_edge(0, 0, ());
@@ -749,11 +792,7 @@
     #[test]
     fn csr_from_error_1() {
         // not sorted in source
-        let m: Csr = Csr::from_sorted_edges(&[
-            (0, 1),
-            (1, 0),
-            (0, 2),
-        ]).unwrap();
+        let m: Csr = Csr::from_sorted_edges(&[(0, 1), (1, 0), (0, 2)]).unwrap();
         println!("{:?}", m);
     }
 
@@ -761,25 +800,14 @@
     #[test]
     fn csr_from_error_2() {
         // not sorted in target
-        let m: Csr = Csr::from_sorted_edges(&[
-            (0, 1),
-            (1, 0),
-            (1, 2),
-            (1, 1),
-        ]).unwrap();
+        let m: Csr = Csr::from_sorted_edges(&[(0, 1), (1, 0), (1, 2), (1, 1)]).unwrap();
         println!("{:?}", m);
     }
 
     #[test]
     fn csr_from() {
-        let m: Csr = Csr::from_sorted_edges(&[
-            (0, 1),
-            (0, 2),
-            (1, 0),
-            (1, 1),
-            (2, 2),
-            (2, 4),
-        ]).unwrap();
+        let m: Csr =
+            Csr::from_sorted_edges(&[(0, 1), (0, 2), (1, 0), (1, 1), (2, 2), (2, 4)]).unwrap();
         println!("{:?}", m);
         assert_eq!(m.neighbors_slice(0), &[1, 2]);
         assert_eq!(m.neighbors_slice(1), &[0, 1]);
@@ -797,15 +825,14 @@
             (1, 1),
             (1, 3),
             (2, 2),
-
             // disconnected subgraph
             (4, 4),
             (4, 5),
-        ]).unwrap();
+        ])
+        .unwrap();
         println!("{:?}", m);
         let mut dfs = Dfs::new(&m, 0);
-        while let Some(_) = dfs.next(&m) {
-        }
+        while let Some(_) = dfs.next(&m) {}
         for i in 0..m.node_count() - 2 {
             assert!(dfs.discovered.is_visited(&i), "visited {}", i)
         }
@@ -817,8 +844,7 @@
 
         dfs.reset(&m);
         dfs.move_to(0);
-        while let Some(_) = dfs.next(&m) {
-        }
+        while let Some(_) = dfs.next(&m) {}
 
         for i in 0..m.node_count() {
             assert!(dfs.discovered[i], "visited {}", i)
@@ -838,7 +864,8 @@
             (4, 4),
             (4, 5),
             (5, 2),
-        ]).unwrap();
+        ])
+        .unwrap();
         println!("{:?}", m);
         println!("{:?}", tarjan_scc(&m));
     }
@@ -853,12 +880,12 @@
             (1, 2, 1.),
             (1, 3, 1.),
             (2, 3, 3.),
-
             (4, 5, 1.),
             (5, 7, 2.),
             (6, 7, 1.),
             (7, 8, 3.),
-        ]).unwrap();
+        ])
+        .unwrap();
         println!("{:?}", m);
         let result = bellman_ford(&m, 0).unwrap();
         println!("{:?}", result);
@@ -877,7 +904,8 @@
             (1, 2, 1.),
             (1, 3, 1.),
             (2, 3, 3.),
-        ]).unwrap();
+        ])
+        .unwrap();
         let result = bellman_ford(&m, 0);
         assert!(result.is_err());
     }
@@ -894,12 +922,12 @@
             (1, 2, 1.),
             (1, 3, 1.),
             (2, 3, 3.),
-
             (4, 5, 1.),
             (5, 7, 2.),
             (6, 7, 1.),
             (7, 8, 3.),
-        ]).unwrap();
+        ])
+        .unwrap();
         let mut copy = Vec::new();
         for e in m.edge_references() {
             copy.push((e.source(), e.target(), *e.weight()));
diff --git a/src/data.rs b/src/data.rs
index bfe528d..7bb5411 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -1,23 +1,15 @@
 //! Graph traits for associated data and graph construction.
 
-
-use crate::Graph;
-#[cfg(feature = "stable_graph")]
-use crate::stable_graph::StableGraph;
-use crate::{
-    EdgeType,
-};
 use crate::graph::IndexType;
 #[cfg(feature = "graphmap")]
 use crate::graphmap::{GraphMap, NodeTrait};
-use crate::visit::{
-    Data,
-    NodeCount,
-    NodeIndexable,
-    Reversed,
-};
+#[cfg(feature = "stable_graph")]
+use crate::stable_graph::StableGraph;
+use crate::visit::{Data, NodeCount, NodeIndexable, Reversed};
+use crate::EdgeType;
+use crate::Graph;
 
-trait_template!{
+trait_template! {
     /// Access node and edge weights (associated data).
 pub trait DataMap : Data {
     @section self
@@ -27,12 +19,14 @@
 }
 
 macro_rules! access0 {
-    ($e:expr) => ($e.0);
+    ($e:expr) => {
+        $e.0
+    };
 }
 
-DataMap!{delegate_impl []}
-DataMap!{delegate_impl [['a, G], G, &'a mut G, deref_twice]}
-DataMap!{delegate_impl [[G], G, Reversed<G>, access0]}
+DataMap! {delegate_impl []}
+DataMap! {delegate_impl [['a, G], G, &'a mut G, deref_twice]}
+DataMap! {delegate_impl [[G], G, Reversed<G>, access0]}
 
 trait_template! {
     /// Access node and edge weights mutably.
@@ -43,43 +37,49 @@
 }
 }
 
-DataMapMut!{delegate_impl [['a, G], G, &'a mut G, deref_twice]}
-DataMapMut!{delegate_impl [[G], G, Reversed<G>, access0]}
+DataMapMut! {delegate_impl [['a, G], G, &'a mut G, deref_twice]}
+DataMapMut! {delegate_impl [[G], G, Reversed<G>, access0]}
 
 /// A graph that can be extended with further nodes and edges
-pub trait Build : Data + NodeCount {
+pub trait Build: Data + NodeCount {
     fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId;
     /// Add a new edge. If parallel edges (duplicate) are not allowed and
     /// the edge already exists, return `None`.
-    fn add_edge(&mut self,
-                a: Self::NodeId,
-                b: Self::NodeId,
-                weight: Self::EdgeWeight) -> Option<Self::EdgeId> {
+    fn add_edge(
+        &mut self,
+        a: Self::NodeId,
+        b: Self::NodeId,
+        weight: Self::EdgeWeight,
+    ) -> Option<Self::EdgeId> {
         Some(self.update_edge(a, b, weight))
     }
     /// Add or update the edge from `a` to `b`. Return the id of the affected
     /// edge.
-    fn update_edge(&mut self,
-                   a: Self::NodeId,
-                   b: Self::NodeId,
-                   weight: Self::EdgeWeight) -> Self::EdgeId;
+    fn update_edge(
+        &mut self,
+        a: Self::NodeId,
+        b: Self::NodeId,
+        weight: Self::EdgeWeight,
+    ) -> Self::EdgeId;
 }
 
 /// A graph that can be created
-pub trait Create : Build + Default {
+pub trait Create: Build + Default {
     fn with_capacity(nodes: usize, edges: usize) -> Self;
 }
 
 impl<N, E, Ty, Ix> Data for Graph<N, E, Ty, Ix>
-    where Ix: IndexType
+where
+    Ix: IndexType,
 {
     type NodeWeight = N;
     type EdgeWeight = E;
 }
 
 impl<N, E, Ty, Ix> DataMap for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn node_weight(&self, id: Self::NodeId) -> Option<&Self::NodeWeight> {
         self.node_weight(id)
@@ -90,8 +90,9 @@
 }
 
 impl<N, E, Ty, Ix> DataMapMut for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn node_weight_mut(&mut self, id: Self::NodeId) -> Option<&mut Self::NodeWeight> {
         self.node_weight_mut(id)
@@ -103,8 +104,9 @@
 
 #[cfg(feature = "stable_graph")]
 impl<N, E, Ty, Ix> DataMap for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn node_weight(&self, id: Self::NodeId) -> Option<&Self::NodeWeight> {
         self.node_weight(id)
@@ -116,8 +118,9 @@
 
 #[cfg(feature = "stable_graph")]
 impl<N, E, Ty, Ix> DataMapMut for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn node_weight_mut(&mut self, id: Self::NodeId) -> Option<&mut Self::NodeWeight> {
         self.node_weight_mut(id)
@@ -128,65 +131,73 @@
 }
 
 impl<N, E, Ty, Ix> Build for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId {
         self.add_node(weight)
     }
-    fn add_edge(&mut self,
-                a: Self::NodeId,
-                b: Self::NodeId,
-                weight: Self::EdgeWeight) -> Option<Self::EdgeId>
-    {
+    fn add_edge(
+        &mut self,
+        a: Self::NodeId,
+        b: Self::NodeId,
+        weight: Self::EdgeWeight,
+    ) -> Option<Self::EdgeId> {
         Some(self.add_edge(a, b, weight))
     }
-    fn update_edge(&mut self,
-                   a: Self::NodeId,
-                   b: Self::NodeId,
-                   weight: Self::EdgeWeight) -> Self::EdgeId
-    {
+    fn update_edge(
+        &mut self,
+        a: Self::NodeId,
+        b: Self::NodeId,
+        weight: Self::EdgeWeight,
+    ) -> Self::EdgeId {
         self.update_edge(a, b, weight)
     }
 }
 
 #[cfg(feature = "stable_graph")]
 impl<N, E, Ty, Ix> Build for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId {
         self.add_node(weight)
     }
-    fn add_edge(&mut self,
-                a: Self::NodeId,
-                b: Self::NodeId,
-                weight: Self::EdgeWeight) -> Option<Self::EdgeId>
-    {
+    fn add_edge(
+        &mut self,
+        a: Self::NodeId,
+        b: Self::NodeId,
+        weight: Self::EdgeWeight,
+    ) -> Option<Self::EdgeId> {
         Some(self.add_edge(a, b, weight))
     }
-    fn update_edge(&mut self,
-                   a: Self::NodeId,
-                   b: Self::NodeId,
-                   weight: Self::EdgeWeight) -> Self::EdgeId
-    {
+    fn update_edge(
+        &mut self,
+        a: Self::NodeId,
+        b: Self::NodeId,
+        weight: Self::EdgeWeight,
+    ) -> Self::EdgeId {
         self.update_edge(a, b, weight)
     }
 }
 
 #[cfg(feature = "graphmap")]
 impl<N, E, Ty> Build for GraphMap<N, E, Ty>
-    where Ty: EdgeType,
-          N: NodeTrait,
+where
+    Ty: EdgeType,
+    N: NodeTrait,
 {
     fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId {
         self.add_node(weight)
     }
-    fn add_edge(&mut self,
-                a: Self::NodeId,
-                b: Self::NodeId,
-                weight: Self::EdgeWeight) -> Option<Self::EdgeId>
-    {
+    fn add_edge(
+        &mut self,
+        a: Self::NodeId,
+        b: Self::NodeId,
+        weight: Self::EdgeWeight,
+    ) -> Option<Self::EdgeId> {
         if self.contains_edge(a, b) {
             None
         } else {
@@ -195,20 +206,21 @@
             Some((a, b))
         }
     }
-    fn update_edge(&mut self,
-                   a: Self::NodeId,
-                   b: Self::NodeId,
-                   weight: Self::EdgeWeight) -> Self::EdgeId
-    {
+    fn update_edge(
+        &mut self,
+        a: Self::NodeId,
+        b: Self::NodeId,
+        weight: Self::EdgeWeight,
+    ) -> Self::EdgeId {
         self.add_edge(a, b, weight);
         (a, b)
     }
 }
 
-
 impl<N, E, Ty, Ix> Create for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn with_capacity(nodes: usize, edges: usize) -> Self {
         Self::with_capacity(nodes, edges)
@@ -217,8 +229,9 @@
 
 #[cfg(feature = "stable_graph")]
 impl<N, E, Ty, Ix> Create for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn with_capacity(nodes: usize, edges: usize) -> Self {
         Self::with_capacity(nodes, edges)
@@ -227,8 +240,9 @@
 
 #[cfg(feature = "graphmap")]
 impl<N, E, Ty> Create for GraphMap<N, E, Ty>
-    where Ty: EdgeType,
-          N: NodeTrait,
+where
+    Ty: EdgeType,
+    N: NodeTrait,
 {
     fn with_capacity(nodes: usize, edges: usize) -> Self {
         Self::with_capacity(nodes, edges)
@@ -243,22 +257,21 @@
 #[derive(Clone, Debug, PartialEq, Eq)]
 pub enum Element<N, E> {
     /// A graph node.
-    Node {
-        weight: N,
-    },
+    Node { weight: N },
     /// A graph edge.
     Edge {
         source: usize,
         target: usize,
         weight: E,
-    }
+    },
 }
 
 /// Create a graph from an iterator of elements.
-pub trait FromElements : Create {
+pub trait FromElements: Create {
     fn from_elements<I>(iterable: I) -> Self
-        where Self: Sized,
-              I: IntoIterator<Item=Element<Self::NodeWeight, Self::EdgeWeight>>,
+    where
+        Self: Sized,
+        I: IntoIterator<Item = Element<Self::NodeWeight, Self::EdgeWeight>>,
     {
         let mut gr = Self::with_capacity(0, 0);
         // usize -> NodeId map
@@ -268,19 +281,23 @@
                 Element::Node { weight } => {
                     map.push(gr.add_node(weight));
                 }
-                Element::Edge { source, target, weight } => {
+                Element::Edge {
+                    source,
+                    target,
+                    weight,
+                } => {
                     gr.add_edge(map[source], map[target], weight);
                 }
             }
         }
         gr
     }
-        
 }
 
 fn from_elements_indexable<G, I>(iterable: I) -> G
-    where G: Create + NodeIndexable,
-          I: IntoIterator<Item=Element<G::NodeWeight, G::EdgeWeight>>,
+where
+    G: Create + NodeIndexable,
+    I: IntoIterator<Item = Element<G::NodeWeight, G::EdgeWeight>>,
 {
     let mut gr = G::with_capacity(0, 0);
     let map = |gr: &G, i| gr.from_index(i);
@@ -289,7 +306,11 @@
             Element::Node { weight } => {
                 gr.add_node(weight);
             }
-            Element::Edge { source, target, weight } => {
+            Element::Edge {
+                source,
+                target,
+                weight,
+            } => {
                 let from = map(&gr, source);
                 let to = map(&gr, target);
                 gr.add_edge(from, to, weight);
@@ -300,12 +321,14 @@
 }
 
 impl<N, E, Ty, Ix> FromElements for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn from_elements<I>(iterable: I) -> Self
-        where Self: Sized,
-              I: IntoIterator<Item=Element<Self::NodeWeight, Self::EdgeWeight>>,
+    where
+        Self: Sized,
+        I: IntoIterator<Item = Element<Self::NodeWeight, Self::EdgeWeight>>,
     {
         from_elements_indexable(iterable)
     }
@@ -313,12 +336,14 @@
 
 #[cfg(feature = "stable_graph")]
 impl<N, E, Ty, Ix> FromElements for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn from_elements<I>(iterable: I) -> Self
-        where Self: Sized,
-              I: IntoIterator<Item=Element<Self::NodeWeight, Self::EdgeWeight>>,
+    where
+        Self: Sized,
+        I: IntoIterator<Item = Element<Self::NodeWeight, Self::EdgeWeight>>,
     {
         from_elements_indexable(iterable)
     }
@@ -326,19 +351,21 @@
 
 #[cfg(feature = "graphmap")]
 impl<N, E, Ty> FromElements for GraphMap<N, E, Ty>
-    where Ty: EdgeType,
-          N: NodeTrait,
+where
+    Ty: EdgeType,
+    N: NodeTrait,
 {
     fn from_elements<I>(iterable: I) -> Self
-        where Self: Sized,
-              I: IntoIterator<Item=Element<Self::NodeWeight, Self::EdgeWeight>>,
+    where
+        Self: Sized,
+        I: IntoIterator<Item = Element<Self::NodeWeight, Self::EdgeWeight>>,
     {
         from_elements_indexable(iterable)
     }
 }
 
 /// Iterator adaptors for iterators of `Element`.
-pub trait ElementIterator<N, E> : Iterator<Item=Element<N, E>> {
+pub trait ElementIterator<N, E>: Iterator<Item = Element<N, E>> {
     /// Create an iterator adaptor that filters graph elements.
     ///
     /// The function `f` is called with each element and if its return value
@@ -349,8 +376,9 @@
     /// This filter adapts the edge source and target indices in the
     /// stream so that they are correct after the removals.
     fn filter_elements<F>(self, f: F) -> FilterElements<Self, F>
-        where Self: Sized,
-              F: FnMut(Element<&mut N, &mut E>) -> bool,
+    where
+        Self: Sized,
+        F: FnMut(Element<&mut N, &mut E>) -> bool,
     {
         FilterElements {
             iter: self,
@@ -361,8 +389,7 @@
     }
 }
 
-impl<N, E, I: ?Sized> ElementIterator<N, E> for I
-    where I: Iterator<Item=Element<N, E>> { }
+impl<N, E, I: ?Sized> ElementIterator<N, E> for I where I: Iterator<Item = Element<N, E>> {}
 
 /// An iterator that filters graph elements.
 ///
@@ -377,8 +404,9 @@
 }
 
 impl<I, F, N, E> Iterator for FilterElements<I, F>
-    where I: Iterator<Item=Element<N, E>>,
-          F: FnMut(Element<&mut N, &mut E>) -> bool,
+where
+    I: Iterator<Item = Element<N, E>>,
+    F: FnMut(Element<&mut N, &mut E>) -> bool,
 {
     type Item = Element<N, E>;
 
@@ -390,10 +418,21 @@
             };
             let keep = (self.f)(match elt {
                 Element::Node { ref mut weight } => Element::Node { weight },
-                Element::Edge { source, target, ref mut weight }
-                    => Element::Edge { source, target, weight },
+                Element::Edge {
+                    source,
+                    target,
+                    ref mut weight,
+                } => Element::Edge {
+                    source,
+                    target,
+                    weight,
+                },
             });
-            let is_node = if let Element::Node { .. } = elt { true } else { false };
+            let is_node = if let Element::Node { .. } = elt {
+                true
+            } else {
+                false
+            };
             if !keep && is_node {
                 self.map.push(self.node_index);
             }
@@ -427,7 +466,7 @@
                         Err(i) => *target -= i,
                     }
                 }
-                Element::Node { .. } => { }
+                Element::Node { .. } => {}
             }
             return Some(elt);
         }
diff --git a/src/dijkstra.rs b/src/dijkstra.rs
index b856e60..77852b9 100644
--- a/src/dijkstra.rs
+++ b/src/dijkstra.rs
@@ -1,22 +1,11 @@
-use std::collections::{
-    HashMap,
-    BinaryHeap,
-};
-use std::collections::hash_map::Entry::{
-    Occupied,
-    Vacant,
-};
+use std::collections::hash_map::Entry::{Occupied, Vacant};
+use std::collections::{BinaryHeap, HashMap};
 
 use std::hash::Hash;
 
-use crate::scored::MinScored;
-use super::visit::{
-    Visitable,
-    VisitMap,
-    IntoEdges,
-    EdgeRef,
-};
+use super::visit::{EdgeRef, IntoEdges, VisitMap, Visitable};
 use crate::algo::Measure;
+use crate::scored::MinScored;
 
 /// \[Generic\] Dijkstra's shortest path algorithm.
 ///
@@ -80,13 +69,17 @@
 /// assert_eq!(res, expected_res);
 /// // z is not inside res because there is not path from b to z.
 /// ```
-pub fn dijkstra<G, F, K>(graph: G, start: G::NodeId, goal: Option<G::NodeId>,
-                         mut edge_cost: F)
-    -> HashMap<G::NodeId, K>
-    where G: IntoEdges + Visitable,
-          G::NodeId: Eq + Hash,
-          F: FnMut(G::EdgeRef) -> K,
-          K: Measure + Copy,
+pub fn dijkstra<G, F, K>(
+    graph: G,
+    start: G::NodeId,
+    goal: Option<G::NodeId>,
+    mut edge_cost: F,
+) -> HashMap<G::NodeId, K>
+where
+    G: IntoEdges + Visitable,
+    G::NodeId: Eq + Hash,
+    F: FnMut(G::EdgeRef) -> K,
+    K: Measure + Copy,
 {
     let mut visited = graph.visit_map();
     let mut scores = HashMap::new();
@@ -97,24 +90,26 @@
     visit_next.push(MinScored(zero_score, start));
     while let Some(MinScored(node_score, node)) = visit_next.pop() {
         if visited.is_visited(&node) {
-            continue
+            continue;
         }
         if goal.as_ref() == Some(&node) {
-            break
+            break;
         }
         for edge in graph.edges(node) {
             let next = edge.target();
             if visited.is_visited(&next) {
-                continue
+                continue;
             }
             let mut next_score = node_score + edge_cost(edge);
             match scores.entry(next) {
-                Occupied(ent) => if next_score < *ent.get() {
-                    *ent.into_mut() = next_score;
+                Occupied(ent) => {
+                    if next_score < *ent.get() {
+                        *ent.into_mut() = next_score;
                     //predecessor.insert(next.clone(), node.clone());
-                } else {
-                    next_score = *ent.get();
-                },
+                    } else {
+                        next_score = *ent.get();
+                    }
+                }
                 Vacant(ent) => {
                     ent.insert(next_score);
                     //predecessor.insert(next.clone(), node.clone());
diff --git a/src/dot.rs b/src/dot.rs
index 3ee079e..b9f44dc 100644
--- a/src/dot.rs
+++ b/src/dot.rs
@@ -2,7 +2,7 @@
 
 use std::fmt::{self, Display, Write};
 
-use crate::visit::{GraphRef};
+use crate::visit::GraphRef;
 
 /// `Dot` implements output to graphviz .dot format for a graph.
 ///
@@ -54,7 +54,10 @@
 static EDGE: [&str; 2] = ["--", "->"];
 static INDENT: &str = "    ";
 
-impl<'a, G> Dot<'a, G> where G: GraphRef {
+impl<'a, G> Dot<'a, G>
+where
+    G: GraphRef,
+{
     /// Create a `Dot` formatting wrapper with default configuration.
     pub fn new(graph: G) -> Self {
         Self::with_config(graph, &[])
@@ -62,10 +65,7 @@
 
     /// Create a `Dot` formatting wrapper with custom configuration.
     pub fn with_config(graph: G, config: &'a [Config]) -> Self {
-        Dot {
-            graph,
-            config,
-        }
+        Dot { graph, config }
     }
 }
 
@@ -86,18 +86,23 @@
     _Incomplete(()),
 }
 
-use crate::visit::{ IntoNodeReferences, NodeIndexable, IntoEdgeReferences, EdgeRef};
-use crate::visit::{ Data, NodeRef, GraphProp, };
+use crate::visit::{Data, GraphProp, NodeRef};
+use crate::visit::{EdgeRef, IntoEdgeReferences, IntoNodeReferences, NodeIndexable};
 
-impl<'a, G> Dot<'a, G>
-{
-    fn graph_fmt<NF, EF, NW, EW>(&self, g: G, f: &mut fmt::Formatter,
-                    mut node_fmt: NF, mut edge_fmt: EF) -> fmt::Result
-        where G: NodeIndexable + IntoNodeReferences + IntoEdgeReferences,
-              G: GraphProp,
-              G: Data<NodeWeight=NW, EdgeWeight=EW>,
-              NF: FnMut(&NW, &mut dyn FnMut(&dyn Display) -> fmt::Result) -> fmt::Result,
-              EF: FnMut(&EW, &mut dyn FnMut(&dyn Display) -> fmt::Result) -> fmt::Result,
+impl<'a, G> Dot<'a, G> {
+    fn graph_fmt<NF, EF, NW, EW>(
+        &self,
+        g: G,
+        f: &mut fmt::Formatter,
+        mut node_fmt: NF,
+        mut edge_fmt: EF,
+    ) -> fmt::Result
+    where
+        G: NodeIndexable + IntoNodeReferences + IntoEdgeReferences,
+        G: GraphProp,
+        G: Data<NodeWeight = NW, EdgeWeight = EW>,
+        NF: FnMut(&NW, &mut dyn FnMut(&dyn Display) -> fmt::Result) -> fmt::Result,
+        EF: FnMut(&EW, &mut dyn FnMut(&dyn Display) -> fmt::Result) -> fmt::Result,
     {
         if !self.config.contains(&Config::GraphContentOnly) {
             writeln!(f, "{} {{", TYPE[g.is_directed() as usize])?;
@@ -113,15 +118,17 @@
                 node_fmt(node.weight(), &mut |d| Escaped(d).fmt(f))?;
                 writeln!(f, "\"]")?;
             }
-
         }
         // output all edges
         for (i, edge) in g.edge_references().enumerate() {
-            write!(f, "{}{} {} {}",
-                        INDENT,
-                        g.to_index(edge.source()),
-                        EDGE[g.is_directed() as usize],
-                        g.to_index(edge.target()))?;
+            write!(
+                f,
+                "{}{} {} {}",
+                INDENT,
+                g.to_index(edge.source()),
+                EDGE[g.is_directed() as usize],
+                g.to_index(edge.target())
+            )?;
             if self.config.contains(&Config::EdgeNoLabel) {
                 writeln!(f)?;
             } else if self.config.contains(&Config::EdgeIndexLabel) {
@@ -141,9 +148,10 @@
 }
 
 impl<'a, G> fmt::Display for Dot<'a, G>
-    where G: IntoEdgeReferences + IntoNodeReferences + NodeIndexable + GraphProp,
-          G::EdgeWeight: fmt::Display,
-          G::NodeWeight: fmt::Display,
+where
+    G: IntoEdgeReferences + IntoNodeReferences + NodeIndexable + GraphProp,
+    G::EdgeWeight: fmt::Display,
+    G::NodeWeight: fmt::Display,
 {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         self.graph_fmt(self.graph, f, |n, cb| cb(n), |e, cb| cb(e))
@@ -151,14 +159,18 @@
 }
 
 impl<'a, G> fmt::Debug for Dot<'a, G>
-    where G: IntoEdgeReferences + IntoNodeReferences + NodeIndexable + GraphProp,
-          G::EdgeWeight: fmt::Debug,
-          G::NodeWeight: fmt::Debug,
+where
+    G: IntoEdgeReferences + IntoNodeReferences + NodeIndexable + GraphProp,
+    G::EdgeWeight: fmt::Debug,
+    G::NodeWeight: fmt::Debug,
 {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        self.graph_fmt(self.graph, f,
-                       |n, cb| cb(&DebugFmt(n)),
-                       |e, cb| cb(&DebugFmt(e)))
+        self.graph_fmt(
+            self.graph,
+            f,
+            |n, cb| cb(&DebugFmt(n)),
+            |e, cb| cb(&DebugFmt(e)),
+        )
     }
 }
 
@@ -166,7 +178,8 @@
 struct Escaper<W>(W);
 
 impl<W> fmt::Write for Escaper<W>
-    where W: fmt::Write
+where
+    W: fmt::Write,
 {
     fn write_str(&mut self, s: &str) -> fmt::Result {
         for c in s.chars() {
@@ -190,7 +203,8 @@
 struct Escaped<T>(T);
 
 impl<T> fmt::Display for Escaped<T>
-    where T: fmt::Display
+where
+    T: fmt::Display,
 {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         if f.alternate() {
@@ -205,7 +219,8 @@
 struct DebugFmt<T>(T);
 
 impl<T> fmt::Display for DebugFmt<T>
-    where T: fmt::Debug
+where
+    T: fmt::Debug,
 {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         self.0.fmt(f)
diff --git a/src/generate.rs b/src/generate.rs
index e717239..9dc7dbf 100644
--- a/src/generate.rs
+++ b/src/generate.rs
@@ -3,8 +3,8 @@
 //! ***Unstable: API may change at any time.*** Depends on `feature = "generate"`.
 //!
 
-use crate::{Graph, Directed, EdgeType};
 use crate::graph::NodeIndex;
+use crate::{Directed, EdgeType, Graph};
 
 // A DAG has the property that the adjacency matrix is lower triangular,
 // diagonal zero.
@@ -46,7 +46,7 @@
             acyclic: true,
             selfloops: false,
             nodes: nodes,
-            nedges:nedges,
+            nedges: nedges,
             bits: !0,
             g: Graph::with_capacity(nodes, nedges),
         }
@@ -92,7 +92,11 @@
         // d 3 4 5 x
         let mut bit = 0;
         for i in 0..self.nodes {
-            let start = if self.acyclic || !self.g.is_directed() { i } else { 0 };
+            let start = if self.acyclic || !self.g.is_directed() {
+                i
+            } else {
+                0
+            };
             for j in start..self.nodes {
                 if i == j && !self.selfloops {
                     continue;
diff --git a/src/graph_impl/frozen.rs b/src/graph_impl/frozen.rs
index bb96618..1ba06d9 100644
--- a/src/graph_impl/frozen.rs
+++ b/src/graph_impl/frozen.rs
@@ -1,18 +1,15 @@
-
 use std::ops::{Deref, Index, IndexMut};
 
-use crate::graph::Graph;
 use super::Frozen;
-use crate::graph::{IndexType, GraphIndex};
-use crate::{
-    Direction,
-    EdgeType,
-};
-use crate::visit::{Data, IntoNodeIdentifiers, GraphProp, NodeIndexable, IntoNeighborsDirected};
-use crate::visit::{IntoNeighbors, IntoNodeReferences, IntoEdgeReferences, Visitable};
-use crate::visit::{NodeCompactIndexable, GetAdjacencyMatrix, NodeCount, IntoEdges, IntoEdgesDirected};
 use crate::data::{DataMap, DataMapMut};
-
+use crate::graph::Graph;
+use crate::graph::{GraphIndex, IndexType};
+use crate::visit::{Data, GraphProp, IntoNeighborsDirected, IntoNodeIdentifiers, NodeIndexable};
+use crate::visit::{
+    GetAdjacencyMatrix, IntoEdges, IntoEdgesDirected, NodeCompactIndexable, NodeCount,
+};
+use crate::visit::{IntoEdgeReferences, IntoNeighbors, IntoNodeReferences, Visitable};
+use crate::{Direction, EdgeType};
 
 impl<'a, G> Frozen<'a, G> {
     /// Create a new `Frozen` from a mutable reference to a graph.
@@ -25,61 +22,75 @@
 /// functionality in the underlying graph.
 impl<'a, G> Deref for Frozen<'a, G> {
     type Target = G;
-    fn deref(&self) -> &G { self.0 }
+    fn deref(&self) -> &G {
+        self.0
+    }
 }
 
 impl<'a, G, I> Index<I> for Frozen<'a, G>
-    where G: Index<I>
+where
+    G: Index<I>,
 {
     type Output = G::Output;
-    fn index(&self, i: I) -> &G::Output { self.0.index(i) }
+    fn index(&self, i: I) -> &G::Output {
+        self.0.index(i)
+    }
 }
 
 impl<'a, G, I> IndexMut<I> for Frozen<'a, G>
-    where G: IndexMut<I>
+where
+    G: IndexMut<I>,
 {
-    fn index_mut(&mut self, i: I) -> &mut G::Output { self.0.index_mut(i) }
+    fn index_mut(&mut self, i: I) -> &mut G::Output {
+        self.0.index_mut(i)
+    }
 }
 
 impl<'a, N, E, Ty, Ix> Frozen<'a, Graph<N, E, Ty, Ix>>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     /// Index the `Graph` by two indices, any combination of
     /// node or edge indices is fine.
     ///
     /// **Panics** if the indices are equal or if they are out of bounds.
-    pub fn index_twice_mut<T, U>(&mut self, i: T, j: U)
-        -> (&mut <Graph<N, E, Ty, Ix> as Index<T>>::Output,
-            &mut <Graph<N, E, Ty, Ix> as Index<U>>::Output)
-        where Graph<N, E, Ty, Ix>: IndexMut<T> + IndexMut<U>,
-              T: GraphIndex,
-              U: GraphIndex,
+    pub fn index_twice_mut<T, U>(
+        &mut self,
+        i: T,
+        j: U,
+    ) -> (
+        &mut <Graph<N, E, Ty, Ix> as Index<T>>::Output,
+        &mut <Graph<N, E, Ty, Ix> as Index<U>>::Output,
+    )
+    where
+        Graph<N, E, Ty, Ix>: IndexMut<T> + IndexMut<U>,
+        T: GraphIndex,
+        U: GraphIndex,
     {
         self.0.index_twice_mut(i, j)
     }
 }
 
 macro_rules! access0 {
-    ($e:expr) => ($e.0);
+    ($e:expr) => {
+        $e.0
+    };
 }
 
-Data!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-DataMap!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-DataMapMut!{delegate_impl [['a, G], G, Frozen<'a, G>, access0]}
-GetAdjacencyMatrix!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-IntoEdgeReferences!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-IntoEdges!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-IntoEdgesDirected!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-IntoNeighbors!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-IntoNeighborsDirected!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-IntoNodeIdentifiers!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-IntoNodeReferences!{delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
-NodeCompactIndexable!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-NodeCount!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-NodeIndexable!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-GraphProp!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-Visitable!{delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
-
-
-
+Data! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+DataMap! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+DataMapMut! {delegate_impl [['a, G], G, Frozen<'a, G>, access0]}
+GetAdjacencyMatrix! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+IntoEdgeReferences! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+IntoEdges! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+IntoEdgesDirected! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+IntoNeighbors! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+IntoNeighborsDirected! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+IntoNodeIdentifiers! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+IntoNodeReferences! {delegate_impl [['a, 'b, G], G, &'b Frozen<'a, G>, deref_twice]}
+NodeCompactIndexable! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+NodeCount! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+NodeIndexable! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+GraphProp! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
+Visitable! {delegate_impl [['a, G], G, Frozen<'a, G>, deref_twice]}
diff --git a/src/graph_impl/mod.rs b/src/graph_impl/mod.rs
index 0d7a2ed..9fb43b3 100644
--- a/src/graph_impl/mod.rs
+++ b/src/graph_impl/mod.rs
@@ -7,28 +7,17 @@
 use std::ops::{Index, IndexMut, Range};
 use std::slice;
 
-use crate::{
-    Direction, Outgoing, Incoming,
-    Undirected,
-    Directed,
-    EdgeType,
-    IntoWeightedEdge,
-};
+use crate::{Directed, Direction, EdgeType, Incoming, IntoWeightedEdge, Outgoing, Undirected};
 
-use crate::iter_format::{
-    IterFormatExt,
-    NoPretty,
-    DebugMap,
-};
+use crate::iter_format::{DebugMap, IterFormatExt, NoPretty};
 
-use crate::visit::EdgeRef;
-use crate::visit::{IntoNodeReferences, IntoEdges, IntoEdgesDirected};
 use crate::util::enumerate;
+use crate::visit::EdgeRef;
+use crate::visit::{IntoEdges, IntoEdgesDirected, IntoNodeReferences};
 
 #[cfg(feature = "serde-1")]
 mod serialization;
 
-
 /// The default integer type for graph indices.
 /// `u32` is the default to reduce the size of the graph's data and improve
 /// performance in the common case.
@@ -41,8 +30,7 @@
 ///
 /// Marked `unsafe` because: the trait must faithfully preserve
 /// and convert index values.
-pub unsafe trait IndexType : Copy + Default + Hash + Ord + fmt::Debug + 'static
-{
+pub unsafe trait IndexType: Copy + Default + Hash + Ord + fmt::Debug + 'static {
     fn new(x: usize) -> Self;
     fn index(&self) -> usize;
     fn max() -> Self;
@@ -50,60 +38,81 @@
 
 unsafe impl IndexType for usize {
     #[inline(always)]
-    fn new(x: usize) -> Self { x }
+    fn new(x: usize) -> Self {
+        x
+    }
     #[inline(always)]
-    fn index(&self) -> Self { *self }
+    fn index(&self) -> Self {
+        *self
+    }
     #[inline(always)]
-    fn max() -> Self { ::std::usize::MAX }
+    fn max() -> Self {
+        ::std::usize::MAX
+    }
 }
 
 unsafe impl IndexType for u32 {
     #[inline(always)]
-    fn new(x: usize) -> Self { x as u32 }
+    fn new(x: usize) -> Self {
+        x as u32
+    }
     #[inline(always)]
-    fn index(&self) -> usize { *self as usize }
+    fn index(&self) -> usize {
+        *self as usize
+    }
     #[inline(always)]
-    fn max() -> Self { ::std::u32::MAX }
+    fn max() -> Self {
+        ::std::u32::MAX
+    }
 }
 
 unsafe impl IndexType for u16 {
     #[inline(always)]
-    fn new(x: usize) -> Self { x as u16 }
+    fn new(x: usize) -> Self {
+        x as u16
+    }
     #[inline(always)]
-    fn index(&self) -> usize { *self as usize }
+    fn index(&self) -> usize {
+        *self as usize
+    }
     #[inline(always)]
-    fn max() -> Self { ::std::u16::MAX }
+    fn max() -> Self {
+        ::std::u16::MAX
+    }
 }
 
 unsafe impl IndexType for u8 {
     #[inline(always)]
-    fn new(x: usize) -> Self { x as u8 }
+    fn new(x: usize) -> Self {
+        x as u8
+    }
     #[inline(always)]
-    fn index(&self) -> usize { *self as usize }
+    fn index(&self) -> usize {
+        *self as usize
+    }
     #[inline(always)]
-    fn max() -> Self { ::std::u8::MAX }
+    fn max() -> Self {
+        ::std::u8::MAX
+    }
 }
 
 /// Node identifier.
 #[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord, Hash)]
-pub struct NodeIndex<Ix=DefaultIx>(Ix);
+pub struct NodeIndex<Ix = DefaultIx>(Ix);
 
-impl<Ix: IndexType> NodeIndex<Ix>
-{
+impl<Ix: IndexType> NodeIndex<Ix> {
     #[inline]
     pub fn new(x: usize) -> Self {
         NodeIndex(IndexType::new(x))
     }
 
     #[inline]
-    pub fn index(self) -> usize
-    {
+    pub fn index(self) -> usize {
         self.0.index()
     }
 
     #[inline]
-    pub fn end() -> Self
-    {
+    pub fn end() -> Self {
         NodeIndex(IndexType::max())
     }
 
@@ -113,36 +122,39 @@
 }
 
 impl<Ix: IndexType> From<Ix> for NodeIndex<Ix> {
-    fn from(ix: Ix) -> Self { NodeIndex(ix) }
+    fn from(ix: Ix) -> Self {
+        NodeIndex(ix)
+    }
 }
 
-impl<Ix: fmt::Debug> fmt::Debug for NodeIndex<Ix>
-{
+impl<Ix: fmt::Debug> fmt::Debug for NodeIndex<Ix> {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "NodeIndex({:?})", self.0)
     }
 }
 
 /// Short version of `NodeIndex::new`
-pub fn node_index<Ix: IndexType>(index: usize) -> NodeIndex<Ix> { NodeIndex::new(index) }
+pub fn node_index<Ix: IndexType>(index: usize) -> NodeIndex<Ix> {
+    NodeIndex::new(index)
+}
 
 /// Short version of `EdgeIndex::new`
-pub fn edge_index<Ix: IndexType>(index: usize) -> EdgeIndex<Ix> { EdgeIndex::new(index) }
+pub fn edge_index<Ix: IndexType>(index: usize) -> EdgeIndex<Ix> {
+    EdgeIndex::new(index)
+}
 
 /// Edge identifier.
 #[derive(Copy, Clone, Default, PartialEq, PartialOrd, Eq, Ord, Hash)]
-pub struct EdgeIndex<Ix=DefaultIx>(Ix);
+pub struct EdgeIndex<Ix = DefaultIx>(Ix);
 
-impl<Ix: IndexType> EdgeIndex<Ix>
-{
+impl<Ix: IndexType> EdgeIndex<Ix> {
     #[inline]
     pub fn new(x: usize) -> Self {
         EdgeIndex(IndexType::new(x))
     }
 
     #[inline]
-    pub fn index(self) -> usize
-    {
+    pub fn index(self) -> usize {
         self.0.index()
     }
 
@@ -159,11 +171,12 @@
 }
 
 impl<Ix: IndexType> From<Ix> for EdgeIndex<Ix> {
-    fn from(ix: Ix) -> Self { EdgeIndex(ix) }
+    fn from(ix: Ix) -> Self {
+        EdgeIndex(ix)
+    }
 }
 
-impl<Ix: fmt::Debug> fmt::Debug for EdgeIndex<Ix>
-{
+impl<Ix: fmt::Debug> fmt::Debug for EdgeIndex<Ix> {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "EdgeIndex({:?})", self.0)
     }
@@ -195,24 +208,21 @@
     next: [EdgeIndex<Ix>; 2],
 }
 
-impl<E, Ix> Clone for Node<E, Ix> where E: Clone, Ix: Copy {
-    clone_fields!(Node,
-                  weight,
-                  next,
-                  );
+impl<E, Ix> Clone for Node<E, Ix>
+where
+    E: Clone,
+    Ix: Copy,
+{
+    clone_fields!(Node, weight, next,);
 }
 
-
-impl<N, Ix: IndexType> Node<N, Ix>
-{
+impl<N, Ix: IndexType> Node<N, Ix> {
     /// Accessor for data structure internals: the first edge in the given direction.
-    pub fn next_edge(&self, dir: Direction) -> EdgeIndex<Ix>
-    {
+    pub fn next_edge(&self, dir: Direction) -> EdgeIndex<Ix> {
         self.next[dir.index()]
     }
 }
 
-
 /// The graph's edge type.
 #[derive(Debug)]
 pub struct Edge<E, Ix = DefaultIx> {
@@ -224,31 +234,27 @@
     node: [NodeIndex<Ix>; 2],
 }
 
-impl<E, Ix> Clone for Edge<E, Ix> where E: Clone, Ix: Copy {
-    clone_fields!(Edge,
-                  weight,
-                  next,
-                  node,
-                  );
+impl<E, Ix> Clone for Edge<E, Ix>
+where
+    E: Clone,
+    Ix: Copy,
+{
+    clone_fields!(Edge, weight, next, node,);
 }
 
-impl<E, Ix: IndexType> Edge<E, Ix>
-{
+impl<E, Ix: IndexType> Edge<E, Ix> {
     /// Accessor for data structure internals: the next edge for the given direction.
-    pub fn next_edge(&self, dir: Direction) -> EdgeIndex<Ix>
-    {
+    pub fn next_edge(&self, dir: Direction) -> EdgeIndex<Ix> {
         self.next[dir.index()]
     }
 
     /// Return the source node index.
-    pub fn source(&self) -> NodeIndex<Ix>
-    {
+    pub fn source(&self) -> NodeIndex<Ix> {
         self.node[0]
     }
 
     /// Return the target node index.
-    pub fn target(&self) -> NodeIndex<Ix>
-    {
+    pub fn target(&self) -> NodeIndex<Ix> {
         self.node[1]
     }
 }
@@ -341,10 +347,11 @@
 /// *2* and *1*.
 pub type UnGraph<N, E, Ix = DefaultIx> = Graph<N, E, Undirected, Ix>;
 
-
 /// The resulting cloned graph has the same graph indices as `self`.
 impl<N, E, Ty, Ix: IndexType> Clone for Graph<N, E, Ty, Ix>
-    where N: Clone, E: Clone,
+where
+    N: Clone,
+    E: Clone,
 {
     fn clone(&self) -> Self {
         Graph {
@@ -362,34 +369,44 @@
 }
 
 impl<N, E, Ty, Ix> fmt::Debug for Graph<N, E, Ty, Ix>
-    where N: fmt::Debug,
-          E: fmt::Debug,
-          Ty: EdgeType,
-          Ix: IndexType,
+where
+    N: fmt::Debug,
+    E: fmt::Debug,
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        let etype = if self.is_directed() { "Directed" } else { "Undirected" };
+        let etype = if self.is_directed() {
+            "Directed"
+        } else {
+            "Undirected"
+        };
         let mut fmt_struct = f.debug_struct("Graph");
         fmt_struct.field("Ty", &etype);
         fmt_struct.field("node_count", &self.node_count());
         fmt_struct.field("edge_count", &self.edge_count());
         if self.edge_count() > 0 {
-            fmt_struct.field("edges",
-                 &self.edges
-                     .iter()
-                     .map(|e| NoPretty((e.source().index(), e.target().index())))
-                     .format(", "));
+            fmt_struct.field(
+                "edges",
+                &self
+                    .edges
+                    .iter()
+                    .map(|e| NoPretty((e.source().index(), e.target().index())))
+                    .format(", "),
+            );
         }
         // skip weights if they are ZST!
         if size_of::<N>() != 0 {
-            fmt_struct.field("node weights", &DebugMap(|| self.nodes.iter()
-                             .map(|n| &n.weight)
-                             .enumerate()));
+            fmt_struct.field(
+                "node weights",
+                &DebugMap(|| self.nodes.iter().map(|n| &n.weight).enumerate()),
+            );
         }
         if size_of::<E>() != 0 {
-            fmt_struct.field("edge weights", &DebugMap(|| self.edges.iter()
-                             .map(|n| &n.weight)
-                             .enumerate()));
+            fmt_struct.field(
+                "edge weights",
+                &DebugMap(|| self.edges.iter().map(|n| &n.weight).enumerate()),
+            );
         }
         fmt_struct.finish()
     }
@@ -419,63 +436,65 @@
     }
 }
 
-impl<N, E> Graph<N, E, Directed>
-{
+impl<N, E> Graph<N, E, Directed> {
     /// Create a new `Graph` with directed edges.
     ///
     /// This is a convenience method. Use `Graph::with_capacity` or `Graph::default` for
     /// a constructor that is generic in all the type parameters of `Graph`.
-    pub fn new() -> Self
-    {
-        Graph{nodes: Vec::new(), edges: Vec::new(),
-              ty: PhantomData}
+    pub fn new() -> Self {
+        Graph {
+            nodes: Vec::new(),
+            edges: Vec::new(),
+            ty: PhantomData,
+        }
     }
 }
 
-impl<N, E> Graph<N, E, Undirected>
-{
+impl<N, E> Graph<N, E, Undirected> {
     /// Create a new `Graph` with undirected edges.
     ///
     /// This is a convenience method. Use `Graph::with_capacity` or `Graph::default` for
     /// a constructor that is generic in all the type parameters of `Graph`.
-    pub fn new_undirected() -> Self
-    {
-        Graph{nodes: Vec::new(), edges: Vec::new(),
-              ty: PhantomData}
+    pub fn new_undirected() -> Self {
+        Graph {
+            nodes: Vec::new(),
+            edges: Vec::new(),
+            ty: PhantomData,
+        }
     }
 }
 
 impl<N, E, Ty, Ix> Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     /// Create a new `Graph` with estimated capacity.
-    pub fn with_capacity(nodes: usize, edges: usize) -> Self
-    {
-        Graph{nodes: Vec::with_capacity(nodes), edges: Vec::with_capacity(edges),
-              ty: PhantomData}
+    pub fn with_capacity(nodes: usize, edges: usize) -> Self {
+        Graph {
+            nodes: Vec::with_capacity(nodes),
+            edges: Vec::with_capacity(edges),
+            ty: PhantomData,
+        }
     }
 
     /// Return the number of nodes (vertices) in the graph.
     ///
     /// Computes in **O(1)** time.
-    pub fn node_count(&self) -> usize
-    {
+    pub fn node_count(&self) -> usize {
         self.nodes.len()
     }
 
     /// Return the number of edges in the graph.
     ///
     /// Computes in **O(1)** time.
-    pub fn edge_count(&self) -> usize
-    {
+    pub fn edge_count(&self) -> usize {
         self.edges.len()
     }
 
     /// Whether the graph has directed edges or not.
     #[inline]
-    pub fn is_directed(&self) -> bool
-    {
+    pub fn is_directed(&self) -> bool {
         Ty::is_directed()
     }
 
@@ -487,9 +506,11 @@
     ///
     /// **Panics** if the Graph is at the maximum number of nodes for its index
     /// type (N/A if usize).
-    pub fn add_node(&mut self, weight: N) -> NodeIndex<Ix>
-    {
-        let node = Node{weight, next: [EdgeIndex::end(), EdgeIndex::end()]};
+    pub fn add_node(&mut self, weight: N) -> NodeIndex<Ix> {
+        let node = Node {
+            weight,
+            next: [EdgeIndex::end(), EdgeIndex::end()],
+        };
         let node_idx = NodeIndex::new(self.nodes.len());
         // check for max capacity, except if we use usize
         assert!(<Ix as IndexType>::max().index() == !0 || NodeIndex::end() != node_idx);
@@ -500,16 +521,14 @@
     /// Access the weight for node `a`.
     ///
     /// Also available with indexing syntax: `&graph[a]`.
-    pub fn node_weight(&self, a: NodeIndex<Ix>) -> Option<&N>
-    {
+    pub fn node_weight(&self, a: NodeIndex<Ix>) -> Option<&N> {
         self.nodes.get(a.index()).map(|n| &n.weight)
     }
 
     /// Access the weight for node `a`, mutably.
     ///
     /// Also available with indexing syntax: `&mut graph[a]`.
-    pub fn node_weight_mut(&mut self, a: NodeIndex<Ix>) -> Option<&mut N>
-    {
+    pub fn node_weight_mut(&mut self, a: NodeIndex<Ix>) -> Option<&mut N> {
         self.nodes.get_mut(a.index()).map(|n| &mut n.weight)
     }
 
@@ -526,8 +545,7 @@
     ///
     /// **Note:** `Graph` allows adding parallel (“duplicate”) edges. If you want
     /// to avoid this, use [`.update_edge(a, b, weight)`](#method.update_edge) instead.
-    pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix>
-    {
+    pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix> {
         let edge_idx = EdgeIndex::new(self.edges.len());
         assert!(<Ix as IndexType>::max().index() == !0 || EdgeIndex::end() != edge_idx);
         let mut edge = Edge {
@@ -562,8 +580,7 @@
     /// connected to `a` (and `b`, if the graph edges are undirected).
     ///
     /// **Panics** if any of the nodes don't exist.
-    pub fn update_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix>
-    {
+    pub fn update_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix> {
         if let Some(ix) = self.find_edge(a, b) {
             if let Some(ed) = self.edge_weight_mut(ix) {
                 *ed = weight;
@@ -576,24 +593,22 @@
     /// Access the weight for edge `e`.
     ///
     /// Also available with indexing syntax: `&graph[e]`.
-    pub fn edge_weight(&self, e: EdgeIndex<Ix>) -> Option<&E>
-    {
+    pub fn edge_weight(&self, e: EdgeIndex<Ix>) -> Option<&E> {
         self.edges.get(e.index()).map(|ed| &ed.weight)
     }
 
     /// Access the weight for edge `e`, mutably.
     ///
     /// Also available with indexing syntax: `&mut graph[e]`.
-    pub fn edge_weight_mut(&mut self, e: EdgeIndex<Ix>) -> Option<&mut E>
-    {
+    pub fn edge_weight_mut(&mut self, e: EdgeIndex<Ix>) -> Option<&mut E> {
         self.edges.get_mut(e.index()).map(|ed| &mut ed.weight)
     }
 
     /// Access the source and target nodes for `e`.
-    pub fn edge_endpoints(&self, e: EdgeIndex<Ix>)
-        -> Option<(NodeIndex<Ix>, NodeIndex<Ix>)>
-    {
-        self.edges.get(e.index()).map(|ed| (ed.source(), ed.target()))
+    pub fn edge_endpoints(&self, e: EdgeIndex<Ix>) -> Option<(NodeIndex<Ix>, NodeIndex<Ix>)> {
+        self.edges
+            .get(e.index())
+            .map(|ed| (ed.source(), ed.target()))
     }
 
     /// Remove `a` from the graph if it exists, and return its weight.
@@ -608,8 +623,7 @@
     /// edges, including *n* calls to `.remove_edge()` where *n* is the number
     /// of edges with an endpoint in `a`, and including the edges with an
     /// endpoint in the displaced node.
-    pub fn remove_node(&mut self, a: NodeIndex<Ix>) -> Option<N>
-    {
+    pub fn remove_node(&mut self, a: NodeIndex<Ix>) -> Option<N> {
         self.nodes.get(a.index())?;
         for d in &DIRECTIONS {
             let k = d.index();
@@ -618,7 +632,7 @@
             loop {
                 let next = self.nodes[a.index()].next[k];
                 if next == EdgeIndex::end() {
-                    break
+                    break;
                 }
                 let ret = self.remove_edge(next);
                 debug_assert!(ret.is_some());
@@ -656,17 +670,23 @@
 
     /// For edge `e` with endpoints `edge_node`, replace links to it,
     /// with links to `edge_next`.
-    fn change_edge_links(&mut self, edge_node: [NodeIndex<Ix>; 2], e: EdgeIndex<Ix>,
-                         edge_next: [EdgeIndex<Ix>; 2])
-    {
+    fn change_edge_links(
+        &mut self,
+        edge_node: [NodeIndex<Ix>; 2],
+        e: EdgeIndex<Ix>,
+        edge_next: [EdgeIndex<Ix>; 2],
+    ) {
         for &d in &DIRECTIONS {
             let k = d.index();
             let node = match self.nodes.get_mut(edge_node[k].index()) {
                 Some(r) => r,
                 None => {
-                    debug_assert!(false, "Edge's endpoint dir={:?} index={:?} not found",
-                                  d, edge_node[k]);
-                    return
+                    debug_assert!(
+                        false,
+                        "Edge's endpoint dir={:?} index={:?} not found",
+                        d, edge_node[k]
+                    );
+                    return;
                 }
             };
             let fst = node.next[k];
@@ -692,8 +712,7 @@
     ///
     /// Computes in **O(e')** time, where **e'** is the size of four particular edge lists, for
     /// the vertices of `e` and the vertices of another affected edge.
-    pub fn remove_edge(&mut self, e: EdgeIndex<Ix>) -> Option<E>
-    {
+    pub fn remove_edge(&mut self, e: EdgeIndex<Ix>) -> Option<E> {
         // every edge is part of two lists,
         // outgoing and incoming edges.
         // Remove it from both
@@ -707,8 +726,7 @@
         self.remove_edge_adjust_indices(e)
     }
 
-    fn remove_edge_adjust_indices(&mut self, e: EdgeIndex<Ix>) -> Option<E>
-    {
+    fn remove_edge_adjust_indices(&mut self, e: EdgeIndex<Ix>) -> Option<E> {
         // swap_remove the edge -- only the removed edge
         // and the edge swapped into place are affected and need updating
         // indices.
@@ -738,8 +756,7 @@
     /// not borrow from the graph.
     ///
     /// [1]: struct.Neighbors.html#method.detach
-    pub fn neighbors(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix>
-    {
+    pub fn neighbors(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> {
         self.neighbors_directed(a, Outgoing)
     }
 
@@ -762,8 +779,7 @@
     /// not borrow from the graph.
     ///
     /// [1]: struct.Neighbors.html#method.detach
-    pub fn neighbors_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Neighbors<E, Ix>
-    {
+    pub fn neighbors_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Neighbors<E, Ix> {
         let mut iter = self.neighbors_undirected(a);
         if self.is_directed() {
             let k = dir.index();
@@ -787,15 +803,14 @@
     ///
     /// [1]: struct.Neighbors.html#method.detach
     ///
-    pub fn neighbors_undirected(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix>
-    {
+    pub fn neighbors_undirected(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> {
         Neighbors {
             skip_start: a,
             edges: &self.edges,
             next: match self.nodes.get(a.index()) {
                 None => [EdgeIndex::end(), EdgeIndex::end()],
                 Some(n) => n.next,
-            }
+            },
         }
     }
 
@@ -821,8 +836,7 @@
     ///
     /// Produces an empty iterator if the node `a` doesn't exist.<br>
     /// Iterator element type is `EdgeReference<E, Ix>`.
-    pub fn edges_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Edges<E, Ty, Ix>
-    {
+    pub fn edges_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Edges<E, Ty, Ix> {
         Edges {
             skip_start: a,
             edges: &self.edges,
@@ -841,8 +855,11 @@
     /// - `Undirected`: All edges connected to `a`.
     ///
     /// Iterator element type is `EdgeReference<E, Ix>`.
-    pub fn edges_connecting(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> EdgesConnecting<E, Ty, Ix>
-    {
+    pub fn edges_connecting(
+        &self,
+        a: NodeIndex<Ix>,
+        b: NodeIndex<Ix>,
+    ) -> EdgesConnecting<E, Ty, Ix> {
         EdgesConnecting {
             target_node: b,
             edges: self.edges_directed(a, Direction::Outgoing),
@@ -862,25 +879,26 @@
     ///
     /// Computes in **O(e')** time, where **e'** is the number of edges
     /// connected to `a` (and `b`, if the graph edges are undirected).
-    pub fn find_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<EdgeIndex<Ix>>
-    {
+    pub fn find_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<EdgeIndex<Ix>> {
         if !self.is_directed() {
             self.find_edge_undirected(a, b).map(|(ix, _)| ix)
         } else {
             match self.nodes.get(a.index()) {
                 None => None,
-                Some(node) => self.find_edge_directed_from_node(node, b)
+                Some(node) => self.find_edge_directed_from_node(node, b),
             }
         }
     }
 
-    fn find_edge_directed_from_node(&self, node: &Node<N, Ix>, b: NodeIndex<Ix>)
-        -> Option<EdgeIndex<Ix>>
-    {
+    fn find_edge_directed_from_node(
+        &self,
+        node: &Node<N, Ix>,
+        b: NodeIndex<Ix>,
+    ) -> Option<EdgeIndex<Ix>> {
         let mut edix = node.next[0];
         while let Some(edge) = self.edges.get(edix.index()) {
             if edge.node[1] == b {
-                return Some(edix)
+                return Some(edix);
             }
             edix = edge.next[0];
         }
@@ -894,23 +912,28 @@
     /// Return the edge index and its directionality, with `Outgoing` meaning
     /// from `a` to `b` and `Incoming` the reverse,
     /// or `None` if the edge does not exist.
-    pub fn find_edge_undirected(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<(EdgeIndex<Ix>, Direction)>
-    {
+    pub fn find_edge_undirected(
+        &self,
+        a: NodeIndex<Ix>,
+        b: NodeIndex<Ix>,
+    ) -> Option<(EdgeIndex<Ix>, Direction)> {
         match self.nodes.get(a.index()) {
             None => None,
             Some(node) => self.find_edge_undirected_from_node(node, b),
         }
     }
 
-    fn find_edge_undirected_from_node(&self, node: &Node<N, Ix>, b: NodeIndex<Ix>)
-        -> Option<(EdgeIndex<Ix>, Direction)>
-    {
+    fn find_edge_undirected_from_node(
+        &self,
+        node: &Node<N, Ix>,
+        b: NodeIndex<Ix>,
+    ) -> Option<(EdgeIndex<Ix>, Direction)> {
         for &d in &DIRECTIONS {
             let k = d.index();
             let mut edix = node.next[k];
             while let Some(edge) = self.edges.get(edix.index()) {
                 if edge.node[1 - k] == b {
-                    return Some((edix, d))
+                    return Some((edix, d));
                 }
                 edix = edge.next[k];
             }
@@ -929,9 +952,12 @@
     /// just the nodes without edges.
     ///
     /// The whole iteration computes in **O(|V|)** time.
-    pub fn externals(&self, dir: Direction) -> Externals<N, Ty, Ix>
-    {
-        Externals{iter: self.nodes.iter().enumerate(), dir, ty: PhantomData}
+    pub fn externals(&self, dir: Direction) -> Externals<N, Ty, Ix> {
+        Externals {
+            iter: self.nodes.iter().enumerate(),
+            dir,
+            ty: PhantomData,
+        }
     }
 
     /// Return an iterator over the node indices of the graph.
@@ -947,21 +973,28 @@
     /// let index = g.node_indices().find(|i| g[*i] == "book").unwrap();
     /// ```
     pub fn node_indices(&self) -> NodeIndices<Ix> {
-        NodeIndices { r: 0..self.node_count(), ty: PhantomData }
+        NodeIndices {
+            r: 0..self.node_count(),
+            ty: PhantomData,
+        }
     }
 
     /// Return an iterator yielding mutable access to all node weights.
     ///
     /// The order in which weights are yielded matches the order of their
     /// node indices.
-    pub fn node_weights_mut(&mut self) -> NodeWeightsMut<N, Ix>
-    {
-        NodeWeightsMut { nodes: self.nodes.iter_mut() }
+    pub fn node_weights_mut(&mut self) -> NodeWeightsMut<N, Ix> {
+        NodeWeightsMut {
+            nodes: self.nodes.iter_mut(),
+        }
     }
 
     /// Return an iterator over the edge indices of the graph
     pub fn edge_indices(&self) -> EdgeIndices<Ix> {
-        EdgeIndices { r: 0..self.edge_count(), ty: PhantomData }
+        EdgeIndices {
+            r: 0..self.edge_count(),
+            ty: PhantomData,
+        }
     }
 
     /// Create an iterator over all edges, in indexed order.
@@ -969,7 +1002,7 @@
     /// Iterator element type is `EdgeReference<E, Ix>`.
     pub fn edge_references(&self) -> EdgeReferences<E, Ix> {
         EdgeReferences {
-            iter: self.edges.iter().enumerate()
+            iter: self.edges.iter().enumerate(),
         }
     }
 
@@ -977,23 +1010,22 @@
     ///
     /// The order in which weights are yielded matches the order of their
     /// edge indices.
-    pub fn edge_weights_mut(&mut self) -> EdgeWeightsMut<E, Ix>
-    {
-        EdgeWeightsMut { edges: self.edges.iter_mut() }
+    pub fn edge_weights_mut(&mut self) -> EdgeWeightsMut<E, Ix> {
+        EdgeWeightsMut {
+            edges: self.edges.iter_mut(),
+        }
     }
 
     // Remaining methods are of the more internal flavour, read-only access to
     // the data structure's internals.
 
     /// Access the internal node array.
-    pub fn raw_nodes(&self) -> &[Node<N, Ix>]
-    {
+    pub fn raw_nodes(&self) -> &[Node<N, Ix>] {
         &self.nodes
     }
 
     /// Access the internal edge array.
-    pub fn raw_edges(&self) -> &[Edge<E, Ix>]
-    {
+    pub fn raw_edges(&self) -> &[Edge<E, Ix>] {
         &self.edges
     }
 
@@ -1003,29 +1035,31 @@
     }
 
     /// Accessor for data structure internals: the first edge in the given direction.
-    pub fn first_edge(&self, a: NodeIndex<Ix>, dir: Direction) -> Option<EdgeIndex<Ix>>
-    {
+    pub fn first_edge(&self, a: NodeIndex<Ix>, dir: Direction) -> Option<EdgeIndex<Ix>> {
         match self.nodes.get(a.index()) {
             None => None,
             Some(node) => {
                 let edix = node.next[dir.index()];
                 if edix == EdgeIndex::end() {
                     None
-                } else { Some(edix) }
+                } else {
+                    Some(edix)
+                }
             }
         }
     }
 
     /// Accessor for data structure internals: the next edge for the given direction.
-    pub fn next_edge(&self, e: EdgeIndex<Ix>, dir: Direction) -> Option<EdgeIndex<Ix>>
-    {
+    pub fn next_edge(&self, e: EdgeIndex<Ix>, dir: Direction) -> Option<EdgeIndex<Ix>> {
         match self.edges.get(e.index()) {
             None => None,
             Some(node) => {
                 let edix = node.next[dir.index()];
                 if edix == EdgeIndex::end() {
                     None
-                } else { Some(edix) }
+                } else {
+                    Some(edix)
+                }
             }
         }
     }
@@ -1063,21 +1097,28 @@
     /// assert_eq!(gr[b], 4.);
     /// assert_eq!(gr[c], 2.);
     /// ```
-    pub fn index_twice_mut<T, U>(&mut self, i: T, j: U)
-        -> (&mut <Self as Index<T>>::Output,
-            &mut <Self as Index<U>>::Output)
-        where Self: IndexMut<T> + IndexMut<U>,
-              T: GraphIndex,
-              U: GraphIndex,
+    pub fn index_twice_mut<T, U>(
+        &mut self,
+        i: T,
+        j: U,
+    ) -> (
+        &mut <Self as Index<T>>::Output,
+        &mut <Self as Index<U>>::Output,
+    )
+    where
+        Self: IndexMut<T> + IndexMut<U>,
+        T: GraphIndex,
+        U: GraphIndex,
     {
-        assert!(T::is_node_index() != U::is_node_index() ||
-                i.index() != j.index());
+        assert!(T::is_node_index() != U::is_node_index() || i.index() != j.index());
 
         // Allow two mutable indexes here -- they are nonoverlapping
         unsafe {
             let self_mut = self as *mut _;
-            (<Self as IndexMut<T>>::index_mut(&mut *self_mut, i),
-             <Self as IndexMut<U>>::index_mut(&mut *self_mut, j))
+            (
+                <Self as IndexMut<T>>::index_mut(&mut *self_mut, i),
+                <Self as IndexMut<U>>::index_mut(&mut *self_mut, j),
+            )
         }
     }
 
@@ -1176,7 +1217,8 @@
     ///
     /// The order nodes are visited is not specified.
     pub fn retain_nodes<F>(&mut self, mut visit: F)
-        where F: FnMut(Frozen<Self>, NodeIndex<Ix>) -> bool
+    where
+        F: FnMut(Frozen<Self>, NodeIndex<Ix>) -> bool,
     {
         for index in self.node_indices().rev() {
             if !visit(Frozen(self), index) {
@@ -1195,7 +1237,8 @@
     ///
     /// The order edges are visited is not specified.
     pub fn retain_edges<F>(&mut self, mut visit: F)
-        where F: FnMut(Frozen<Self>, EdgeIndex<Ix>) -> bool
+    where
+        F: FnMut(Frozen<Self>, EdgeIndex<Ix>) -> bool,
     {
         for index in self.edge_indices().rev() {
             if !visit(Frozen(self), index) {
@@ -1206,7 +1249,6 @@
         }
     }
 
-
     /// Create a new `Graph` from an iterable of edges.
     ///
     /// Node weights `N` are set to default values.
@@ -1225,10 +1267,11 @@
     /// ]);
     /// ```
     pub fn from_edges<I>(iterable: I) -> Self
-        where I: IntoIterator,
-              I::Item: IntoWeightedEdge<E>,
-              <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
-              N: Default,
+    where
+        I: IntoIterator,
+        I::Item: IntoWeightedEdge<E>,
+        <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
+        N: Default,
     {
         let mut g = Self::with_capacity(0, 0);
         g.extend_with_edges(iterable);
@@ -1243,10 +1286,11 @@
     ///
     /// Nodes are inserted automatically to match the edges.
     pub fn extend_with_edges<I>(&mut self, iterable: I)
-        where I: IntoIterator,
-              I::Item: IntoWeightedEdge<E>,
-              <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
-              N: Default,
+    where
+        I: IntoIterator,
+        I::Item: IntoWeightedEdge<E>,
+        <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
+        N: Default,
     {
         let iter = iterable.into_iter();
         let (low, _) = iter.size_hint();
@@ -1263,29 +1307,30 @@
         }
     }
 
-
     /// Create a new `Graph` by mapping node and
     /// edge weights to new values.
     ///
     /// The resulting graph has the same structure and the same
     /// graph indices as `self`.
-    pub fn map<'a, F, G, N2, E2>(&'a self, mut node_map: F, mut edge_map: G)
-        -> Graph<N2, E2, Ty, Ix>
-        where F: FnMut(NodeIndex<Ix>, &'a N) -> N2,
-              G: FnMut(EdgeIndex<Ix>, &'a E) -> E2,
+    pub fn map<'a, F, G, N2, E2>(
+        &'a self,
+        mut node_map: F,
+        mut edge_map: G,
+    ) -> Graph<N2, E2, Ty, Ix>
+    where
+        F: FnMut(NodeIndex<Ix>, &'a N) -> N2,
+        G: FnMut(EdgeIndex<Ix>, &'a E) -> E2,
     {
         let mut g = Graph::with_capacity(self.node_count(), self.edge_count());
-        g.nodes.extend(enumerate(&self.nodes).map(|(i, node)|
-            Node {
-                weight: node_map(NodeIndex::new(i), &node.weight),
-                next: node.next,
-            }));
-        g.edges.extend(enumerate(&self.edges).map(|(i, edge)|
-            Edge {
-                weight: edge_map(EdgeIndex::new(i), &edge.weight),
-                next: edge.next,
-                node: edge.node,
-            }));
+        g.nodes.extend(enumerate(&self.nodes).map(|(i, node)| Node {
+            weight: node_map(NodeIndex::new(i), &node.weight),
+            next: node.next,
+        }));
+        g.edges.extend(enumerate(&self.edges).map(|(i, edge)| Edge {
+            weight: edge_map(EdgeIndex::new(i), &edge.weight),
+            next: edge.next,
+            node: edge.node,
+        }));
         g
     }
 
@@ -1301,10 +1346,14 @@
     /// If no nodes are removed, the resulting graph has compatible node
     /// indices; if neither nodes nor edges are removed, the result has
     /// the same graph indices as `self`.
-    pub fn filter_map<'a, F, G, N2, E2>(&'a self, mut node_map: F, mut edge_map: G)
-        -> Graph<N2, E2, Ty, Ix>
-        where F: FnMut(NodeIndex<Ix>, &'a N) -> Option<N2>,
-              G: FnMut(EdgeIndex<Ix>, &'a E) -> Option<E2>,
+    pub fn filter_map<'a, F, G, N2, E2>(
+        &'a self,
+        mut node_map: F,
+        mut edge_map: G,
+    ) -> Graph<N2, E2, Ty, Ix>
+    where
+        F: FnMut(NodeIndex<Ix>, &'a N) -> Option<N2>,
+        G: FnMut(EdgeIndex<Ix>, &'a E) -> Option<E2>,
     {
         let mut g = Graph::with_capacity(0, 0);
         // mapping from old node index to new node index, end represents removed.
@@ -1331,14 +1380,17 @@
     /// are done, so you may want to go over the result to remove or add edges.
     ///
     /// Computes in **O(1)** time.
-    pub fn into_edge_type<NewTy>(self) -> Graph<N, E, NewTy, Ix> where
-        NewTy: EdgeType
+    pub fn into_edge_type<NewTy>(self) -> Graph<N, E, NewTy, Ix>
+    where
+        NewTy: EdgeType,
     {
-        Graph{nodes: self.nodes, edges: self.edges,
-              ty: PhantomData}
+        Graph {
+            nodes: self.nodes,
+            edges: self.edges,
+            ty: PhantomData,
+        }
     }
 
-
     //
     // internal methods
     //
@@ -1375,26 +1427,26 @@
     ty: PhantomData<Ty>,
 }
 
-impl<'a, N: 'a, Ty, Ix> Iterator for Externals<'a, N, Ty, Ix> where
+impl<'a, N: 'a, Ty, Ix> Iterator for Externals<'a, N, Ty, Ix>
+where
     Ty: EdgeType,
     Ix: IndexType,
 {
     type Item = NodeIndex<Ix>;
-    fn next(&mut self) -> Option<NodeIndex<Ix>>
-    {
+    fn next(&mut self) -> Option<NodeIndex<Ix>> {
         let k = self.dir.index();
         loop {
             match self.iter.next() {
                 None => return None,
                 Some((index, node)) => {
-                    if node.next[k] == EdgeIndex::end() &&
-                        (Ty::is_directed() ||
-                         node.next[1-k] == EdgeIndex::end()) {
-                        return Some(NodeIndex::new(index))
+                    if node.next[k] == EdgeIndex::end()
+                        && (Ty::is_directed() || node.next[1 - k] == EdgeIndex::end())
+                    {
+                        return Some(NodeIndex::new(index));
                     } else {
-                        continue
+                        continue;
                     }
-                },
+                }
             }
         }
     }
@@ -1410,15 +1462,15 @@
 /// [1]: struct.Graph.html#method.neighbors
 /// [2]: struct.Graph.html#method.neighbors_directed
 /// [3]: struct.Graph.html#method.neighbors_undirected
-pub struct Neighbors<'a, E: 'a, Ix: 'a = DefaultIx>
-{
+pub struct Neighbors<'a, E: 'a, Ix: 'a = DefaultIx> {
     /// starting node to skip over
     skip_start: NodeIndex<Ix>,
     edges: &'a [Edge<E, Ix>],
     next: [EdgeIndex<Ix>; 2],
 }
 
-impl<'a, E, Ix> Iterator for Neighbors<'a, E, Ix> where
+impl<'a, E, Ix> Iterator for Neighbors<'a, E, Ix>
+where
     Ix: IndexType,
 {
     type Item = NodeIndex<Ix>;
@@ -1446,19 +1498,16 @@
     }
 }
 
-
 impl<'a, E, Ix> Clone for Neighbors<'a, E, Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
-    clone_fields!(Neighbors,
-                  skip_start,
-                  edges,
-                  next,
-                  );
+    clone_fields!(Neighbors, skip_start, edges, next,);
 }
 
 impl<'a, E, Ix> Neighbors<'a, E, Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     /// Return a “walker” object that can be used to step through the
     /// neighbors and edges from the origin node.
@@ -1468,7 +1517,7 @@
     pub fn detach(&self) -> WalkNeighbors<Ix> {
         WalkNeighbors {
             skip_start: self.skip_start,
-            next: self.next
+            next: self.next,
         }
     }
 }
@@ -1479,18 +1528,19 @@
     dir: Direction,
 }
 
-fn edges_walker_mut<E, Ix>(edges: &mut [Edge<E, Ix>], next: EdgeIndex<Ix>, dir: Direction)
-    -> EdgesWalkerMut<E, Ix>
-    where Ix: IndexType,
+fn edges_walker_mut<E, Ix>(
+    edges: &mut [Edge<E, Ix>],
+    next: EdgeIndex<Ix>,
+    dir: Direction,
+) -> EdgesWalkerMut<E, Ix>
+where
+    Ix: IndexType,
 {
-    EdgesWalkerMut {
-        edges,
-        next,
-        dir
-    }
+    EdgesWalkerMut { edges, next, dir }
 }
 
-impl<'a, E, Ix> EdgesWalkerMut<'a, E, Ix> where
+impl<'a, E, Ix> EdgesWalkerMut<'a, E, Ix>
+where
     Ix: IndexType,
 {
     fn next_edge(&mut self) -> Option<&mut Edge<E, Ix>> {
@@ -1510,10 +1560,10 @@
     }
 }
 
-
 impl<'a, N, E, Ty, Ix> IntoEdges for &'a Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Edges = Edges<'a, E, Ty, Ix>;
     fn edges(self, a: Self::NodeId) -> Self::Edges {
@@ -1522,8 +1572,9 @@
 }
 
 impl<'a, N, E, Ty, Ix> IntoEdgesDirected for &'a Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type EdgesDirected = Edges<'a, E, Ty, Ix>;
     fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::EdgesDirected {
@@ -1531,11 +1582,11 @@
     }
 }
 
-
 /// Iterator over the edges of from or to a node
 pub struct Edges<'a, E: 'a, Ty, Ix: 'a = DefaultIx>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     /// starting node to skip over
     skip_start: NodeIndex<Ix>,
@@ -1551,8 +1602,9 @@
 }
 
 impl<'a, E, Ty, Ix> Iterator for Edges<'a, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Item = EdgeReference<'a, E, Ix>;
 
@@ -1606,7 +1658,7 @@
                         *node
                     },
                     weight,
-                })
+                });
             }
         }
 
@@ -1616,8 +1668,9 @@
 
 /// Iterator over the multiple directed edges connecting a source node to a target node
 pub struct EdgesConnecting<'a, E: 'a, Ty, Ix: 'a = DefaultIx>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     target_node: NodeIndex<Ix>,
     edges: Edges<'a, E, Ty, Ix>,
@@ -1625,8 +1678,9 @@
 }
 
 impl<'a, E, Ty, Ix> Iterator for EdgesConnecting<'a, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Item = EdgeReference<'a, E, Ix>;
 
@@ -1641,15 +1695,15 @@
     }
 }
 
-
 fn swap_pair<T>(mut x: [T; 2]) -> [T; 2] {
     x.swap(0, 1);
     x
 }
 
 impl<'a, E, Ty, Ix> Clone for Edges<'a, E, Ty, Ix>
-    where Ix: IndexType,
-          Ty: EdgeType,
+where
+    Ix: IndexType,
+    Ty: EdgeType,
 {
     fn clone(&self) -> Self {
         Edges {
@@ -1667,7 +1721,8 @@
     nodes: ::std::slice::IterMut<'a, Node<N, Ix>>,
 }
 
-impl<'a, N, Ix> Iterator for NodeWeightsMut<'a, N, Ix> where
+impl<'a, N, Ix> Iterator for NodeWeightsMut<'a, N, Ix>
+where
     Ix: IndexType,
 {
     type Item = &'a mut N;
@@ -1686,7 +1741,8 @@
     edges: ::std::slice::IterMut<'a, Edge<E, Ix>>,
 }
 
-impl<'a, E, Ix> Iterator for EdgeWeightsMut<'a, E, Ix> where
+impl<'a, E, Ix> Iterator for EdgeWeightsMut<'a, E, Ix>
+where
     Ix: IndexType,
 {
     type Item = &'a mut E;
@@ -1703,7 +1759,8 @@
 /// Index the `Graph` by `NodeIndex` to access node weights.
 ///
 /// **Panics** if the node doesn't exist.
-impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for Graph<N, E, Ty, Ix> where
+impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for Graph<N, E, Ty, Ix>
+where
     Ty: EdgeType,
     Ix: IndexType,
 {
@@ -1716,20 +1773,21 @@
 /// Index the `Graph` by `NodeIndex` to access node weights.
 ///
 /// **Panics** if the node doesn't exist.
-impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for Graph<N, E, Ty, Ix> where
+impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for Graph<N, E, Ty, Ix>
+where
     Ty: EdgeType,
     Ix: IndexType,
 {
     fn index_mut(&mut self, index: NodeIndex<Ix>) -> &mut N {
         &mut self.nodes[index.index()].weight
     }
-
 }
 
 /// Index the `Graph` by `EdgeIndex` to access edge weights.
 ///
 /// **Panics** if the edge doesn't exist.
-impl<N, E, Ty, Ix> Index<EdgeIndex<Ix>> for Graph<N, E, Ty, Ix> where
+impl<N, E, Ty, Ix> Index<EdgeIndex<Ix>> for Graph<N, E, Ty, Ix>
+where
     Ty: EdgeType,
     Ix: IndexType,
 {
@@ -1742,7 +1800,8 @@
 /// Index the `Graph` by `EdgeIndex` to access edge weights.
 ///
 /// **Panics** if the edge doesn't exist.
-impl<N, E, Ty, Ix> IndexMut<EdgeIndex<Ix>> for Graph<N, E, Ty, Ix> where
+impl<N, E, Ty, Ix> IndexMut<EdgeIndex<Ix>> for Graph<N, E, Ty, Ix>
+where
     Ty: EdgeType,
     Ix: IndexType,
 {
@@ -1753,14 +1812,17 @@
 
 /// Create a new empty `Graph`.
 impl<N, E, Ty, Ix> Default for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
-    fn default() -> Self { Self::with_capacity(0, 0) }
+    fn default() -> Self {
+        Self::with_capacity(0, 0)
+    }
 }
 
 /// A  `GraphIndex` is a node or edge index.
-pub trait GraphIndex : Copy {
+pub trait GraphIndex: Copy {
     #[doc(hidden)]
     fn index(&self) -> usize;
     #[doc(hidden)]
@@ -1769,16 +1831,24 @@
 
 impl<Ix: IndexType> GraphIndex for NodeIndex<Ix> {
     #[inline]
-    fn index(&self) -> usize { NodeIndex::index(*self) }
+    fn index(&self) -> usize {
+        NodeIndex::index(*self)
+    }
     #[inline]
-    fn is_node_index() -> bool { true }
+    fn is_node_index() -> bool {
+        true
+    }
 }
 
 impl<Ix: IndexType> GraphIndex for EdgeIndex<Ix> {
     #[inline]
-    fn index(&self) -> usize { EdgeIndex::index(*self) }
+    fn index(&self) -> usize {
+        EdgeIndex::index(*self)
+    }
     #[inline]
-    fn is_node_index() -> bool { false }
+    fn is_node_index() -> bool {
+        false
+    }
 }
 
 /// A “walker” object that can be used to step through the edge list of a node.
@@ -1822,7 +1892,8 @@
 }
 
 impl<Ix> Clone for WalkNeighbors<Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     fn clone(&self) -> Self {
         WalkNeighbors {
@@ -1839,8 +1910,10 @@
     /// where the `WalkNeighbors` value was created.
     /// For an `Outgoing` walk, the target nodes,
     /// for an `Incoming` walk, the source nodes of the edge.
-    pub fn next<N, E, Ty: EdgeType>(&mut self, g: &Graph<N, E, Ty, Ix>)
-        -> Option<(EdgeIndex<Ix>, NodeIndex<Ix>)> {
+    pub fn next<N, E, Ty: EdgeType>(
+        &mut self,
+        g: &Graph<N, E, Ty, Ix>,
+    ) -> Option<(EdgeIndex<Ix>, NodeIndex<Ix>)> {
         // First any outgoing edges
         match g.edges.get(self.next[0].index()) {
             None => {}
@@ -1864,15 +1937,17 @@
         None
     }
 
-    pub fn next_node<N, E, Ty: EdgeType>(&mut self, g: &Graph<N, E, Ty, Ix>)
-        -> Option<NodeIndex<Ix>>
-    {
+    pub fn next_node<N, E, Ty: EdgeType>(
+        &mut self,
+        g: &Graph<N, E, Ty, Ix>,
+    ) -> Option<NodeIndex<Ix>> {
         self.next(g).map(|t| t.1)
     }
 
-    pub fn next_edge<N, E, Ty: EdgeType>(&mut self, g: &Graph<N, E, Ty, Ix>)
-        -> Option<EdgeIndex<Ix>>
-    {
+    pub fn next_edge<N, E, Ty: EdgeType>(
+        &mut self,
+        g: &Graph<N, E, Ty, Ix>,
+    ) -> Option<EdgeIndex<Ix>> {
         self.next(g).map(|t| t.0)
     }
 }
@@ -1945,10 +2020,11 @@
     }
 }
 
-impl<'a, E, Ix: IndexType> Copy for EdgeReference<'a, E, Ix> { }
+impl<'a, E, Ix: IndexType> Copy for EdgeReference<'a, E, Ix> {}
 
 impl<'a, E, Ix: IndexType> PartialEq for EdgeReference<'a, E, Ix>
-    where E: PartialEq,
+where
+    E: PartialEq,
 {
     fn eq(&self, rhs: &Self) -> bool {
         self.index == rhs.index && self.weight == rhs.weight
@@ -1956,14 +2032,15 @@
 }
 
 impl<'a, N, E, Ty, Ix> IntoNodeReferences for &'a Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type NodeRef = (NodeIndex<Ix>, &'a N);
     type NodeReferences = NodeReferences<'a, N, Ix>;
     fn node_references(self) -> Self::NodeReferences {
         NodeReferences {
-            iter: self.nodes.iter().enumerate()
+            iter: self.nodes.iter().enumerate(),
         }
     }
 }
@@ -1974,14 +2051,15 @@
 }
 
 impl<'a, N, Ix> Iterator for NodeReferences<'a, N, Ix>
-    where Ix: IndexType
+where
+    Ix: IndexType,
 {
     type Item = (NodeIndex<Ix>, &'a N);
 
     fn next(&mut self) -> Option<Self::Item> {
-        self.iter.next().map(|(i, node)|
-            (node_index(i), &node.weight)
-        )
+        self.iter
+            .next()
+            .map(|(i, node)| (node_index(i), &node.weight))
     }
 
     fn size_hint(&self) -> (usize, Option<usize>) {
@@ -1990,61 +2068,70 @@
 }
 
 impl<'a, N, Ix> DoubleEndedIterator for NodeReferences<'a, N, Ix>
-    where Ix: IndexType
+where
+    Ix: IndexType,
 {
     fn next_back(&mut self) -> Option<Self::Item> {
-        self.iter.next_back().map(|(i, node)|
-            (node_index(i), &node.weight)
-        )
+        self.iter
+            .next_back()
+            .map(|(i, node)| (node_index(i), &node.weight))
     }
 }
 
-impl<'a, N, Ix> ExactSizeIterator for NodeReferences<'a, N, Ix>
-    where Ix: IndexType
-{ }
+impl<'a, N, Ix> ExactSizeIterator for NodeReferences<'a, N, Ix> where Ix: IndexType {}
 
 impl<'a, Ix, E> EdgeReference<'a, E, Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     /// Access the edge’s weight.
     ///
     /// **NOTE** that this method offers a longer lifetime
     /// than the trait (unfortunately they don't match yet).
-    pub fn weight(&self) -> &'a E { self.weight }
+    pub fn weight(&self) -> &'a E {
+        self.weight
+    }
 }
 
 impl<'a, Ix, E> EdgeRef for EdgeReference<'a, E, Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     type NodeId = NodeIndex<Ix>;
     type EdgeId = EdgeIndex<Ix>;
     type Weight = E;
 
-    fn source(&self) -> Self::NodeId { self.node[0] }
-    fn target(&self) -> Self::NodeId { self.node[1] }
-    fn weight(&self) -> &E { self.weight }
-    fn id(&self) -> Self::EdgeId { self.index }
+    fn source(&self) -> Self::NodeId {
+        self.node[0]
+    }
+    fn target(&self) -> Self::NodeId {
+        self.node[1]
+    }
+    fn weight(&self) -> &E {
+        self.weight
+    }
+    fn id(&self) -> Self::EdgeId {
+        self.index
+    }
 }
 
-
 /// Iterator over all edges of a graph.
 pub struct EdgeReferences<'a, E: 'a, Ix: IndexType = DefaultIx> {
     iter: iter::Enumerate<slice::Iter<'a, Edge<E, Ix>>>,
 }
 
 impl<'a, E, Ix> Iterator for EdgeReferences<'a, E, Ix>
-    where Ix: IndexType
+where
+    Ix: IndexType,
 {
     type Item = EdgeReference<'a, E, Ix>;
 
     fn next(&mut self) -> Option<Self::Item> {
-        self.iter.next().map(|(i, edge)|
-            EdgeReference {
-                index: edge_index(i),
-                node: edge.node,
-                weight: &edge.weight,
-            }
-        )
+        self.iter.next().map(|(i, edge)| EdgeReference {
+            index: edge_index(i),
+            node: edge.node,
+            weight: &edge.weight,
+        })
     }
 
     fn size_hint(&self) -> (usize, Option<usize>) {
@@ -2053,26 +2140,23 @@
 }
 
 impl<'a, E, Ix> DoubleEndedIterator for EdgeReferences<'a, E, Ix>
-    where Ix: IndexType
+where
+    Ix: IndexType,
 {
     fn next_back(&mut self) -> Option<Self::Item> {
-        self.iter.next_back().map(|(i, edge)|
-            EdgeReference {
-                index: edge_index(i),
-                node: edge.node,
-                weight: &edge.weight,
-            }
-        )
+        self.iter.next_back().map(|(i, edge)| EdgeReference {
+            index: edge_index(i),
+            node: edge.node,
+            weight: &edge.weight,
+        })
     }
 }
 
-impl<'a, E, Ix> ExactSizeIterator for EdgeReferences<'a, E, Ix>
-    where Ix: IndexType
-{}
+impl<'a, E, Ix> ExactSizeIterator for EdgeReferences<'a, E, Ix> where Ix: IndexType {}
 
+mod frozen;
 #[cfg(feature = "stable_graph")]
 pub mod stable_graph;
-mod frozen;
 
 /// `Frozen` is a graph wrapper.
 ///
diff --git a/src/graph_impl/serialization.rs b/src/graph_impl/serialization.rs
index 8c93c2e..30f258b 100644
--- a/src/graph_impl/serialization.rs
+++ b/src/graph_impl/serialization.rs
@@ -1,19 +1,18 @@
-
 use serde::de::Error;
 
 use std::marker::PhantomData;
 
 use crate::prelude::*;
 
-use crate::EdgeType;
 use crate::graph::Node;
-use crate::graph::{IndexType, Edge};
-use crate::serde_utils::MappedSequenceVisitor;
+use crate::graph::{Edge, IndexType};
 use crate::serde_utils::CollectSeqWithLength;
-use crate::serde_utils::{IntoSerializable, FromDeserialized};
+use crate::serde_utils::MappedSequenceVisitor;
+use crate::serde_utils::{FromDeserialized, IntoSerializable};
+use crate::EdgeType;
 
-use super::{NodeIndex, EdgeIndex};
-use serde::{Serialize, Serializer, Deserialize, Deserializer};
+use super::{EdgeIndex, NodeIndex};
+use serde::{Deserialize, Deserializer, Serialize, Serializer};
 
 /// Serialization representation for Graph
 /// Keep in sync with deserialization and StableGraph
@@ -28,7 +27,7 @@
 /// }
 ///
 /// The same format is used by both Graph and StableGraph.
-/// 
+///
 /// For graph there are restrictions:
 /// node_holes is always empty and edges are always Some
 ///
@@ -42,11 +41,11 @@
 #[serde(rename = "Graph")]
 #[serde(bound(serialize = "N: Serialize, E: Serialize, Ix: IndexType + Serialize"))]
 pub struct SerGraph<'a, N: 'a, E: 'a, Ix: 'a + IndexType> {
-    #[serde(serialize_with="ser_graph_nodes")]
+    #[serde(serialize_with = "ser_graph_nodes")]
     nodes: &'a [Node<N, Ix>],
     node_holes: &'a [NodeIndex<Ix>],
     edge_property: EdgeProperty,
-    #[serde(serialize_with="ser_graph_edges")]
+    #[serde(serialize_with = "ser_graph_edges")]
     edges: &'a [Edge<E, Ix>],
 }
 
@@ -54,62 +53,71 @@
 // Keep in sync with serialization and StableGraph
 #[derive(Deserialize)]
 #[serde(rename = "Graph")]
-#[serde(bound(deserialize = "N: Deserialize<'de>, E: Deserialize<'de>, Ix: IndexType + Deserialize<'de>"))]
+#[serde(bound(
+    deserialize = "N: Deserialize<'de>, E: Deserialize<'de>, Ix: IndexType + Deserialize<'de>"
+))]
 pub struct DeserGraph<N, E, Ix> {
-    #[serde(deserialize_with="deser_graph_nodes")]
+    #[serde(deserialize_with = "deser_graph_nodes")]
     nodes: Vec<Node<N, Ix>>,
-    #[serde(deserialize_with="deser_graph_node_holes")]
+    #[serde(deserialize_with = "deser_graph_node_holes")]
     #[allow(unused)]
-    #[serde(default="Vec::new")]
+    #[serde(default = "Vec::new")]
     node_holes: Vec<NodeIndex<Ix>>,
     edge_property: EdgeProperty,
-    #[serde(deserialize_with="deser_graph_edges")]
+    #[serde(deserialize_with = "deser_graph_edges")]
     edges: Vec<Edge<E, Ix>>,
 }
 
-
 impl<Ix> Serialize for NodeIndex<Ix>
-    where Ix: IndexType + Serialize,
+where
+    Ix: IndexType + Serialize,
 {
     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
-        where S: Serializer
+    where
+        S: Serializer,
     {
         self.0.serialize(serializer)
     }
 }
 
 impl<'de, Ix> Deserialize<'de> for NodeIndex<Ix>
-    where Ix: IndexType + Deserialize<'de>,
+where
+    Ix: IndexType + Deserialize<'de>,
 {
     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
-        where D: Deserializer<'de>
+    where
+        D: Deserializer<'de>,
     {
         Ok(NodeIndex(Ix::deserialize(deserializer)?))
     }
 }
 
 impl<Ix> Serialize for EdgeIndex<Ix>
-    where Ix: IndexType + Serialize,
+where
+    Ix: IndexType + Serialize,
 {
     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
-        where S: Serializer
+    where
+        S: Serializer,
     {
         self.0.serialize(serializer)
     }
 }
 
 impl<'de, Ix> Deserialize<'de> for EdgeIndex<Ix>
-    where Ix: IndexType + Deserialize<'de>,
+where
+    Ix: IndexType + Deserialize<'de>,
 {
     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
-        where D: Deserializer<'de>
+    where
+        D: Deserializer<'de>,
     {
         Ok(EdgeIndex(Ix::deserialize(deserializer)?))
     }
 }
 
 #[derive(Serialize, Deserialize)]
-#[serde(rename_all="lowercase")]
+#[serde(rename_all = "lowercase")]
 #[derive(Debug)]
 pub enum EdgeProperty {
     Undirected,
@@ -125,7 +133,10 @@
     }
 }
 
-impl<Ty> From<PhantomData<Ty>> for EdgeProperty where Ty: EdgeType {
+impl<Ty> From<PhantomData<Ty>> for EdgeProperty
+where
+    Ty: EdgeType,
+{
     fn from(_: PhantomData<Ty>) -> Self {
         if Ty::is_directed() {
             EdgeProperty::Directed
@@ -135,18 +146,22 @@
     }
 }
 
-
-impl<Ty> FromDeserialized for PhantomData<Ty> where Ty: EdgeType
+impl<Ty> FromDeserialized for PhantomData<Ty>
+where
+    Ty: EdgeType,
 {
     type Input = EdgeProperty;
     fn from_deserialized<E2>(input: Self::Input) -> Result<Self, E2>
-        where E2: Error
+    where
+        E2: Error,
     {
         if input.is_directed() != Ty::is_directed() {
-            Err(E2::custom(format_args!("graph edge property mismatch, \
+            Err(E2::custom(format_args!(
+                "graph edge property mismatch, \
                                         expected {:?}, found {:?}",
-                                        EdgeProperty::from(PhantomData::<Ty>),
-                                        input)))
+                EdgeProperty::from(PhantomData::<Ty>),
+                input
+            )))
         } else {
             Ok(PhantomData)
         }
@@ -154,58 +169,64 @@
 }
 
 fn ser_graph_nodes<S, N, Ix>(nodes: &&[Node<N, Ix>], serializer: S) -> Result<S::Ok, S::Error>
-    where S: Serializer,
-          N: Serialize,
-          Ix: Serialize + IndexType,
+where
+    S: Serializer,
+    N: Serialize,
+    Ix: Serialize + IndexType,
 {
-    serializer.collect_seq_exact(
-        nodes.iter()
-             .map(|node| &node.weight))
+    serializer.collect_seq_exact(nodes.iter().map(|node| &node.weight))
 }
 
 fn ser_graph_edges<S, E, Ix>(edges: &&[Edge<E, Ix>], serializer: S) -> Result<S::Ok, S::Error>
-    where S: Serializer,
-          E: Serialize,
-          Ix: Serialize + IndexType,
+where
+    S: Serializer,
+    E: Serialize,
+    Ix: Serialize + IndexType,
 {
     serializer.collect_seq_exact(
-        edges.iter()
-            .map(|edge| Some((
-               edge.source(),
-               edge.target(),
-               &edge.weight,
-            ))))
+        edges
+            .iter()
+            .map(|edge| Some((edge.source(), edge.target(), &edge.weight))),
+    )
 }
 
-
 fn deser_graph_nodes<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Node<N, Ix>>, D::Error>
-    where D: Deserializer<'de>,
-          N: Deserialize<'de>,
-          Ix: IndexType + Deserialize<'de>,
+where
+    D: Deserializer<'de>,
+    N: Deserialize<'de>,
+    Ix: IndexType + Deserialize<'de>,
 {
-    deserializer.deserialize_seq(MappedSequenceVisitor::new(|n|
+    deserializer.deserialize_seq(MappedSequenceVisitor::new(|n| {
         Ok(Node {
             weight: n,
             next: [EdgeIndex::end(); 2],
         })
-    ))
-}
-
-fn deser_graph_node_holes<'de, D, Ix>(deserializer: D) -> Result<Vec<NodeIndex<Ix>>, D::Error>
-    where D: Deserializer<'de>,
-          Ix: IndexType + Deserialize<'de>,
-{
-    deserializer.deserialize_seq(MappedSequenceVisitor::<NodeIndex<Ix>, NodeIndex<Ix>, _>::new(|_| {
-        Err("Graph can not have holes in the node set, found non-empty node_holes")
     }))
 }
 
-fn deser_graph_edges<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Edge<N, Ix>>, D::Error>
-    where D: Deserializer<'de>,
-          N: Deserialize<'de>,
-          Ix: IndexType + Deserialize<'de>,
+fn deser_graph_node_holes<'de, D, Ix>(deserializer: D) -> Result<Vec<NodeIndex<Ix>>, D::Error>
+where
+    D: Deserializer<'de>,
+    Ix: IndexType + Deserialize<'de>,
 {
-    deserializer.deserialize_seq(MappedSequenceVisitor::<Option<(NodeIndex<Ix>, NodeIndex<Ix>, N)>, _, _>::new(|x|
+    deserializer.deserialize_seq(
+        MappedSequenceVisitor::<NodeIndex<Ix>, NodeIndex<Ix>, _>::new(|_| {
+            Err("Graph can not have holes in the node set, found non-empty node_holes")
+        }),
+    )
+}
+
+fn deser_graph_edges<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Edge<N, Ix>>, D::Error>
+where
+    D: Deserializer<'de>,
+    N: Deserialize<'de>,
+    Ix: IndexType + Deserialize<'de>,
+{
+    deserializer.deserialize_seq(MappedSequenceVisitor::<
+        Option<(NodeIndex<Ix>, NodeIndex<Ix>, N)>,
+        _,
+        _,
+    >::new(|x| {
         if let Some((i, j, w)) = x {
             Ok(Edge {
                 weight: w,
@@ -215,12 +236,13 @@
         } else {
             Err("Graph can not have holes in the edge set, found None, expected edge")
         }
-    ))
+    }))
 }
 
 impl<'a, N, E, Ty, Ix> IntoSerializable for &'a Graph<N, E, Ty, Ix>
-    where Ix: IndexType,
-          Ty: EdgeType,
+where
+    Ix: IndexType,
+    Ty: EdgeType,
 {
     type Output = SerGraph<'a, N, E, Ix>;
     fn into_serializable(self) -> Self::Output {
@@ -235,39 +257,53 @@
 
 /// Requires crate feature `"serde-1"`
 impl<N, E, Ty, Ix> Serialize for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType + Serialize,
-          N: Serialize,
-          E: Serialize,
+where
+    Ty: EdgeType,
+    Ix: IndexType + Serialize,
+    N: Serialize,
+    E: Serialize,
 {
     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
-        where S: Serializer
+    where
+        S: Serializer,
     {
         self.into_serializable().serialize(serializer)
     }
 }
 
-
-pub fn invalid_node_err<E>(node_index: usize, len: usize) -> E where E: Error {
-    E::custom(format_args!("invalid value: node index `{}` does not exist in graph \
+pub fn invalid_node_err<E>(node_index: usize, len: usize) -> E
+where
+    E: Error,
+{
+    E::custom(format_args!(
+        "invalid value: node index `{}` does not exist in graph \
                            with node bound {}",
-                           node_index, len))
+        node_index, len
+    ))
 }
 
 pub fn invalid_length_err<Ix, E>(node_or_edge: &str, len: usize) -> E
-    where E: Error, Ix: IndexType
+where
+    E: Error,
+    Ix: IndexType,
 {
-    E::custom(format_args!("invalid size: graph {} count {} exceeds index type maximum {}",
-                           node_or_edge, len, <Ix as IndexType>::max().index()))
+    E::custom(format_args!(
+        "invalid size: graph {} count {} exceeds index type maximum {}",
+        node_or_edge,
+        len,
+        <Ix as IndexType>::max().index()
+    ))
 }
 
 impl<'a, N, E, Ty, Ix> FromDeserialized for Graph<N, E, Ty, Ix>
-    where Ix: IndexType,
-          Ty: EdgeType,
+where
+    Ix: IndexType,
+    Ty: EdgeType,
 {
     type Input = DeserGraph<N, E, Ix>;
     fn from_deserialized<E2>(input: Self::Input) -> Result<Self, E2>
-        where E2: Error
+    where
+        E2: Error,
     {
         let ty = PhantomData::<Ty>::from_deserialized(input.edge_property)?;
         let nodes = input.nodes;
@@ -286,23 +322,24 @@
             ty: ty,
         };
         let nc = gr.node_count();
-        gr.link_edges().map_err(|i| invalid_node_err(i.index(), nc))?;
+        gr.link_edges()
+            .map_err(|i| invalid_node_err(i.index(), nc))?;
         Ok(gr)
     }
 }
 
-
 /// Requires crate feature `"serde-1"`
 impl<'de, N, E, Ty, Ix> Deserialize<'de> for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType + Deserialize<'de>,
-          N: Deserialize<'de>,
-          E: Deserialize<'de>,
+where
+    Ty: EdgeType,
+    Ix: IndexType + Deserialize<'de>,
+    N: Deserialize<'de>,
+    E: Deserialize<'de>,
 {
     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
-        where D: Deserializer<'de>
+    where
+        D: Deserializer<'de>,
     {
         Self::from_deserialized(DeserGraph::deserialize(deserializer)?)
     }
 }
-
diff --git a/src/graph_impl/stable_graph/mod.rs b/src/graph_impl/stable_graph/mod.rs
index a0bae5b..7c98681 100644
--- a/src/graph_impl/stable_graph/mod.rs
+++ b/src/graph_impl/stable_graph/mod.rs
@@ -12,51 +12,21 @@
 use std::ops::{Index, IndexMut};
 use std::slice;
 
-use crate::{
-    Graph,
-    EdgeType,
-    Directed,
-    Undirected,
-    Direction,
-    Incoming,
-    Outgoing,
-};
+use crate::{Directed, Direction, EdgeType, Graph, Incoming, Outgoing, Undirected};
 
-use crate::iter_format::{
-    IterFormatExt,
-    NoPretty,
-    DebugMap,
-};
+use crate::iter_format::{DebugMap, IterFormatExt, NoPretty};
 use crate::iter_utils::IterUtilsExt;
 
-use super::{
-    Edge,
-    index_twice,
-    Node,
-    DIRECTIONS,
-    Pair,
-    Frozen,
+use super::{index_twice, Edge, Frozen, Node, Pair, DIRECTIONS};
+use crate::visit::{
+    EdgeRef, IntoEdgeReferences, IntoEdges, IntoEdgesDirected, IntoNodeReferences, NodeIndexable,
 };
 use crate::IntoWeightedEdge;
-use crate::visit::{
-    EdgeRef,
-    IntoNodeReferences,
-    IntoEdges,
-    IntoEdgesDirected,
-    IntoEdgeReferences,
-    NodeIndexable,
-};
 
 // reexport those things that are shared with Graph
 #[doc(no_inline)]
 pub use crate::graph::{
-    NodeIndex,
-    EdgeIndex,
-    GraphIndex,
-    IndexType,
-    DefaultIx,
-    node_index,
-    edge_index,
+    edge_index, node_index, DefaultIx, EdgeIndex, GraphIndex, IndexType, NodeIndex,
 };
 
 use crate::util::enumerate;
@@ -100,8 +70,7 @@
 /// Depends on crate feature `stable_graph` (default). *Stable Graph is still
 /// missing a few methods compared to Graph. You can contribute to help it
 /// achieve parity.*
-pub struct StableGraph<N, E, Ty = Directed, Ix = DefaultIx>
-{
+pub struct StableGraph<N, E, Ty = Directed, Ix = DefaultIx> {
     g: Graph<Option<N>, Option<E>, Ty, Ix>,
     node_count: usize,
     edge_count: usize,
@@ -130,41 +99,60 @@
 pub type StableUnGraph<N, E, Ix = DefaultIx> = StableGraph<N, E, Undirected, Ix>;
 
 impl<N, E, Ty, Ix> fmt::Debug for StableGraph<N, E, Ty, Ix>
-    where N: fmt::Debug,
-          E: fmt::Debug,
-          Ty: EdgeType,
-          Ix: IndexType,
+where
+    N: fmt::Debug,
+    E: fmt::Debug,
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        let etype = if self.is_directed() { "Directed" } else { "Undirected" };
+        let etype = if self.is_directed() {
+            "Directed"
+        } else {
+            "Undirected"
+        };
         let mut fmt_struct = f.debug_struct("StableGraph");
         fmt_struct.field("Ty", &etype);
         fmt_struct.field("node_count", &self.node_count);
         fmt_struct.field("edge_count", &self.edge_count);
         if self.g.edges.iter().any(|e| e.weight.is_some()) {
-            fmt_struct.field("edges", &self.g.edges.iter()
-                .filter(|e| e.weight.is_some())
-                .map(|e| NoPretty((e.source().index(), e.target().index())))
-                .format(", "));
+            fmt_struct.field(
+                "edges",
+                &self
+                    .g
+                    .edges
+                    .iter()
+                    .filter(|e| e.weight.is_some())
+                    .map(|e| NoPretty((e.source().index(), e.target().index())))
+                    .format(", "),
+            );
         }
         // skip weights if they are ZST!
         if size_of::<N>() != 0 {
-            fmt_struct.field("node weights",
-            &DebugMap(||
-                self.g.nodes.iter()
-                    .map(|n| n.weight.as_ref())
-                    .enumerate()
-                    .filter_map(|(i, wo)| wo.map(move |w| (i, w)))
-                   ));
+            fmt_struct.field(
+                "node weights",
+                &DebugMap(|| {
+                    self.g
+                        .nodes
+                        .iter()
+                        .map(|n| n.weight.as_ref())
+                        .enumerate()
+                        .filter_map(|(i, wo)| wo.map(move |w| (i, w)))
+                }),
+            );
         }
         if size_of::<E>() != 0 {
-            fmt_struct.field("edge weights",
-            &DebugMap(||
-                self.g.edges.iter()
-                    .map(|n| n.weight.as_ref())
-                    .enumerate()
-                    .filter_map(|(i, wo)| wo.map(move |w| (i, w)))
-                   ));
+            fmt_struct.field(
+                "edge weights",
+                &DebugMap(|| {
+                    self.g
+                        .edges
+                        .iter()
+                        .map(|n| n.weight.as_ref())
+                        .enumerate()
+                        .filter_map(|(i, wo)| wo.map(move |w| (i, w)))
+                }),
+            );
         }
         fmt_struct.field("free_node", &self.free_node);
         fmt_struct.field("free_edge", &self.free_edge);
@@ -172,7 +160,6 @@
     }
 }
 
-
 impl<N, E> StableGraph<N, E, Directed> {
     /// Create a new `StableGraph` with directed edges.
     ///
@@ -185,8 +172,9 @@
 }
 
 impl<N, E, Ty, Ix> StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     /// Create a new `StableGraph` with estimated capacity.
     pub fn with_capacity(nodes: usize, edges: usize) -> Self {
@@ -298,7 +286,7 @@
             loop {
                 let next = self.g.nodes[a.index()].next[k];
                 if next == EdgeIndex::end() {
-                    break
+                    break;
                 }
                 let ret = self.remove_edge(next);
                 debug_assert!(ret.is_some());
@@ -322,8 +310,10 @@
 
     // Return the Node if it is not vacant (non-None weight)
     fn get_node(&self, a: NodeIndex<Ix>) -> Option<&Node<Option<N>, Ix>> {
-        self.g.nodes.get(a.index())
-                    .and_then(|node| node.weight.as_ref().map(move |_| node))
+        self.g
+            .nodes
+            .get(a.index())
+            .and_then(|node| node.weight.as_ref().map(move |_| node))
     }
 
     /// Add an edge from `a` to `b` to the graph, with its associated
@@ -338,9 +328,7 @@
     /// its index type.
     ///
     /// **Note:** `StableGraph` allows adding parallel (“duplicate”) edges.
-    pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E)
-        -> EdgeIndex<Ix>
-    {
+    pub fn add_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix> {
         let edge_idx;
         let mut new_edge = None::<Edge<_, _>>;
         {
@@ -391,7 +379,10 @@
                 }
             };
             if let Some(i) = wrong_index {
-                panic!("StableGraph::add_edge: node index {} is not a node in the graph", i);
+                panic!(
+                    "StableGraph::add_edge: node index {} is not a node in the graph",
+                    i
+                );
             }
             self.edge_count += 1;
         }
@@ -424,9 +415,7 @@
     /// connected to `a` (and `b`, if the graph edges are undirected).
     ///
     /// **Panics** if any of the nodes don't exist.
-    pub fn update_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E)
-        -> EdgeIndex<Ix>
-    {
+    pub fn update_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>, weight: E) -> EdgeIndex<Ix> {
         if let Some(ix) = self.find_edge(a, b) {
             self[ix] = weight;
             return ix;
@@ -488,7 +477,7 @@
     /// Return an iterator over the node indices of the graph
     pub fn node_indices(&self) -> NodeIndices<N, Ix> {
         NodeIndices {
-            iter: enumerate(self.raw_nodes())
+            iter: enumerate(self.raw_nodes()),
         }
     }
 
@@ -513,9 +502,7 @@
     }
 
     /// Access the source and target nodes for `e`.
-    pub fn edge_endpoints(&self, e: EdgeIndex<Ix>)
-        -> Option<(NodeIndex<Ix>, NodeIndex<Ix>)>
-    {
+    pub fn edge_endpoints(&self, e: EdgeIndex<Ix>) -> Option<(NodeIndex<Ix>, NodeIndex<Ix>)> {
         match self.g.edges.get(e.index()) {
             Some(ed) if ed.weight.is_some() => Some((ed.source(), ed.target())),
             _otherwise => None,
@@ -525,7 +512,7 @@
     /// Return an iterator over the node indices of the graph
     pub fn edge_indices(&self) -> EdgeIndices<E, Ix> {
         EdgeIndices {
-            iter: enumerate(self.raw_edges())
+            iter: enumerate(self.raw_edges()),
         }
     }
 
@@ -541,14 +528,13 @@
     ///
     /// Computes in **O(e')** time, where **e'** is the number of edges
     /// connected to `a` (and `b`, if the graph edges are undirected).
-    pub fn find_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<EdgeIndex<Ix>>
-    {
+    pub fn find_edge(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<EdgeIndex<Ix>> {
         if !self.is_directed() {
             self.find_edge_undirected(a, b).map(|(ix, _)| ix)
         } else {
             match self.get_node(a) {
                 None => None,
-                Some(node) => self.g.find_edge_directed_from_node(node, b)
+                Some(node) => self.g.find_edge_directed_from_node(node, b),
             }
         }
     }
@@ -560,15 +546,17 @@
     /// Return the edge index and its directionality, with `Outgoing` meaning
     /// from `a` to `b` and `Incoming` the reverse,
     /// or `None` if the edge does not exist.
-    pub fn find_edge_undirected(&self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> Option<(EdgeIndex<Ix>, Direction)>
-    {
+    pub fn find_edge_undirected(
+        &self,
+        a: NodeIndex<Ix>,
+        b: NodeIndex<Ix>,
+    ) -> Option<(EdgeIndex<Ix>, Direction)> {
         match self.get_node(a) {
             None => None,
             Some(node) => self.g.find_edge_undirected_from_node(node, b),
         }
     }
 
-
     /// Return an iterator of all nodes with an edge starting from `a`.
     ///
     /// - `Directed`: Outgoing edges from `a`.
@@ -600,9 +588,7 @@
     /// not borrow from the graph.
     ///
     /// [1]: struct.Neighbors.html#method.detach
-    pub fn neighbors_directed(&self, a: NodeIndex<Ix>, dir: Direction)
-        -> Neighbors<E, Ix>
-    {
+    pub fn neighbors_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Neighbors<E, Ix> {
         let mut iter = self.neighbors_undirected(a);
         if self.is_directed() {
             let k = dir.index();
@@ -625,15 +611,14 @@
     /// not borrow from the graph.
     ///
     /// [1]: struct.Neighbors.html#method.detach
-    pub fn neighbors_undirected(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix>
-    {
+    pub fn neighbors_undirected(&self, a: NodeIndex<Ix>) -> Neighbors<E, Ix> {
         Neighbors {
             skip_start: a,
             edges: &self.g.edges,
             next: match self.get_node(a) {
                 None => [EdgeIndex::end(), EdgeIndex::end()],
                 Some(n) => n.next,
-            }
+            },
         }
     }
 
@@ -659,8 +644,7 @@
     ///
     /// Produces an empty iterator if the node `a` doesn't exist.<br>
     /// Iterator element type is `EdgeReference<E, Ix>`.
-    pub fn edges_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Edges<E, Ty, Ix>
-    {
+    pub fn edges_directed(&self, a: NodeIndex<Ix>, dir: Direction) -> Edges<E, Ty, Ix> {
         Edges {
             skip_start: a,
             edges: &self.g.edges,
@@ -684,30 +668,40 @@
     /// just the nodes without edges.
     ///
     /// The whole iteration computes in **O(|V|)** time.
-    pub fn externals(&self, dir: Direction) -> Externals<N, Ty, Ix>
-    {
-        Externals { iter: self.raw_nodes().iter().enumerate(), dir, ty: PhantomData }
+    pub fn externals(&self, dir: Direction) -> Externals<N, Ty, Ix> {
+        Externals {
+            iter: self.raw_nodes().iter().enumerate(),
+            dir,
+            ty: PhantomData,
+        }
     }
 
     /// Index the `StableGraph` by two indices, any combination of
     /// node or edge indices is fine.
     ///
     /// **Panics** if the indices are equal or if they are out of bounds.
-    pub fn index_twice_mut<T, U>(&mut self, i: T, j: U)
-        -> (&mut <Self as Index<T>>::Output,
-            &mut <Self as Index<U>>::Output)
-        where Self: IndexMut<T> + IndexMut<U>,
-              T: GraphIndex,
-              U: GraphIndex,
+    pub fn index_twice_mut<T, U>(
+        &mut self,
+        i: T,
+        j: U,
+    ) -> (
+        &mut <Self as Index<T>>::Output,
+        &mut <Self as Index<U>>::Output,
+    )
+    where
+        Self: IndexMut<T> + IndexMut<U>,
+        T: GraphIndex,
+        U: GraphIndex,
     {
-        assert!(T::is_node_index() != U::is_node_index() ||
-                i.index() != j.index());
+        assert!(T::is_node_index() != U::is_node_index() || i.index() != j.index());
 
         // Allow two mutable indexes here -- they are nonoverlapping
         unsafe {
             let self_mut = self as *mut _;
-            (<Self as IndexMut<T>>::index_mut(&mut *self_mut, i),
-             <Self as IndexMut<U>>::index_mut(&mut *self_mut, j))
+            (
+                <Self as IndexMut<T>>::index_mut(&mut *self_mut, i),
+                <Self as IndexMut<U>>::index_mut(&mut *self_mut, j),
+            )
         }
     }
 
@@ -726,7 +720,10 @@
     /// Computes in **O(n + e')** time, where **n** is the number of node indices and
     ///  **e'** is the number of affected edges, including *n* calls to `.remove_edge()`
     /// where *n* is the number of edges with an endpoint in a removed node.
-    pub fn retain_nodes<F>(&mut self, mut visit: F) where F: FnMut(Frozen<Self>, NodeIndex<Ix>) -> bool {
+    pub fn retain_nodes<F>(&mut self, mut visit: F)
+    where
+        F: FnMut(Frozen<Self>, NodeIndex<Ix>) -> bool,
+    {
         for i in 0..self.node_bound() {
             let ix = node_index(i);
             if self.contains_node(ix) && !visit(Frozen(self), ix) {
@@ -749,7 +746,8 @@
     /// Computes in **O(e'')** time, **e'** is the number of affected edges,
     /// including the calls to `.remove_edge()` for each removed edge.
     pub fn retain_edges<F>(&mut self, mut visit: F)
-        where F: FnMut(Frozen<Self>, EdgeIndex<Ix>) -> bool
+    where
+        F: FnMut(Frozen<Self>, EdgeIndex<Ix>) -> bool,
     {
         for i in 0..self.edge_bound() {
             let ix = edge_index(i);
@@ -778,10 +776,11 @@
     /// ]);
     /// ```
     pub fn from_edges<I>(iterable: I) -> Self
-        where I: IntoIterator,
-              I::Item: IntoWeightedEdge<E>,
-              <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
-              N: Default,
+    where
+        I: IntoIterator,
+        I::Item: IntoWeightedEdge<E>,
+        <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
+        N: Default,
     {
         let mut g = Self::with_capacity(0, 0);
         g.extend_with_edges(iterable);
@@ -793,14 +792,19 @@
     ///
     /// The resulting graph has the same structure and the same
     /// graph indices as `self`.
-    pub fn map<'a, F, G, N2, E2>(&'a self, mut node_map: F, mut edge_map: G)
-        -> StableGraph<N2, E2, Ty, Ix>
-        where F: FnMut(NodeIndex<Ix>, &'a N) -> N2,
-              G: FnMut(EdgeIndex<Ix>, &'a E) -> E2,
+    pub fn map<'a, F, G, N2, E2>(
+        &'a self,
+        mut node_map: F,
+        mut edge_map: G,
+    ) -> StableGraph<N2, E2, Ty, Ix>
+    where
+        F: FnMut(NodeIndex<Ix>, &'a N) -> N2,
+        G: FnMut(EdgeIndex<Ix>, &'a E) -> E2,
     {
         let g = self.g.map(
             move |i, w| w.as_ref().map(|w| node_map(i, w)),
-            move |i, w| w.as_ref().map(|w| edge_map(i, w)));
+            move |i, w| w.as_ref().map(|w| edge_map(i, w)),
+        );
         StableGraph {
             g,
             node_count: self.node_count,
@@ -821,10 +825,14 @@
     /// The resulting graph has the structure of a subgraph of the original graph.
     /// Nodes and edges that are not removed maintain their old node or edge
     /// indices.
-    pub fn filter_map<'a, F, G, N2, E2>(&'a self, mut node_map: F, mut edge_map: G)
-        -> StableGraph<N2, E2, Ty, Ix>
-        where F: FnMut(NodeIndex<Ix>, &'a N) -> Option<N2>,
-              G: FnMut(EdgeIndex<Ix>, &'a E) -> Option<E2>,
+    pub fn filter_map<'a, F, G, N2, E2>(
+        &'a self,
+        mut node_map: F,
+        mut edge_map: G,
+    ) -> StableGraph<N2, E2, Ty, Ix>
+    where
+        F: FnMut(NodeIndex<Ix>, &'a N) -> Option<N2>,
+        G: FnMut(EdgeIndex<Ix>, &'a E) -> Option<E2>,
     {
         let node_bound = self.node_bound();
         let edge_bound = self.edge_bound();
@@ -837,7 +845,9 @@
         // the stable graph keeps the node map itself
 
         for (i, node) in enumerate(self.raw_nodes()) {
-            if i >= node_bound { break; }
+            if i >= node_bound {
+                break;
+            }
             if let Some(node_weight) = node.weight.as_ref() {
                 if let Some(new_weight) = node_map(NodeIndex::new(i), node_weight) {
                     result_g.add_node(new_weight);
@@ -847,7 +857,9 @@
             result_g.add_vacant_node(&mut free_node);
         }
         for (i, edge) in enumerate(self.raw_edges()) {
-            if i >= edge_bound { break; }
+            if i >= edge_bound {
+                break;
+            }
             let source = edge.source();
             let target = edge.target();
             if let Some(edge_weight) = edge.weight.as_ref() {
@@ -874,10 +886,11 @@
     ///
     /// Nodes are inserted automatically to match the edges.
     pub fn extend_with_edges<I>(&mut self, iterable: I)
-        where I: IntoIterator,
-              I::Item: IntoWeightedEdge<E>,
-              <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
-              N: Default,
+    where
+        I: IntoIterator,
+        I::Item: IntoWeightedEdge<E>,
+        <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
+        N: Default,
     {
         let iter = iterable.into_iter();
 
@@ -959,7 +972,7 @@
     }
 
     #[cfg(not(debug_assertions))]
-    fn check_free_lists(&self) { }
+    fn check_free_lists(&self) {}
     #[cfg(debug_assertions)]
     // internal method to debug check the free lists (linked lists)
     fn check_free_lists(&self) {
@@ -972,8 +985,11 @@
                     free_node_len += 1;
                     continue;
                 }
-                debug_assert!(false, "Corrupt free list: pointing to existing {:?}",
-                              free_node.index());
+                debug_assert!(
+                    false,
+                    "Corrupt free list: pointing to existing {:?}",
+                    free_node.index()
+                );
             }
             debug_assert!(false, "Corrupt free list: missing {:?}", free_node.index());
         }
@@ -988,8 +1004,11 @@
                     free_edge_len += 1;
                     continue;
                 }
-                debug_assert!(false, "Corrupt free list: pointing to existing {:?}",
-                              free_node.index());
+                debug_assert!(
+                    false,
+                    "Corrupt free list: pointing to existing {:?}",
+                    free_node.index()
+                );
             }
             debug_assert!(false, "Corrupt free list: missing {:?}", free_edge.index());
         }
@@ -999,7 +1018,9 @@
 
 /// The resulting cloned graph has the same graph indices as `self`.
 impl<N, E, Ty, Ix: IndexType> Clone for StableGraph<N, E, Ty, Ix>
-    where N: Clone, E: Clone,
+where
+    N: Clone,
+    E: Clone,
 {
     fn clone(&self) -> Self {
         StableGraph {
@@ -1023,7 +1044,8 @@
 /// Index the `StableGraph` by `NodeIndex` to access node weights.
 ///
 /// **Panics** if the node doesn't exist.
-impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for StableGraph<N, E, Ty, Ix> where
+impl<N, E, Ty, Ix> Index<NodeIndex<Ix>> for StableGraph<N, E, Ty, Ix>
+where
     Ty: EdgeType,
     Ix: IndexType,
 {
@@ -1036,20 +1058,21 @@
 /// Index the `StableGraph` by `NodeIndex` to access node weights.
 ///
 /// **Panics** if the node doesn't exist.
-impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for StableGraph<N, E, Ty, Ix> where
+impl<N, E, Ty, Ix> IndexMut<NodeIndex<Ix>> for StableGraph<N, E, Ty, Ix>
+where
     Ty: EdgeType,
     Ix: IndexType,
 {
     fn index_mut(&mut self, index: NodeIndex<Ix>) -> &mut N {
         self.node_weight_mut(index).unwrap()
     }
-
 }
 
 /// Index the `StableGraph` by `EdgeIndex` to access edge weights.
 ///
 /// **Panics** if the edge doesn't exist.
-impl<N, E, Ty, Ix> Index<EdgeIndex<Ix>> for StableGraph<N, E, Ty, Ix> where
+impl<N, E, Ty, Ix> Index<EdgeIndex<Ix>> for StableGraph<N, E, Ty, Ix>
+where
     Ty: EdgeType,
     Ix: IndexType,
 {
@@ -1062,7 +1085,8 @@
 /// Index the `StableGraph` by `EdgeIndex` to access edge weights.
 ///
 /// **Panics** if the edge doesn't exist.
-impl<N, E, Ty, Ix> IndexMut<EdgeIndex<Ix>> for StableGraph<N, E, Ty, Ix> where
+impl<N, E, Ty, Ix> IndexMut<EdgeIndex<Ix>> for StableGraph<N, E, Ty, Ix>
+where
     Ty: EdgeType,
     Ix: IndexType,
 {
@@ -1073,10 +1097,13 @@
 
 /// Create a new empty `StableGraph`.
 impl<N, E, Ty, Ix> Default for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
-    fn default() -> Self { Self::with_capacity(0, 0) }
+    fn default() -> Self {
+        Self::with_capacity(0, 0)
+    }
 }
 
 /// Convert a `Graph` into a `StableGraph`
@@ -1086,8 +1113,9 @@
 /// The resulting graph has the same node and edge indices as
 /// the original graph.
 impl<N, E, Ty, Ix> From<Graph<N, E, Ty, Ix>> for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn from(g: Graph<N, E, Ty, Ix>) -> Self {
         let nodes = g.nodes.into_iter().map(|e| Node {
@@ -1102,7 +1130,11 @@
         StableGraph {
             node_count: nodes.len(),
             edge_count: edges.len(),
-            g: Graph { edges: edges.collect(), nodes: nodes.collect(), ty: g.ty },
+            g: Graph {
+                edges: edges.collect(),
+                nodes: nodes.collect(),
+                ty: g.ty,
+            },
             free_node: NodeIndex::end(),
             free_edge: EdgeIndex::end(),
         }
@@ -1120,8 +1152,9 @@
 /// equal to node count, and the same for edges), would the resulting graph have
 /// the same node and edge indices as the input.
 impl<N, E, Ty, Ix> From<StableGraph<N, E, Ty, Ix>> for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn from(graph: StableGraph<N, E, Ty, Ix>) -> Self {
         let mut result_g = Graph::with_capacity(graph.node_count(), graph.edge_count());
@@ -1149,14 +1182,15 @@
 }
 
 impl<'a, N, E, Ty, Ix> IntoNodeReferences for &'a StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type NodeRef = (NodeIndex<Ix>, &'a N);
     type NodeReferences = NodeReferences<'a, N, Ix>;
     fn node_references(self) -> Self::NodeReferences {
         NodeReferences {
-            iter: enumerate(self.raw_nodes())
+            iter: enumerate(self.raw_nodes()),
         }
     }
 }
@@ -1167,14 +1201,14 @@
 }
 
 impl<'a, N, Ix> Iterator for NodeReferences<'a, N, Ix>
-    where Ix: IndexType
+where
+    Ix: IndexType,
 {
     type Item = (NodeIndex<Ix>, &'a N);
 
     fn next(&mut self) -> Option<Self::Item> {
-        self.iter.ex_find_map(|(i, node)| {
-            node.weight.as_ref().map(move |w| (node_index(i), w))
-        })
+        self.iter
+            .ex_find_map(|(i, node)| node.weight.as_ref().map(move |w| (node_index(i), w)))
     }
 
     fn size_hint(&self) -> (usize, Option<usize>) {
@@ -1184,12 +1218,12 @@
 }
 
 impl<'a, N, Ix> DoubleEndedIterator for NodeReferences<'a, N, Ix>
-    where Ix: IndexType
+where
+    Ix: IndexType,
 {
     fn next_back(&mut self) -> Option<Self::Item> {
-        self.iter.ex_rfind_map(|(i, node)| {
-            node.weight.as_ref().map(move |w| (node_index(i), w))
-        })
+        self.iter
+            .ex_rfind_map(|(i, node)| node.weight.as_ref().map(move |w| (node_index(i), w)))
     }
 }
 
@@ -1207,10 +1241,11 @@
     }
 }
 
-impl<'a, E, Ix: IndexType> Copy for EdgeReference<'a, E, Ix> { }
+impl<'a, E, Ix: IndexType> Copy for EdgeReference<'a, E, Ix> {}
 
 impl<'a, E, Ix: IndexType> PartialEq for EdgeReference<'a, E, Ix>
-    where E: PartialEq,
+where
+    E: PartialEq,
 {
     fn eq(&self, rhs: &Self) -> bool {
         self.index == rhs.index && self.weight == rhs.weight
@@ -1218,31 +1253,44 @@
 }
 
 impl<'a, Ix, E> EdgeReference<'a, E, Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     /// Access the edge’s weight.
     ///
     /// **NOTE** that this method offers a longer lifetime
     /// than the trait (unfortunately they don't match yet).
-    pub fn weight(&self) -> &'a E { self.weight }
+    pub fn weight(&self) -> &'a E {
+        self.weight
+    }
 }
 
 impl<'a, Ix, E> EdgeRef for EdgeReference<'a, E, Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     type NodeId = NodeIndex<Ix>;
     type EdgeId = EdgeIndex<Ix>;
     type Weight = E;
 
-    fn source(&self) -> Self::NodeId { self.node[0] }
-    fn target(&self) -> Self::NodeId { self.node[1] }
-    fn weight(&self) -> &E { self.weight }
-    fn id(&self) -> Self::EdgeId { self.index }
+    fn source(&self) -> Self::NodeId {
+        self.node[0]
+    }
+    fn target(&self) -> Self::NodeId {
+        self.node[1]
+    }
+    fn weight(&self) -> &E {
+        self.weight
+    }
+    fn id(&self) -> Self::EdgeId {
+        self.index
+    }
 }
 
 impl<'a, N, E, Ty, Ix> IntoEdges for &'a StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Edges = Edges<'a, E, Ty, Ix>;
     fn edges(self, a: Self::NodeId) -> Self::Edges {
@@ -1251,8 +1299,9 @@
 }
 
 impl<'a, N, E, Ty, Ix> IntoEdgesDirected for &'a StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type EdgesDirected = Edges<'a, E, Ty, Ix>;
     fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::EdgesDirected {
@@ -1262,8 +1311,9 @@
 
 /// Iterator over the edges of from or to a node
 pub struct Edges<'a, E: 'a, Ty, Ix: 'a = DefaultIx>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     /// starting node to skip over
     skip_start: NodeIndex<Ix>,
@@ -1279,8 +1329,9 @@
 }
 
 impl<'a, E, Ty, Ix> Iterator for Edges<'a, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Item = EdgeReference<'a, E, Ix>;
 
@@ -1302,7 +1353,12 @@
 
         if iterate_over.unwrap_or(Outgoing) == Outgoing {
             let i = self.next[0].index();
-            if let Some(Edge { node, weight: Some(weight), next }) = self.edges.get(i) {
+            if let Some(Edge {
+                node,
+                weight: Some(weight),
+                next,
+            }) = self.edges.get(i)
+            {
                 self.next[0] = next[0];
                 return Some(EdgeReference {
                     index: edge_index(i),
@@ -1335,7 +1391,7 @@
                         *node
                     },
                     weight: weight.as_ref().unwrap(),
-                })
+                });
             }
         }
 
@@ -1349,8 +1405,9 @@
 }
 
 impl<'a, N: 'a, E: 'a, Ty, Ix> IntoEdgeReferences for &'a StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type EdgeRef = EdgeReference<'a, E, Ix>;
     type EdgeReferences = EdgeReferences<'a, E, Ix>;
@@ -1360,10 +1417,9 @@
     /// Iterator element type is `EdgeReference<E, Ix>`.
     fn edge_references(self) -> Self::EdgeReferences {
         EdgeReferences {
-            iter: self.g.edges.iter().enumerate()
+            iter: self.g.edges.iter().enumerate(),
         }
     }
-
 }
 
 /// Iterator over all edges of a graph.
@@ -1372,34 +1428,34 @@
 }
 
 impl<'a, E, Ix> Iterator for EdgeReferences<'a, E, Ix>
-    where Ix: IndexType
+where
+    Ix: IndexType,
 {
     type Item = EdgeReference<'a, E, Ix>;
 
     fn next(&mut self) -> Option<Self::Item> {
-        self.iter.ex_find_map(|(i, edge)|
-            edge.weight.as_ref().map(move |weight| {
-                EdgeReference {
-                    index: edge_index(i),
-                    node: edge.node,
-                    weight,
-                }
-            }))
+        self.iter.ex_find_map(|(i, edge)| {
+            edge.weight.as_ref().map(move |weight| EdgeReference {
+                index: edge_index(i),
+                node: edge.node,
+                weight,
+            })
+        })
     }
 }
 
 impl<'a, E, Ix> DoubleEndedIterator for EdgeReferences<'a, E, Ix>
-    where Ix: IndexType
+where
+    Ix: IndexType,
 {
     fn next_back(&mut self) -> Option<Self::Item> {
-        self.iter.ex_rfind_map(|(i, edge)|
-            edge.weight.as_ref().map(move |weight| {
-                EdgeReference {
-                    index: edge_index(i),
-                    node: edge.node,
-                    weight,
-                }
-            }))
+        self.iter.ex_rfind_map(|(i, edge)| {
+            edge.weight.as_ref().map(move |weight| EdgeReference {
+                index: edge_index(i),
+                node: edge.node,
+                weight,
+            })
+        })
     }
 }
 
@@ -1410,27 +1466,27 @@
     ty: PhantomData<Ty>,
 }
 
-impl<'a, N: 'a, Ty, Ix> Iterator for Externals<'a, N, Ty, Ix> where
+impl<'a, N: 'a, Ty, Ix> Iterator for Externals<'a, N, Ty, Ix>
+where
     Ty: EdgeType,
     Ix: IndexType,
 {
     type Item = NodeIndex<Ix>;
-    fn next(&mut self) -> Option<NodeIndex<Ix>>
-    {
+    fn next(&mut self) -> Option<NodeIndex<Ix>> {
         let k = self.dir.index();
         loop {
             match self.iter.next() {
                 None => return None,
                 Some((index, node)) => {
-                    if node.weight.is_some() &&
-                        node.next[k] == EdgeIndex::end() &&
-                        (Ty::is_directed() ||
-                         node.next[1-k] == EdgeIndex::end()) {
-                        return Some(NodeIndex::new(index))
+                    if node.weight.is_some()
+                        && node.next[k] == EdgeIndex::end()
+                        && (Ty::is_directed() || node.next[1 - k] == EdgeIndex::end())
+                    {
+                        return Some(NodeIndex::new(index));
                     } else {
-                        continue
+                        continue;
                     }
-                },
+                }
             }
         }
     }
@@ -1439,8 +1495,7 @@
 /// Iterator over the neighbors of a node.
 ///
 /// Iterator element type is `NodeIndex`.
-pub struct Neighbors<'a, E: 'a, Ix: 'a = DefaultIx>
-{
+pub struct Neighbors<'a, E: 'a, Ix: 'a = DefaultIx> {
     /// starting node to skip over
     skip_start: NodeIndex<Ix>,
     edges: &'a [Edge<Option<E>, Ix>],
@@ -1448,7 +1503,8 @@
 }
 
 impl<'a, E, Ix> Neighbors<'a, E, Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     /// Return a “walker” object that can be used to step through the
     /// neighbors and edges from the origin node.
@@ -1459,13 +1515,14 @@
         WalkNeighbors {
             inner: super::WalkNeighbors {
                 skip_start: self.skip_start,
-                next: self.next
+                next: self.next,
             },
         }
     }
 }
 
-impl<'a, E, Ix> Iterator for Neighbors<'a, E, Ix> where
+impl<'a, E, Ix> Iterator for Neighbors<'a, E, Ix>
+where
     Ix: IndexType,
 {
     type Item = NodeIndex<Ix>;
@@ -1546,20 +1603,24 @@
     /// where the `WalkNeighbors` value was created.
     /// For an `Outgoing` walk, the target nodes,
     /// for an `Incoming` walk, the source nodes of the edge.
-    pub fn next<N, E, Ty: EdgeType>(&mut self, g: &StableGraph<N, E, Ty, Ix>)
-        -> Option<(EdgeIndex<Ix>, NodeIndex<Ix>)> {
+    pub fn next<N, E, Ty: EdgeType>(
+        &mut self,
+        g: &StableGraph<N, E, Ty, Ix>,
+    ) -> Option<(EdgeIndex<Ix>, NodeIndex<Ix>)> {
         self.inner.next(&g.g)
     }
 
-    pub fn next_node<N, E, Ty: EdgeType>(&mut self, g: &StableGraph<N, E, Ty, Ix>)
-        -> Option<NodeIndex<Ix>>
-    {
+    pub fn next_node<N, E, Ty: EdgeType>(
+        &mut self,
+        g: &StableGraph<N, E, Ty, Ix>,
+    ) -> Option<NodeIndex<Ix>> {
         self.next(g).map(|t| t.1)
     }
 
-    pub fn next_edge<N, E, Ty: EdgeType>(&mut self, g: &StableGraph<N, E, Ty, Ix>)
-        -> Option<EdgeIndex<Ix>>
-    {
+    pub fn next_edge<N, E, Ty: EdgeType>(
+        &mut self,
+        g: &StableGraph<N, E, Ty, Ix>,
+    ) -> Option<EdgeIndex<Ix>> {
         self.next(g).map(|t| t.0)
     }
 }
@@ -1576,7 +1637,9 @@
         self.iter.ex_find_map(|(i, node)| {
             if node.weight.is_some() {
                 Some(node_index(i))
-            } else { None }
+            } else {
+                None
+            }
         })
     }
 
@@ -1591,23 +1654,28 @@
         self.iter.ex_rfind_map(|(i, node)| {
             if node.weight.is_some() {
                 Some(node_index(i))
-            } else { None }
+            } else {
+                None
+            }
         })
     }
 }
 
 impl<N, E, Ty, Ix> NodeIndexable for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     /// Return an upper bound of the node indices in the graph
     fn node_bound(&self) -> usize {
-        self.node_indices()
-            .next_back()
-            .map_or(0, |i| i.index() + 1)
+        self.node_indices().next_back().map_or(0, |i| i.index() + 1)
     }
-    fn to_index(&self, ix: NodeIndex<Ix>) -> usize { ix.index() }
-    fn from_index(&self, ix: usize) -> Self::NodeId { NodeIndex::new(ix) }
+    fn to_index(&self, ix: NodeIndex<Ix>) -> usize {
+        ix.index()
+    }
+    fn from_index(&self, ix: usize) -> Self::NodeId {
+        NodeIndex::new(ix)
+    }
 }
 
 /// Iterator over the edge indices of a graph.
@@ -1622,7 +1690,9 @@
         self.iter.ex_find_map(|(i, node)| {
             if node.weight.is_some() {
                 Some(edge_index(i))
-            } else { None }
+            } else {
+                None
+            }
         })
     }
 
@@ -1637,12 +1707,13 @@
         self.iter.ex_rfind_map(|(i, node)| {
             if node.weight.is_some() {
                 Some(edge_index(i))
-            } else { None }
+            } else {
+                None
+            }
         })
     }
 }
 
-
 #[test]
 fn stable_graph() {
     let mut gr = StableGraph::<_, _>::with_capacity(0, 0);
@@ -1718,7 +1789,7 @@
 
     assert_eq!(gr.node_count(), 5);
     assert_eq!(gr.edge_count(), 8);
-    gr.retain_nodes(|frozen_gr, ix| {frozen_gr[ix] >= "c"});
+    gr.retain_nodes(|frozen_gr, ix| frozen_gr[ix] >= "c");
     assert_eq!(gr.node_count(), 3);
     assert_eq!(gr.edge_count(), 2);
 
diff --git a/src/graph_impl/stable_graph/serialization.rs b/src/graph_impl/stable_graph/serialization.rs
index da031c6..c24ca63 100644
--- a/src/graph_impl/stable_graph/serialization.rs
+++ b/src/graph_impl/stable_graph/serialization.rs
@@ -1,23 +1,21 @@
-
-
 use serde::de::Error;
-use serde::{Serialize, Serializer, Deserialize, Deserializer};
+use serde::{Deserialize, Deserializer, Serialize, Serializer};
 
 use std::marker::PhantomData;
 
 use crate::prelude::*;
 
-use crate::EdgeType;
 use crate::graph::Node;
-use crate::graph::{IndexType, Edge};
+use crate::graph::{Edge, IndexType};
+use crate::serde_utils::CollectSeqWithLength;
+use crate::serde_utils::MappedSequenceVisitor;
+use crate::serde_utils::{FromDeserialized, IntoSerializable};
 use crate::stable_graph::StableGraph;
 use crate::util::rev;
-use crate::serde_utils::MappedSequenceVisitor;
-use crate::serde_utils::CollectSeqWithLength;
-use crate::serde_utils::{IntoSerializable, FromDeserialized};
 use crate::visit::NodeIndexable;
+use crate::EdgeType;
 
-use super::super::serialization::{EdgeProperty, invalid_length_err, invalid_node_err};
+use super::super::serialization::{invalid_length_err, invalid_node_err, EdgeProperty};
 
 // Serialization representation for StableGraph
 // Keep in sync with deserialization and Graph
@@ -28,7 +26,7 @@
     nodes: Somes<&'a [Node<Option<N>, Ix>]>,
     node_holes: Holes<&'a [Node<Option<N>, Ix>]>,
     edge_property: EdgeProperty,
-    #[serde(serialize_with="ser_stable_graph_edges")]
+    #[serde(serialize_with = "ser_stable_graph_edges")]
     edges: &'a [Edge<Option<E>, Ix>],
 }
 
@@ -36,14 +34,16 @@
 // Keep in sync with serialization and Graph
 #[derive(Deserialize)]
 #[serde(rename = "Graph")]
-#[serde(bound(deserialize = "N: Deserialize<'de>, E: Deserialize<'de>, Ix: IndexType + Deserialize<'de>"))]
+#[serde(bound(
+    deserialize = "N: Deserialize<'de>, E: Deserialize<'de>, Ix: IndexType + Deserialize<'de>"
+))]
 pub struct DeserStableGraph<N, E, Ix> {
-    #[serde(deserialize_with="deser_stable_graph_nodes")]
+    #[serde(deserialize_with = "deser_stable_graph_nodes")]
     nodes: Vec<Node<Option<N>, Ix>>,
-    #[serde(default="Vec::new")]
+    #[serde(default = "Vec::new")]
     node_holes: Vec<NodeIndex<Ix>>,
     edge_property: EdgeProperty,
-    #[serde(deserialize_with="deser_stable_graph_edges")]
+    #[serde(deserialize_with = "deser_stable_graph_edges")]
     edges: Vec<Edge<Option<E>, Ix>>,
 }
 
@@ -51,13 +51,17 @@
 struct Somes<T>(usize, T);
 
 impl<'a, N, Ix> Serialize for Somes<&'a [Node<Option<N>, Ix>]>
-    where N: Serialize,
+where
+    N: Serialize,
 {
     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
-        where S: Serializer,
+    where
+        S: Serializer,
     {
-        serializer.collect_seq_with_length(self.0,
-            self.1.iter().filter_map(|node| node.weight.as_ref()))
+        serializer.collect_seq_with_length(
+            self.0,
+            self.1.iter().filter_map(|node| node.weight.as_ref()),
+        )
     }
 }
 
@@ -65,55 +69,71 @@
 struct Holes<T>(usize, T);
 
 impl<'a, N, Ix> Serialize for Holes<&'a [Node<Option<N>, Ix>]>
-    where Ix: Serialize + IndexType,
+where
+    Ix: Serialize + IndexType,
 {
     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
-        where S: Serializer,
+    where
+        S: Serializer,
     {
-        serializer.collect_seq_with_length(self.0,
-            self.1.iter()
-                  .enumerate()
-                  .filter_map(|(i, node)| if node.weight.is_none() {
-                      Some(NodeIndex::<Ix>::new(i))
-                  } else {
-                      None
-                  }))
+        serializer.collect_seq_with_length(
+            self.0,
+            self.1.iter().enumerate().filter_map(|(i, node)| {
+                if node.weight.is_none() {
+                    Some(NodeIndex::<Ix>::new(i))
+                } else {
+                    None
+                }
+            }),
+        )
     }
 }
 
-fn ser_stable_graph_edges<S, E, Ix>(edges: &&[Edge<Option<E>, Ix>], serializer: S) -> Result<S::Ok, S::Error>
-    where S: Serializer,
-          E: Serialize,
-          Ix: Serialize + IndexType,
+fn ser_stable_graph_edges<S, E, Ix>(
+    edges: &&[Edge<Option<E>, Ix>],
+    serializer: S,
+) -> Result<S::Ok, S::Error>
+where
+    S: Serializer,
+    E: Serialize,
+    Ix: Serialize + IndexType,
 {
-    serializer.collect_seq_exact(
-        edges.iter()
-            .map(|edge| edge.weight.as_ref().map(|w| (
-               edge.source(),
-               edge.target(),
-               w
-            ))))
+    serializer.collect_seq_exact(edges.iter().map(|edge| {
+        edge.weight
+            .as_ref()
+            .map(|w| (edge.source(), edge.target(), w))
+    }))
 }
 
-fn deser_stable_graph_nodes<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Node<Option<N>, Ix>>, D::Error>
-    where D: Deserializer<'de>,
-          N: Deserialize<'de>,
-          Ix: IndexType + Deserialize<'de>,
+fn deser_stable_graph_nodes<'de, D, N, Ix>(
+    deserializer: D,
+) -> Result<Vec<Node<Option<N>, Ix>>, D::Error>
+where
+    D: Deserializer<'de>,
+    N: Deserialize<'de>,
+    Ix: IndexType + Deserialize<'de>,
 {
-    deserializer.deserialize_seq(MappedSequenceVisitor::new(|n|
+    deserializer.deserialize_seq(MappedSequenceVisitor::new(|n| {
         Ok(Node {
             weight: Some(n),
             next: [EdgeIndex::end(); 2],
         })
-    ))
+    }))
 }
 
-fn deser_stable_graph_edges<'de, D, N, Ix>(deserializer: D) -> Result<Vec<Edge<Option<N>, Ix>>, D::Error>
-    where D: Deserializer<'de>,
-          N: Deserialize<'de>,
-          Ix: IndexType + Deserialize<'de>,
+fn deser_stable_graph_edges<'de, D, N, Ix>(
+    deserializer: D,
+) -> Result<Vec<Edge<Option<N>, Ix>>, D::Error>
+where
+    D: Deserializer<'de>,
+    N: Deserialize<'de>,
+    Ix: IndexType + Deserialize<'de>,
 {
-    deserializer.deserialize_seq(MappedSequenceVisitor::<Option<(NodeIndex<Ix>, NodeIndex<Ix>, N)>, _, _>::new(|x|
+    deserializer.deserialize_seq(MappedSequenceVisitor::<
+        Option<(NodeIndex<Ix>, NodeIndex<Ix>, N)>,
+        _,
+        _,
+    >::new(|x| {
         if let Some((i, j, w)) = x {
             Ok(Edge {
                 weight: Some(w),
@@ -127,12 +147,13 @@
                 next: [EdgeIndex::end(); 2],
             })
         }
-    ))
+    }))
 }
 
 impl<'a, N, E, Ty, Ix> IntoSerializable for &'a StableGraph<N, E, Ty, Ix>
-    where Ix: IndexType,
-          Ty: EdgeType,
+where
+    Ix: IndexType,
+    Ty: EdgeType,
 {
     type Output = SerStableGraph<'a, N, E, Ix>;
     fn into_serializable(self) -> Self::Output {
@@ -151,25 +172,29 @@
 
 /// Requires crate feature `"serde-1"`
 impl<N, E, Ty, Ix> Serialize for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType + Serialize,
-          N: Serialize,
-          E: Serialize,
+where
+    Ty: EdgeType,
+    Ix: IndexType + Serialize,
+    N: Serialize,
+    E: Serialize,
 {
     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
-        where S: Serializer
+    where
+        S: Serializer,
     {
         self.into_serializable().serialize(serializer)
     }
 }
 
 impl<'a, N, E, Ty, Ix> FromDeserialized for StableGraph<N, E, Ty, Ix>
-    where Ix: IndexType,
-          Ty: EdgeType,
+where
+    Ix: IndexType,
+    Ty: EdgeType,
 {
     type Input = DeserStableGraph<N, E, Ix>;
     fn from_deserialized<E2>(input: Self::Input) -> Result<Self, E2>
-        where E2: Error
+    where
+        E2: Error,
     {
         let ty = PhantomData::<Ty>::from_deserialized(input.edge_property)?;
         let mut nodes = input.nodes;
@@ -188,10 +213,13 @@
                 Err(invalid_node_err(hole_pos.index(), node_bound))?;
             }
             let insert_pos = hole_pos.index() - offset;
-            nodes.insert(insert_pos, Node {
-                weight: None,
-                next: [EdgeIndex::end(); 2],
-            });
+            nodes.insert(
+                insert_pos,
+                Node {
+                    weight: None,
+                    next: [EdgeIndex::end(); 2],
+                },
+            );
         }
 
         if nodes.len() >= <Ix as IndexType>::max().index() {
@@ -210,20 +238,23 @@
             free_edge: EdgeIndex::end(),
             free_node: NodeIndex::end(),
         };
-        sgr.link_edges().map_err(|i| invalid_node_err(i.index(), node_bound))?;
+        sgr.link_edges()
+            .map_err(|i| invalid_node_err(i.index(), node_bound))?;
         Ok(sgr)
     }
 }
 
 /// Requires crate feature `"serde-1"`
 impl<'de, N, E, Ty, Ix> Deserialize<'de> for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType + Deserialize<'de>,
-          N: Deserialize<'de>,
-          E: Deserialize<'de>,
+where
+    Ty: EdgeType,
+    Ix: IndexType + Deserialize<'de>,
+    N: Deserialize<'de>,
+    E: Deserialize<'de>,
 {
     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
-        where D: Deserializer<'de>
+    where
+        D: Deserializer<'de>,
     {
         Self::from_deserialized(DeserStableGraph::deserialize(deserializer)?)
     }
@@ -233,8 +264,8 @@
 fn test_from_deserialized_with_holes() {
     use crate::graph::node_index;
     use crate::stable_graph::StableUnGraph;
-    use serde::de::value::Error as SerdeError;
     use itertools::assert_equal;
+    use serde::de::value::Error as SerdeError;
 
     let input = DeserStableGraph::<_, (), u32> {
         nodes: vec![
@@ -251,12 +282,7 @@
                 next: [EdgeIndex::end(); 2],
             },
         ],
-        node_holes: vec![
-            node_index(0),
-            node_index(2),
-            node_index(3),
-            node_index(6),
-        ],
+        node_holes: vec![node_index(0), node_index(2), node_index(3), node_index(6)],
         edges: vec![],
         edge_property: EdgeProperty::Undirected,
     };
@@ -265,6 +291,6 @@
     assert_eq!(graph.node_count(), 3);
     assert_equal(
         graph.raw_nodes().iter().map(|n| n.weight.as_ref().cloned()),
-        vec![None, Some(1), None, None, Some(4), Some(5), None]);
+        vec![None, Some(1), None, None, Some(4), Some(5), None],
+    );
 }
-
diff --git a/src/graphmap.rs b/src/graphmap.rs
index 2183235..ecd0d26 100644
--- a/src/graphmap.rs
+++ b/src/graphmap.rs
@@ -1,39 +1,25 @@
 //! `GraphMap<N, E, Ty>` is a graph datastructure where node values are mapping
 //! keys.
 
-use std::cmp::Ordering;
-use std::hash::{self, Hash};
-use std::iter::{
-    Cloned,
-    DoubleEndedIterator,
-};
-use std::slice::{
-    Iter,
-};
-use std::fmt;
-use std::ops::{Index, IndexMut, Deref};
-use std::iter::FromIterator;
-use std::marker::PhantomData;
-use indexmap::IndexMap;
-use indexmap::map::{
-    Iter as IndexMapIter, IterMut as IndexMapIterMut
-};
 use indexmap::map::Keys;
+use indexmap::map::{Iter as IndexMapIter, IterMut as IndexMapIterMut};
+use indexmap::IndexMap;
+use std::cmp::Ordering;
+use std::fmt;
+use std::hash::{self, Hash};
+use std::iter::FromIterator;
+use std::iter::{Cloned, DoubleEndedIterator};
+use std::marker::PhantomData;
+use std::ops::{Deref, Index, IndexMut};
+use std::slice::Iter;
 
-use crate::{
-    EdgeType,
-    Directed,
-    Undirected,
-    Direction,
-    Incoming,
-    Outgoing,
-};
+use crate::{Directed, Direction, EdgeType, Incoming, Outgoing, Undirected};
 
-use crate::IntoWeightedEdge;
-use crate::visit::{IntoNodeIdentifiers, NodeCount, IntoNodeReferences, NodeIndexable};
-use crate::visit::{NodeCompactIndexable, IntoEdgeReferences, IntoEdges};
-use crate::graph::Graph;
 use crate::graph::node_index;
+use crate::graph::Graph;
+use crate::visit::{IntoEdgeReferences, IntoEdges, NodeCompactIndexable};
+use crate::visit::{IntoNodeIdentifiers, IntoNodeReferences, NodeCount, NodeIndexable};
+use crate::IntoWeightedEdge;
 
 /// A `GraphMap` with undirected edges.
 ///
@@ -84,7 +70,7 @@
 }
 
 /// A trait group for `GraphMap`'s node identifier.
-pub trait NodeTrait : Copy + Ord + Hash {}
+pub trait NodeTrait: Copy + Ord + Hash {}
 impl<N> NodeTrait for N where N: Copy + Ord + Hash {}
 
 // non-repr(usize) version of Direction
@@ -110,8 +96,9 @@
 }
 
 impl<N, E, Ty> GraphMap<N, E, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType,
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     /// Create a new `GraphMap`
     pub fn new() -> Self {
@@ -167,8 +154,9 @@
     /// ]);
     /// ```
     pub fn from_edges<I>(iterable: I) -> Self
-        where I: IntoIterator,
-              I::Item: IntoWeightedEdge<E, NodeId=N>
+    where
+        I: IntoIterator,
+        I::Item: IntoWeightedEdge<E, NodeId = N>,
     {
         Self::from_iter(iterable)
     }
@@ -241,14 +229,16 @@
             old
         } else {
             // insert in the adjacency list if it's a new edge
-            self.nodes.entry(a)
-                      .or_insert_with(|| Vec::with_capacity(1))
-                      .push((b, CompactDirection::Outgoing));
+            self.nodes
+                .entry(a)
+                .or_insert_with(|| Vec::with_capacity(1))
+                .push((b, CompactDirection::Outgoing));
             if a != b {
                 // self loops don't have the Incoming entry
-                self.nodes.entry(b)
-                          .or_insert_with(|| Vec::with_capacity(1))
-                          .push((a, CompactDirection::Incoming));
+                self.nodes
+                    .entry(b)
+                    .or_insert_with(|| Vec::with_capacity(1))
+                    .push((a, CompactDirection::Incoming));
             }
             None
         }
@@ -262,13 +252,22 @@
             None => false,
             Some(sus) => {
                 if Ty::is_directed() {
-                    match sus.iter().position(|elt| elt == &(*b, CompactDirection::from(dir))) {
-                        Some(index) => { sus.swap_remove(index); true }
+                    match sus
+                        .iter()
+                        .position(|elt| elt == &(*b, CompactDirection::from(dir)))
+                    {
+                        Some(index) => {
+                            sus.swap_remove(index);
+                            true
+                        }
                         None => false,
                     }
                 } else {
                     match sus.iter().position(|elt| &elt.0 == b) {
-                        Some(index) => { sus.swap_remove(index); true }
+                        Some(index) => {
+                            sus.swap_remove(index);
+                            true
+                        }
                         None => false,
                     }
                 }
@@ -295,7 +294,9 @@
         let exist1 = self.remove_single_edge(&a, &b, Outgoing);
         let exist2 = if a != b {
             self.remove_single_edge(&b, &a, Incoming)
-        } else { exist1 };
+        } else {
+            exist1
+        };
         let weight = self.edges.remove(&Self::edge_key(a, b));
         debug_assert!(exist1 == exist2 && exist1 == weight.is_some());
         weight
@@ -310,7 +311,9 @@
     ///
     /// Iterator element type is `N`.
     pub fn nodes(&self) -> Nodes<N> {
-        Nodes{iter: self.nodes.keys().cloned()}
+        Nodes {
+            iter: self.nodes.keys().cloned(),
+        }
     }
 
     /// Return an iterator of all nodes with an edge starting from `a`.
@@ -340,9 +343,7 @@
     ///
     /// Produces an empty iterator if the node doesn't exist.<br>
     /// Iterator element type is `N`.
-    pub fn neighbors_directed(&self, a: N, dir: Direction)
-        -> NeighborsDirected<N, Ty>
-    {
+    pub fn neighbors_directed(&self, a: N, dir: Direction) -> NeighborsDirected<N, Ty> {
         NeighborsDirected {
             iter: match self.nodes.get(&a) {
                 Some(neigh) => neigh.iter(),
@@ -415,7 +416,8 @@
     /// **Panics** if the number of nodes or edges does not fit with
     /// the resulting graph's index type.
     pub fn into_graph<Ix>(self) -> Graph<N, E, Ty, Ix>
-        where Ix: crate::graph::IndexType,
+    where
+        Ix: crate::graph::IndexType,
     {
         // assuming two successive iterations of the same hashmap produce the same order
         let mut gr = Graph::with_capacity(self.node_count(), self.edge_count());
@@ -433,12 +435,14 @@
 
 /// Create a new `GraphMap` from an iterable of edges.
 impl<N, E, Ty, Item> FromIterator<Item> for GraphMap<N, E, Ty>
-    where Item: IntoWeightedEdge<E, NodeId=N>,
-          N: NodeTrait,
-          Ty: EdgeType,
+where
+    Item: IntoWeightedEdge<E, NodeId = N>,
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     fn from_iter<I>(iterable: I) -> Self
-        where I: IntoIterator<Item=Item>,
+    where
+        I: IntoIterator<Item = Item>,
     {
         let iter = iterable.into_iter();
         let (low, _) = iter.size_hint();
@@ -452,12 +456,14 @@
 ///
 /// Nodes are inserted automatically to match the edges.
 impl<N, E, Ty, Item> Extend<Item> for GraphMap<N, E, Ty>
-    where Item: IntoWeightedEdge<E, NodeId=N>,
-          N: NodeTrait,
-          Ty: EdgeType,
+where
+    Item: IntoWeightedEdge<E, NodeId = N>,
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     fn extend<I>(&mut self, iterable: I)
-        where I: IntoIterator<Item=Item>,
+    where
+        I: IntoIterator<Item = Item>,
     {
         let iter = iterable.into_iter();
         let (low, _) = iter.size_hint();
@@ -502,24 +508,24 @@
 }
 
 pub struct Neighbors<'a, N, Ty = Undirected>
-    where N: 'a,
-          Ty: EdgeType,
+where
+    N: 'a,
+    Ty: EdgeType,
 {
     iter: Iter<'a, (N, CompactDirection)>,
     ty: PhantomData<Ty>,
 }
 
 impl<'a, N, Ty> Iterator for Neighbors<'a, N, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     type Item = N;
     fn next(&mut self) -> Option<N> {
         if Ty::is_directed() {
             (&mut self.iter)
-                .filter_map(|&(n, dir)| if dir == Outgoing {
-                    Some(n)
-                } else { None })
+                .filter_map(|&(n, dir)| if dir == Outgoing { Some(n) } else { None })
                 .next()
         } else {
             self.iter.next().map(|&(n, _)| n)
@@ -528,8 +534,9 @@
 }
 
 pub struct NeighborsDirected<'a, N, Ty>
-    where N: 'a,
-          Ty: EdgeType,
+where
+    N: 'a,
+    Ty: EdgeType,
 {
     iter: Iter<'a, (N, CompactDirection)>,
     start_node: N,
@@ -538,8 +545,9 @@
 }
 
 impl<'a, N, Ty> Iterator for NeighborsDirected<'a, N, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     type Item = N;
     fn next(&mut self) -> Option<N> {
@@ -547,9 +555,13 @@
             let self_dir = self.dir;
             let start_node = self.start_node;
             (&mut self.iter)
-                .filter_map(move |&(n, dir)| if dir == self_dir || n == start_node {
-                    Some(n)
-                } else { None })
+                .filter_map(move |&(n, dir)| {
+                    if dir == self_dir || n == start_node {
+                        Some(n)
+                    } else {
+                        None
+                    }
+                })
                 .next()
         } else {
             self.iter.next().map(|&(n, _)| n)
@@ -558,8 +570,9 @@
 }
 
 pub struct Edges<'a, N, E: 'a, Ty>
-    where N: 'a + NodeTrait,
-          Ty: EdgeType
+where
+    N: 'a + NodeTrait,
+    Ty: EdgeType,
 {
     from: N,
     edges: &'a IndexMap<(N, N), E>,
@@ -567,8 +580,10 @@
 }
 
 impl<'a, N, E, Ty> Iterator for Edges<'a, N, E, Ty>
-    where N: 'a + NodeTrait, E: 'a,
-          Ty: EdgeType,
+where
+    N: 'a + NodeTrait,
+    E: 'a,
+    Ty: EdgeType,
 {
     type Item = (N, N, &'a E);
     fn next(&mut self) -> Option<Self::Item> {
@@ -578,9 +593,7 @@
                 let a = self.from;
                 match self.edges.get(&GraphMap::<N, E, Ty>::edge_key(a, b)) {
                     None => unreachable!(),
-                    Some(edge) => {
-                        Some((a, b, edge))
-                    }
+                    Some(edge) => Some((a, b, edge)),
                 }
             }
         }
@@ -588,8 +601,9 @@
 }
 
 impl<'a, N: 'a, E: 'a, Ty> IntoEdgeReferences for &'a GraphMap<N, E, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType,
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     type EdgeRef = (N, N, &'a E);
     type EdgeReferences = AllEdges<'a, N, E, Ty>;
@@ -598,21 +612,25 @@
     }
 }
 
-pub struct AllEdges<'a, N, E: 'a, Ty> where N: 'a + NodeTrait {
+pub struct AllEdges<'a, N, E: 'a, Ty>
+where
+    N: 'a + NodeTrait,
+{
     inner: IndexMapIter<'a, (N, N), E>,
     ty: PhantomData<Ty>,
 }
 
 impl<'a, N, E, Ty> Iterator for AllEdges<'a, N, E, Ty>
-    where N: 'a + NodeTrait, E: 'a,
-          Ty: EdgeType,
+where
+    N: 'a + NodeTrait,
+    E: 'a,
+    Ty: EdgeType,
 {
     type Item = (N, N, &'a E);
-    fn next(&mut self) -> Option<Self::Item>
-    {
+    fn next(&mut self) -> Option<Self::Item> {
         match self.inner.next() {
             None => None,
-            Some((&(a, b), v)) => Some((a, b, v))
+            Some((&(a, b), v)) => Some((a, b, v)),
         }
     }
 
@@ -625,35 +643,50 @@
     }
 
     fn nth(&mut self, n: usize) -> Option<Self::Item> {
-        self.inner.nth(n).map(|(&(n1, n2), weight)| (n1, n2, weight))
+        self.inner
+            .nth(n)
+            .map(|(&(n1, n2), weight)| (n1, n2, weight))
     }
 
     fn last(self) -> Option<Self::Item> {
-        self.inner.last().map(|(&(n1, n2), weight)| (n1, n2, weight))
+        self.inner
+            .last()
+            .map(|(&(n1, n2), weight)| (n1, n2, weight))
     }
 }
 
 impl<'a, N, E, Ty> DoubleEndedIterator for AllEdges<'a, N, E, Ty>
-    where N: 'a + NodeTrait, E: 'a,
-          Ty: EdgeType,
+where
+    N: 'a + NodeTrait,
+    E: 'a,
+    Ty: EdgeType,
 {
     fn next_back(&mut self) -> Option<Self::Item> {
-        self.inner.next_back().map(|(&(n1, n2), weight)| (n1, n2, weight))
+        self.inner
+            .next_back()
+            .map(|(&(n1, n2), weight)| (n1, n2, weight))
     }
 }
 
-pub struct AllEdgesMut<'a, N, E: 'a, Ty> where N: 'a + NodeTrait {
+pub struct AllEdgesMut<'a, N, E: 'a, Ty>
+where
+    N: 'a + NodeTrait,
+{
     inner: IndexMapIterMut<'a, (N, N), E>,
     ty: PhantomData<Ty>,
 }
 
 impl<'a, N, E, Ty> Iterator for AllEdgesMut<'a, N, E, Ty>
-    where N: 'a + NodeTrait, E: 'a,
-          Ty: EdgeType,
+where
+    N: 'a + NodeTrait,
+    E: 'a,
+    Ty: EdgeType,
 {
     type Item = (N, N, &'a mut E);
     fn next(&mut self) -> Option<Self::Item> {
-        self.inner.next().map(|(&(n1, n2), weight)| (n1, n2, weight))
+        self.inner
+            .next()
+            .map(|(&(n1, n2), weight)| (n1, n2, weight))
     }
 
     fn size_hint(&self) -> (usize, Option<usize>) {
@@ -665,26 +698,35 @@
     }
 
     fn nth(&mut self, n: usize) -> Option<Self::Item> {
-        self.inner.nth(n).map(|(&(n1, n2), weight)| (n1, n2, weight))
+        self.inner
+            .nth(n)
+            .map(|(&(n1, n2), weight)| (n1, n2, weight))
     }
 
     fn last(self) -> Option<Self::Item> {
-        self.inner.last().map(|(&(n1, n2), weight)| (n1, n2, weight))
+        self.inner
+            .last()
+            .map(|(&(n1, n2), weight)| (n1, n2, weight))
     }
 }
 
 impl<'a, N, E, Ty> DoubleEndedIterator for AllEdgesMut<'a, N, E, Ty>
-    where N: 'a + NodeTrait, E: 'a,
-          Ty: EdgeType,
+where
+    N: 'a + NodeTrait,
+    E: 'a,
+    Ty: EdgeType,
 {
     fn next_back(&mut self) -> Option<Self::Item> {
-        self.inner.next_back().map(|(&(n1, n2), weight)| (n1, n2, weight))
+        self.inner
+            .next_back()
+            .map(|(&(n1, n2), weight)| (n1, n2, weight))
     }
 }
 
 impl<'a, N: 'a, E: 'a, Ty> IntoEdges for &'a GraphMap<N, E, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType,
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     type Edges = Edges<'a, N, E, Ty>;
     fn edges(self, a: Self::NodeId) -> Self::Edges {
@@ -692,37 +734,42 @@
     }
 }
 
-
 /// Index `GraphMap` by node pairs to access edge weights.
 impl<N, E, Ty> Index<(N, N)> for GraphMap<N, E, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType,
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     type Output = E;
-    fn index(&self, index: (N, N)) -> &E
-    {
+    fn index(&self, index: (N, N)) -> &E {
         let index = Self::edge_key(index.0, index.1);
-        self.edge_weight(index.0, index.1).expect("GraphMap::index: no such edge")
+        self.edge_weight(index.0, index.1)
+            .expect("GraphMap::index: no such edge")
     }
 }
 
 /// Index `GraphMap` by node pairs to access edge weights.
 impl<N, E, Ty> IndexMut<(N, N)> for GraphMap<N, E, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType,
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     fn index_mut(&mut self, index: (N, N)) -> &mut E {
         let index = Self::edge_key(index.0, index.1);
-        self.edge_weight_mut(index.0, index.1).expect("GraphMap::index: no such edge")
+        self.edge_weight_mut(index.0, index.1)
+            .expect("GraphMap::index: no such edge")
     }
 }
 
 /// Create a new empty `GraphMap`.
 impl<N, E, Ty> Default for GraphMap<N, E, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType,
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
-    fn default() -> Self { GraphMap::with_capacity(0, 0) }
+    fn default() -> Self {
+        GraphMap::with_capacity(0, 0)
+    }
 }
 
 /// A reference that is hashed and compared by its pointer value.
@@ -734,33 +781,30 @@
 pub struct Ptr<'b, T: 'b>(pub &'b T);
 
 impl<'b, T> Copy for Ptr<'b, T> {}
-impl<'b, T> Clone for Ptr<'b, T>
-{
-    fn clone(&self) -> Self { *self }
+impl<'b, T> Clone for Ptr<'b, T> {
+    fn clone(&self) -> Self {
+        *self
+    }
 }
 
-
 fn ptr_eq<T>(a: *const T, b: *const T) -> bool {
     a == b
 }
 
-impl<'b, T> PartialEq for Ptr<'b, T>
-{
+impl<'b, T> PartialEq for Ptr<'b, T> {
     /// Ptr compares by pointer equality, i.e if they point to the same value
     fn eq(&self, other: &Ptr<'b, T>) -> bool {
         ptr_eq(self.0, other.0)
     }
 }
 
-impl<'b, T> PartialOrd for Ptr<'b, T>
-{
+impl<'b, T> PartialOrd for Ptr<'b, T> {
     fn partial_cmp(&self, other: &Ptr<'b, T>) -> Option<Ordering> {
         Some(self.cmp(other))
     }
 }
 
-impl<'b, T> Ord for Ptr<'b, T>
-{
+impl<'b, T> Ord for Ptr<'b, T> {
     /// Ptr is ordered by pointer value, i.e. an arbitrary but stable and total order.
     fn cmp(&self, other: &Ptr<'b, T>) -> Ordering {
         let a: *const T = self.0;
@@ -778,10 +822,8 @@
 
 impl<'b, T> Eq for Ptr<'b, T> {}
 
-impl<'b, T> Hash for Ptr<'b, T>
-{
-    fn hash<H: hash::Hasher>(&self, st: &mut H)
-    {
+impl<'b, T> Hash for Ptr<'b, T> {
+    fn hash<H: hash::Hasher>(&self, st: &mut H) {
         let ptr = (self.0) as *const T;
         ptr.hash(st)
     }
@@ -794,8 +836,9 @@
 }
 
 impl<'a, N, E: 'a, Ty> IntoNodeIdentifiers for &'a GraphMap<N, E, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType,
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     type NodeIdentifiers = NodeIdentifiers<'a, N, E, Ty>;
 
@@ -809,34 +852,40 @@
 }
 
 impl<N, E, Ty> NodeCount for GraphMap<N, E, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType,
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     fn node_count(&self) -> usize {
         (*self).node_count()
     }
 }
 
-pub struct NodeIdentifiers<'a, N, E: 'a, Ty> where N: 'a + NodeTrait {
+pub struct NodeIdentifiers<'a, N, E: 'a, Ty>
+where
+    N: 'a + NodeTrait,
+{
     iter: IndexMapIter<'a, N, Vec<(N, CompactDirection)>>,
     ty: PhantomData<Ty>,
     edge_ty: PhantomData<E>,
 }
 
 impl<'a, N, E, Ty> Iterator for NodeIdentifiers<'a, N, E, Ty>
-    where N: 'a + NodeTrait, E: 'a,
-          Ty: EdgeType,
+where
+    N: 'a + NodeTrait,
+    E: 'a,
+    Ty: EdgeType,
 {
     type Item = N;
-    fn next(&mut self) -> Option<Self::Item>
-    {
+    fn next(&mut self) -> Option<Self::Item> {
         self.iter.next().map(|(&n, _)| n)
     }
 }
 
 impl<'a, N, E, Ty> IntoNodeReferences for &'a GraphMap<N, E, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType,
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     type NodeRef = (N, &'a N);
     type NodeReferences = NodeReferences<'a, N, E, Ty>;
@@ -849,28 +898,35 @@
     }
 }
 
-pub struct NodeReferences<'a, N, E: 'a, Ty> where N: 'a + NodeTrait {
+pub struct NodeReferences<'a, N, E: 'a, Ty>
+where
+    N: 'a + NodeTrait,
+{
     iter: IndexMapIter<'a, N, Vec<(N, CompactDirection)>>,
     ty: PhantomData<Ty>,
     edge_ty: PhantomData<E>,
 }
 
 impl<'a, N, E, Ty> Iterator for NodeReferences<'a, N, E, Ty>
-    where N: 'a + NodeTrait, E: 'a,
-          Ty: EdgeType,
+where
+    N: 'a + NodeTrait,
+    E: 'a,
+    Ty: EdgeType,
 {
     type Item = (N, &'a N);
-    fn next(&mut self) -> Option<Self::Item>
-    {
+    fn next(&mut self) -> Option<Self::Item> {
         self.iter.next().map(|(n, _)| (*n, n))
     }
 }
 
 impl<N, E, Ty> NodeIndexable for GraphMap<N, E, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType,
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
-    fn node_bound(&self) -> usize { self.node_count() }
+    fn node_bound(&self) -> usize {
+        self.node_count()
+    }
     fn to_index(&self, ix: Self::NodeId) -> usize {
         let (i, _, _) = self.nodes.get_full(&ix).unwrap();
         i
@@ -882,8 +938,8 @@
 }
 
 impl<N, E, Ty> NodeCompactIndexable for GraphMap<N, E, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType,
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
 }
-
diff --git a/src/isomorphism.rs b/src/isomorphism.rs
index e85c328..1d2cd27 100644
--- a/src/isomorphism.rs
+++ b/src/isomorphism.rs
@@ -1,15 +1,8 @@
-use std::marker;
 use fixedbitset::FixedBitSet;
+use std::marker;
 
-use super::{
-    EdgeType,
-    Incoming,
-};
-use super::graph::{
-    Graph,
-    IndexType,
-    NodeIndex,
-};
+use super::graph::{Graph, IndexType, NodeIndex};
+use super::{EdgeType, Incoming};
 
 use super::visit::GetAdjacencyMatrix;
 
@@ -35,8 +28,9 @@
 }
 
 impl<Ty, Ix> Vf2State<Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     pub fn new<N, E>(g: &Graph<N, E, Ty, Ix>) -> Self {
         let c0 = g.node_count();
@@ -66,9 +60,12 @@
     }
 
     /// Add mapping **from** <-> **to** to the state.
-    pub fn push_mapping<N, E>(&mut self, from: NodeIndex<Ix>, to: NodeIndex<Ix>,
-                              g: &Graph<N, E, Ty, Ix>)
-    {
+    pub fn push_mapping<N, E>(
+        &mut self,
+        from: NodeIndex<Ix>,
+        to: NodeIndex<Ix>,
+        g: &Graph<N, E, Ty, Ix>,
+    ) {
         self.generation += 1;
         let s = self.generation;
         self.mapping[from.index()] = to;
@@ -92,9 +89,7 @@
     }
 
     /// Restore the state to before the last added mapping
-    pub fn pop_mapping<N, E>(&mut self, from: NodeIndex<Ix>,
-                             g: &Graph<N, E, Ty, Ix>)
-    {
+    pub fn pop_mapping<N, E>(&mut self, from: NodeIndex<Ix>, g: &Graph<N, E, Ty, Ix>) {
         let s = self.generation;
         self.generation -= 1;
 
@@ -119,39 +114,40 @@
     }
 
     /// Find the next (least) node in the Tout set.
-    pub fn next_out_index(&self, from_index: usize) -> Option<usize>
-    {
-        self.out[from_index..].iter()
-                    .enumerate()
-                    .find(move |&(index, elt)| *elt > 0 &&
-                          self.mapping[from_index + index] == NodeIndex::end())
-                    .map(|(index, _)| index)
+    pub fn next_out_index(&self, from_index: usize) -> Option<usize> {
+        self.out[from_index..]
+            .iter()
+            .enumerate()
+            .find(move |&(index, elt)| {
+                *elt > 0 && self.mapping[from_index + index] == NodeIndex::end()
+            })
+            .map(|(index, _)| index)
     }
 
     /// Find the next (least) node in the Tin set.
-    pub fn next_in_index(&self, from_index: usize) -> Option<usize>
-    {
+    pub fn next_in_index(&self, from_index: usize) -> Option<usize> {
         if !Ty::is_directed() {
-            return None
+            return None;
         }
-        self.ins[from_index..].iter()
-                    .enumerate()
-                    .find(move |&(index, elt)| *elt > 0
-                          && self.mapping[from_index + index] == NodeIndex::end())
-                    .map(|(index, _)| index)
+        self.ins[from_index..]
+            .iter()
+            .enumerate()
+            .find(move |&(index, elt)| {
+                *elt > 0 && self.mapping[from_index + index] == NodeIndex::end()
+            })
+            .map(|(index, _)| index)
     }
 
     /// Find the next (least) node in the N - M set.
-    pub fn next_rest_index(&self, from_index: usize) -> Option<usize>
-    {
-        self.mapping[from_index..].iter()
-               .enumerate()
-               .find(|&(_, elt)| *elt == NodeIndex::end())
-               .map(|(index, _)| index)
+    pub fn next_rest_index(&self, from_index: usize) -> Option<usize> {
+        self.mapping[from_index..]
+            .iter()
+            .enumerate()
+            .find(|&(_, elt)| *elt == NodeIndex::end())
+            .map(|(index, _)| index)
     }
 }
 
-
 /// [Graph] Return `true` if the graphs `g0` and `g1` are isomorphic.
 ///
 /// Using the VF2 algorithm, only matching graph syntactically (graph
@@ -163,13 +159,13 @@
 ///
 /// * Luigi P. Cordella, Pasquale Foggia, Carlo Sansone, Mario Vento;
 ///   *A (Sub)Graph Isomorphism Algorithm for Matching Large Graphs*
-pub fn is_isomorphic<N, E, Ty, Ix>(g0: &Graph<N, E, Ty, Ix>,
-                                   g1: &Graph<N, E, Ty, Ix>) -> bool
-    where Ty: EdgeType,
-          Ix: IndexType,
+pub fn is_isomorphic<N, E, Ty, Ix>(g0: &Graph<N, E, Ty, Ix>, g1: &Graph<N, E, Ty, Ix>) -> bool
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     if g0.node_count() != g1.node_count() || g0.edge_count() != g1.edge_count() {
-        return false
+        return false;
     }
 
     let mut st = [Vf2State::new(g0), Vf2State::new(g1)];
@@ -182,17 +178,20 @@
 /// graph isomorphism (graph structure and matching node and edge weights).
 ///
 /// The graphs should not be multigraphs.
-pub fn is_isomorphic_matching<N, E, Ty, Ix, F, G>(g0: &Graph<N, E, Ty, Ix>,
-                                                  g1: &Graph<N, E, Ty, Ix>,
-                                                  mut node_match: F,
-                                                  mut edge_match: G) -> bool
-    where Ty: EdgeType,
-          Ix: IndexType,
-          F: FnMut(&N, &N) -> bool,
-          G: FnMut(&E, &E) -> bool,
+pub fn is_isomorphic_matching<N, E, Ty, Ix, F, G>(
+    g0: &Graph<N, E, Ty, Ix>,
+    g1: &Graph<N, E, Ty, Ix>,
+    mut node_match: F,
+    mut edge_match: G,
+) -> bool
+where
+    Ty: EdgeType,
+    Ix: IndexType,
+    F: FnMut(&N, &N) -> bool,
+    G: FnMut(&E, &E) -> bool,
 {
     if g0.node_count() != g1.node_count() || g0.edge_count() != g1.edge_count() {
-        return false
+        return false;
     }
 
     let mut st = [Vf2State::new(g0), Vf2State::new(g1)];
@@ -208,29 +207,42 @@
 
 impl<T> SemanticMatcher<T> for NoSemanticMatch {
     #[inline]
-    fn enabled() -> bool { false }
+    fn enabled() -> bool {
+        false
+    }
     #[inline]
-    fn eq(&mut self, _: &T, _: &T) -> bool { true }
+    fn eq(&mut self, _: &T, _: &T) -> bool {
+        true
+    }
 }
 
-impl<T, F> SemanticMatcher<T> for F where F: FnMut(&T, &T) -> bool {
+impl<T, F> SemanticMatcher<T> for F
+where
+    F: FnMut(&T, &T) -> bool,
+{
     #[inline]
-    fn enabled() -> bool { true }
+    fn enabled() -> bool {
+        true
+    }
     #[inline]
-    fn eq(&mut self, a: &T, b: &T) -> bool { self(a, b) }
+    fn eq(&mut self, a: &T, b: &T) -> bool {
+        self(a, b)
+    }
 }
 
 /// Return Some(bool) if isomorphism is decided, else None.
-fn try_match<N, E, Ty, Ix, F, G>(mut st: &mut [Vf2State<Ty, Ix>; 2],
-                                 g0: &Graph<N, E, Ty, Ix>,
-                                 g1: &Graph<N, E, Ty, Ix>,
-                                 node_match: &mut F,
-                                 edge_match: &mut G)
-    -> Option<bool>
-    where Ty: EdgeType,
-          Ix: IndexType,
-          F: SemanticMatcher<N>,
-          G: SemanticMatcher<E>,
+fn try_match<N, E, Ty, Ix, F, G>(
+    mut st: &mut [Vf2State<Ty, Ix>; 2],
+    g0: &Graph<N, E, Ty, Ix>,
+    g1: &Graph<N, E, Ty, Ix>,
+    node_match: &mut F,
+    edge_match: &mut G,
+) -> Option<bool>
+where
+    Ty: EdgeType,
+    Ix: IndexType,
+    F: SemanticMatcher<N>,
+    G: SemanticMatcher<E>,
 {
     if st[0].is_complete() {
         return Some(true);
@@ -254,77 +266,81 @@
     #[derive(Clone, PartialEq, Debug)]
     enum Frame<N: marker::Copy> {
         Outer,
-        Inner{ nodes: [N; 2], open_list: OpenList },
-        Unwind{ nodes: [N; 2], open_list: OpenList },
+        Inner { nodes: [N; 2], open_list: OpenList },
+        Unwind { nodes: [N; 2], open_list: OpenList },
     }
 
-    let next_candidate = |st: &mut[Vf2State<Ty, Ix>; 2]|
-        -> Option<(NodeIndex<Ix>, NodeIndex<Ix>, OpenList)> {
-        let mut to_index;
-        let mut from_index = None;
-        let mut open_list = OpenList::Out;
-        // Try the out list
-        to_index = st[1].next_out_index(0);
-
-        if to_index.is_some() {
-            from_index = st[0].next_out_index(0);
-            open_list = OpenList::Out;
-        }
-        // Try the in list
-        if to_index.is_none() || from_index.is_none() {
-            to_index = st[1].next_in_index(0);
+    let next_candidate =
+        |st: &mut [Vf2State<Ty, Ix>; 2]| -> Option<(NodeIndex<Ix>, NodeIndex<Ix>, OpenList)> {
+            let mut to_index;
+            let mut from_index = None;
+            let mut open_list = OpenList::Out;
+            // Try the out list
+            to_index = st[1].next_out_index(0);
 
             if to_index.is_some() {
-                from_index = st[0].next_in_index(0);
-                open_list = OpenList::In;
+                from_index = st[0].next_out_index(0);
+                open_list = OpenList::Out;
             }
-        }
-        // Try the other list -- disconnected graph
-        if to_index.is_none() || from_index.is_none() {
-            to_index = st[1].next_rest_index(0);
-            if to_index.is_some() {
-                from_index = st[0].next_rest_index(0);
-                open_list = OpenList::Other;
+            // Try the in list
+            if to_index.is_none() || from_index.is_none() {
+                to_index = st[1].next_in_index(0);
+
+                if to_index.is_some() {
+                    from_index = st[0].next_in_index(0);
+                    open_list = OpenList::In;
+                }
             }
-        }
-        match (from_index, to_index) {
-            (Some(n), Some(m)) => Some((NodeIndex::new(n), NodeIndex::new(m), open_list)),
-            // No more candidates
-            _ => None,
-        }
-    };
-    let next_from_ix = |st: &mut[Vf2State<Ty, Ix>; 2], nx: NodeIndex<Ix>, open_list: OpenList| -> Option<NodeIndex<Ix>> {
+            // Try the other list -- disconnected graph
+            if to_index.is_none() || from_index.is_none() {
+                to_index = st[1].next_rest_index(0);
+                if to_index.is_some() {
+                    from_index = st[0].next_rest_index(0);
+                    open_list = OpenList::Other;
+                }
+            }
+            match (from_index, to_index) {
+                (Some(n), Some(m)) => Some((NodeIndex::new(n), NodeIndex::new(m), open_list)),
+                // No more candidates
+                _ => None,
+            }
+        };
+    let next_from_ix = |st: &mut [Vf2State<Ty, Ix>; 2],
+                        nx: NodeIndex<Ix>,
+                        open_list: OpenList|
+     -> Option<NodeIndex<Ix>> {
         // Find the next node index to try on the `from` side of the mapping
         let start = nx.index() + 1;
         let cand0 = match open_list {
             OpenList::Out => st[0].next_out_index(start),
             OpenList::In => st[0].next_in_index(start),
             OpenList::Other => st[0].next_rest_index(start),
-        }.map(|c| c + start); // compensate for start offset.
+        }
+        .map(|c| c + start); // compensate for start offset.
         match cand0 {
             None => None, // no more candidates
             Some(ix) => {
                 debug_assert!(ix >= start);
                 Some(NodeIndex::new(ix))
-            },
+            }
         }
     };
     //fn pop_state(nodes: [NodeIndex<Ix>; 2]) {
-    let pop_state = |st: &mut[Vf2State<Ty, Ix>; 2], nodes: [NodeIndex<Ix>; 2]| {
+    let pop_state = |st: &mut [Vf2State<Ty, Ix>; 2], nodes: [NodeIndex<Ix>; 2]| {
         // Restore state.
         for j in graph_indices.clone() {
             st[j].pop_mapping(nodes[j], g[j]);
         }
     };
     //fn push_state(nodes: [NodeIndex<Ix>; 2]) {
-    let push_state = |st: &mut[Vf2State<Ty, Ix>; 2],nodes: [NodeIndex<Ix>; 2]| {
+    let push_state = |st: &mut [Vf2State<Ty, Ix>; 2], nodes: [NodeIndex<Ix>; 2]| {
         // Add mapping nx <-> mx to the state
         for j in graph_indices.clone() {
-            st[j].push_mapping(nodes[j], nodes[1-j], g[j]);
+            st[j].push_mapping(nodes[j], nodes[1 - j], g[j]);
         }
     };
     //fn is_feasible(nodes: [NodeIndex<Ix>; 2]) -> bool {
-    let mut is_feasible = |st: &mut[Vf2State<Ty, Ix>; 2], nodes: [NodeIndex<Ix>; 2]| -> bool {
+    let mut is_feasible = |st: &mut [Vf2State<Ty, Ix>; 2], nodes: [NodeIndex<Ix>; 2]| -> bool {
         // Check syntactic feasibility of mapping by ensuring adjacencies
         // of nx map to adjacencies of mx.
         //
@@ -355,7 +371,8 @@
                 if m_neigh == end {
                     continue;
                 }
-                let has_edge = g[1-j].is_adjacent(&st[1-j].adjacency_matrix, nodes[1-j], m_neigh);
+                let has_edge =
+                    g[1 - j].is_adjacent(&st[1 - j].adjacency_matrix, nodes[1 - j], m_neigh);
                 if !has_edge {
                     return false;
                 }
@@ -375,7 +392,8 @@
                     if m_neigh == end {
                         continue;
                     }
-                    let has_edge = g[1-j].is_adjacent(&st[1-j].adjacency_matrix, m_neigh, nodes[1-j]);
+                    let has_edge =
+                        g[1 - j].is_adjacent(&st[1 - j].adjacency_matrix, m_neigh, nodes[1 - j]);
                     if !has_edge {
                         return false;
                     }
@@ -404,13 +422,13 @@
                     if m_neigh == end {
                         continue;
                     }
-                    match g[1-j].find_edge(nodes[1 - j], m_neigh) {
+                    match g[1 - j].find_edge(nodes[1 - j], m_neigh) {
                         Some(m_edge) => {
-                            if !edge_match.eq(&g[j][n_edge], &g[1-j][m_edge]) {
+                            if !edge_match.eq(&g[j][n_edge], &g[1 - j][m_edge]) {
                                 return false;
                             }
                         }
-                        None => unreachable!() // covered by syntactic check
+                        None => unreachable!(), // covered by syntactic check
                     }
                 }
             }
@@ -424,13 +442,13 @@
                         if m_neigh == end {
                             continue;
                         }
-                        match g[1-j].find_edge(m_neigh, nodes[1-j]) {
+                        match g[1 - j].find_edge(m_neigh, nodes[1 - j]) {
                             Some(m_edge) => {
-                                if !edge_match.eq(&g[j][n_edge], &g[1-j][m_edge]) {
+                                if !edge_match.eq(&g[j][n_edge], &g[1 - j][m_edge]) {
                                     return false;
                                 }
                             }
-                            None => unreachable!() // covered by syntactic check
+                            None => unreachable!(), // covered by syntactic check
                         }
                     }
                 }
@@ -442,46 +460,61 @@
 
     while let Some(frame) = stack.pop() {
         match frame {
-            Frame::Unwind{nodes, open_list: ol} => {
+            Frame::Unwind {
+                nodes,
+                open_list: ol,
+            } => {
                 pop_state(&mut st, nodes);
 
                 match next_from_ix(&mut st, nodes[0], ol) {
                     None => continue,
                     Some(nx) => {
-                        let f = Frame::Inner{nodes: [nx, nodes[1]], open_list: ol};
+                        let f = Frame::Inner {
+                            nodes: [nx, nodes[1]],
+                            open_list: ol,
+                        };
                         stack.push(f);
                     }
                 }
             }
-            Frame::Outer => {
-                match next_candidate(&mut st) {
-                    None => continue,
-                    Some((nx, mx, ol)) => {
-                        let f = Frame::Inner{nodes: [nx, mx], open_list: ol};
-                        stack.push(f); 
-                    }
+            Frame::Outer => match next_candidate(&mut st) {
+                None => continue,
+                Some((nx, mx, ol)) => {
+                    let f = Frame::Inner {
+                        nodes: [nx, mx],
+                        open_list: ol,
+                    };
+                    stack.push(f);
                 }
-            }
-            Frame::Inner{nodes, open_list: ol} => {
+            },
+            Frame::Inner {
+                nodes,
+                open_list: ol,
+            } => {
                 if is_feasible(&mut st, nodes) {
                     push_state(&mut st, nodes);
                     if st[0].is_complete() {
                         return Some(true);
                     }
                     // Check cardinalities of Tin, Tout sets
-                    if st[0].out_size == st[1].out_size &&
-                       st[0].ins_size == st[1].ins_size {
-                           let f0 = Frame::Unwind{nodes, open_list: ol};
-                           stack.push(f0);
-                           stack.push(Frame::Outer);
-                           continue;
+                    if st[0].out_size == st[1].out_size && st[0].ins_size == st[1].ins_size {
+                        let f0 = Frame::Unwind {
+                            nodes,
+                            open_list: ol,
+                        };
+                        stack.push(f0);
+                        stack.push(Frame::Outer);
+                        continue;
                     }
                     pop_state(&mut st, nodes);
                 }
                 match next_from_ix(&mut st, nodes[0], ol) {
                     None => continue,
                     Some(nx) => {
-                        let f = Frame::Inner{nodes: [nx, nodes[1]], open_list: ol};
+                        let f = Frame::Inner {
+                            nodes: [nx, nodes[1]],
+                            open_list: ol,
+                        };
                         stack.push(f);
                     }
                 }
diff --git a/src/iter_format.rs b/src/iter_format.rs
index de03a2a..f6ffd6a 100644
--- a/src/iter_format.rs
+++ b/src/iter_format.rs
@@ -7,15 +7,14 @@
 pub struct DebugMap<F>(pub F);
 
 impl<'a, F, I, K, V> fmt::Debug for DebugMap<F>
-    where F: Fn() -> I,
-          I: IntoIterator<Item=(K, V)>,
-          K: fmt::Debug,
-          V: fmt::Debug,
+where
+    F: Fn() -> I,
+    I: IntoIterator<Item = (K, V)>,
+    K: fmt::Debug,
+    V: fmt::Debug,
 {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        f.debug_map()
-         .entries((self.0)())
-         .finish()
+        f.debug_map().entries((self.0)()).finish()
     }
 }
 
@@ -23,7 +22,8 @@
 pub struct NoPretty<T>(pub T);
 
 impl<T> fmt::Debug for NoPretty<T>
-    where T: fmt::Debug,
+where
+    T: fmt::Debug,
 {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "{:?}", self.0)
@@ -44,9 +44,10 @@
     inner: RefCell<Option<I>>,
 }
 
-pub trait IterFormatExt : Iterator {
+pub trait IterFormatExt: Iterator {
     fn format(self, separator: &str) -> Format<Self>
-        where Self: Sized
+    where
+        Self: Sized,
     {
         Format {
             sep: separator,
@@ -55,14 +56,15 @@
     }
 }
 
-impl<I> IterFormatExt for I where I: Iterator { }
-
+impl<I> IterFormatExt for I where I: Iterator {}
 
 impl<'a, I> Format<'a, I>
-    where I: Iterator,
+where
+    I: Iterator,
 {
     fn format<F>(&self, f: &mut fmt::Formatter, mut cb: F) -> fmt::Result
-        where F: FnMut(&I::Item, &mut fmt::Formatter) -> fmt::Result,
+    where
+        F: FnMut(&I::Item, &mut fmt::Formatter) -> fmt::Result,
     {
         let mut iter = match self.inner.borrow_mut().take() {
             Some(t) => t,
diff --git a/src/iter_utils.rs b/src/iter_utils.rs
index 30db2d5..587af84 100644
--- a/src/iter_utils.rs
+++ b/src/iter_utils.rs
@@ -1,9 +1,9 @@
-
-pub trait IterUtilsExt : Iterator {
+pub trait IterUtilsExt: Iterator {
     /// Return the first element that maps to `Some(_)`, or None if the iterator
     /// was exhausted.
     fn ex_find_map<F, R>(&mut self, mut f: F) -> Option<R>
-        where F: FnMut(Self::Item) -> Option<R>
+    where
+        F: FnMut(Self::Item) -> Option<R>,
     {
         for elt in self {
             if let result @ Some(_) = f(elt) {
@@ -16,8 +16,9 @@
     /// Return the last element from the back that maps to `Some(_)`, or
     /// None if the iterator was exhausted.
     fn ex_rfind_map<F, R>(&mut self, mut f: F) -> Option<R>
-        where F: FnMut(Self::Item) -> Option<R>,
-              Self: DoubleEndedIterator,
+    where
+        F: FnMut(Self::Item) -> Option<R>,
+        Self: DoubleEndedIterator,
     {
         while let Some(elt) = self.next_back() {
             if let result @ Some(_) = f(elt) {
@@ -28,4 +29,4 @@
     }
 }
 
-impl<I> IterUtilsExt for I where I: Iterator { }
+impl<I> IterUtilsExt for I where I: Iterator {}
diff --git a/src/lib.rs b/src/lib.rs
index aaaec0c..d475884 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,6 +1,5 @@
-
 //! `petgraph` is a graph data structure library.
-//! 
+//!
 //! Graphs are collections of nodes, and edges between nodes. `petgraph`
 //! provides several [graph types](index.html#graph-types) (each differing in the
 //! tradeoffs taken in their internal representation),
@@ -8,9 +7,9 @@
 //! [output graphs](./doc/petgraph/dot/struct.Dot.html) in
 //! [`graphviz`](https://www.graphviz.org/) format. Both nodes and edges
 //! can have arbitrary associated data, and edges may be either directed or undirected.
-//! 
+//!
 //! # Example
-//! 
+//!
 //! ```rust
 //! use petgraph::graph::{NodeIndex, UnGraph};
 //! use petgraph::algo::{dijkstra, min_spanning_tree};
@@ -45,7 +44,7 @@
 //! ```
 //!
 //! # Graph types
-//! 
+//!
 //! * [`Graph`](./graph/struct.Graph.html) -
 //!   An adjacency list graph with arbitrary associated data.
 //! * [`StableGraph`](./stable_graph/struct.StableGraph.html) -
@@ -59,11 +58,11 @@
 //!   A sparse adjacency matrix graph with arbitrary associated data.
 //!
 //! ### Generic parameters
-//! 
+//!
 //! Each graph type is generic over a handful of parameters. All graphs share 3 common
 //! parameters, `N`, `E`, and `Ty`. This is a broad overview of what those are. Each
 //! type's documentation will have finer detail on these parameters.
-//! 
+//!
 //! `N` & `E` are called *weights* in this implementation, and are associated with
 //! nodes and edges respectively. They can generally be of arbitrary type, and don't have to
 //! be what you might conventionally consider weight-like. For example, using `&str` for `N`
@@ -74,25 +73,25 @@
 //! implement [`PartialOrd`](https://doc.rust-lang.org/stable/core/cmp/trait.PartialOrd.html).
 //! [`GraphMap`](./graphmap/struct.GraphMap.html) requires node weights that can serve as hash
 //! map keys, since that graph type does not create standalone node indices.
-//! 
+//!
 //! `Ty` controls whether edges are [`Directed`](./petgraph/enum.Directed.html) or
 //! [`Undirected`](./petgraph/enum.Unirected.html).
-//! 
+//!
 //! `Ix` appears on graph types that use indices. It is exposed so you can control
 //! the size of node and edge indices, and therefore the memory footprint of your graphs.
 //! Allowed values are `u8`, `u16`, `u32`, and `usize`, with `u32` being the default.
-//! 
+//!
 //! ### Shorthand types
-//! 
+//!
 //! Each graph type vends a few shorthand type definitions that name some specific
 //! generic choices. For example, [`DiGraph<_, _>`](./graph/type.DiGraph.html) is shorthand
 //! for [`Graph<_, _, Undirected>`](graph/struct.Graph.html).
 //! [`UnMatrix<_, _>`](./matrix_graph/type.UnMatrix.html) is shorthand for
 //! [`MatrixGraph<_, _, Undirected>`](./matrix_graph/struct.MatrixGraph.html). Each graph type's
 //! module documentation lists the available shorthand types.
-//! 
+//!
 //! # Crate features
-//! 
+//!
 //! * **serde-1** -
 //!   Defaults off. Enables serialization for ``Graph, StableGraph`` using
 //!   [`serde 1.0`](https://crates.io/crates/serde). May require a more recent version
@@ -122,7 +121,7 @@
 #[doc(no_inline)]
 pub use crate::graph::Graph;
 
-pub use crate::Direction::{Outgoing, Incoming};
+pub use crate::Direction::{Incoming, Outgoing};
 
 #[macro_use]
 mod macros;
@@ -135,58 +134,38 @@
 pub mod data;
 
 pub mod algo;
+mod astar;
+pub mod csr;
+mod dijkstra;
+pub mod dot;
 #[cfg(feature = "generate")]
 pub mod generate;
+mod graph_impl;
 #[cfg(feature = "graphmap")]
 pub mod graphmap;
-#[cfg(feature = "matrix_graph")]
-pub mod matrix_graph;
-mod graph_impl;
-pub mod dot;
-pub mod unionfind;
-mod dijkstra;
-mod astar;
-mod simple_paths;
-pub mod csr;
+mod isomorphism;
 mod iter_format;
 mod iter_utils;
-mod isomorphism;
-mod traits_graph;
-mod util;
+#[cfg(feature = "matrix_graph")]
+pub mod matrix_graph;
 #[cfg(feature = "quickcheck")]
 mod quickcheck;
 #[cfg(feature = "serde-1")]
 mod serde_utils;
+mod simple_paths;
+mod traits_graph;
+pub mod unionfind;
+mod util;
 
 pub mod prelude;
 
 /// `Graph<N, E, Ty, Ix>` is a graph datastructure using an adjacency list representation.
 pub mod graph {
     pub use crate::graph_impl::{
-        Edge,
-        EdgeIndex,
-        EdgeIndices,
-        EdgeReference,
-        EdgeReferences,
-        EdgeWeightsMut,
-        Edges,
-        Externals,
-        Frozen,
-        Graph,
-        Neighbors,
-        Node,
-        NodeIndex,
-        NodeIndices,
-        NodeWeightsMut,
-        NodeReferences,
+        edge_index, node_index, DefaultIx, DiGraph, Edge, EdgeIndex, EdgeIndices, EdgeReference,
+        EdgeReferences, EdgeWeightsMut, Edges, Externals, Frozen, Graph, GraphIndex, IndexType,
+        Neighbors, Node, NodeIndex, NodeIndices, NodeReferences, NodeWeightsMut, UnGraph,
         WalkNeighbors,
-        GraphIndex,
-        IndexType,
-        edge_index,
-        node_index,
-        DefaultIx,
-        DiGraph,
-        UnGraph,
     };
 }
 
@@ -197,9 +176,11 @@
     ($name:ident) => {
         impl Clone for $name {
             #[inline]
-            fn clone(&self) -> Self { *self }
+            fn clone(&self) -> Self {
+                *self
+            }
         }
-    }
+    };
 }
 
 // Index into the NodeIndex and EdgeIndex arrays
@@ -210,7 +191,7 @@
     /// An `Outgoing` edge is an outward edge *from* the current node.
     Outgoing = 0,
     /// An `Incoming` edge is an inbound edge *to* the current node.
-    Incoming = 1
+    Incoming = 1,
 }
 
 copyclone!(Direction);
@@ -237,12 +218,12 @@
 
 /// Marker type for a directed graph.
 #[derive(Copy, Debug)]
-pub enum Directed { }
+pub enum Directed {}
 copyclone!(Directed);
 
 /// Marker type for an undirected graph.
 #[derive(Copy, Debug)]
-pub enum Undirected { }
+pub enum Undirected {}
 copyclone!(Undirected);
 
 /// A graph's edge type determines whether it has directed edges or not.
@@ -252,15 +233,18 @@
 
 impl EdgeType for Directed {
     #[inline]
-    fn is_directed() -> bool { true }
+    fn is_directed() -> bool {
+        true
+    }
 }
 
 impl EdgeType for Undirected {
     #[inline]
-    fn is_directed() -> bool { false }
+    fn is_directed() -> bool {
+        false
+    }
 }
 
-
 /// Convert an element like `(i, j)` or `(i, j, w)` into
 /// a triple of source, target, edge weight.
 ///
@@ -271,7 +255,8 @@
 }
 
 impl<Ix, E> IntoWeightedEdge<E> for (Ix, Ix)
-    where E: Default
+where
+    E: Default,
 {
     type NodeId = Ix;
 
@@ -281,8 +266,7 @@
     }
 }
 
-impl<Ix, E> IntoWeightedEdge<E> for (Ix, Ix, E)
-{
+impl<Ix, E> IntoWeightedEdge<E> for (Ix, Ix, E) {
     type NodeId = Ix;
     fn into_weighted_edge(self) -> (Ix, Ix, E) {
         self
@@ -290,7 +274,8 @@
 }
 
 impl<'a, Ix, E> IntoWeightedEdge<E> for (Ix, Ix, &'a E)
-    where E: Clone
+where
+    E: Clone,
 {
     type NodeId = Ix;
     fn into_weighted_edge(self) -> (Ix, Ix, E) {
@@ -300,7 +285,9 @@
 }
 
 impl<'a, Ix, E> IntoWeightedEdge<E> for &'a (Ix, Ix)
-    where Ix: Copy, E: Default
+where
+    Ix: Copy,
+    E: Default,
 {
     type NodeId = Ix;
     fn into_weighted_edge(self) -> (Ix, Ix, E) {
@@ -310,7 +297,9 @@
 }
 
 impl<'a, Ix, E> IntoWeightedEdge<E> for &'a (Ix, Ix, E)
-    where Ix: Copy, E: Clone
+where
+    Ix: Copy,
+    E: Clone,
 {
     type NodeId = Ix;
     fn into_weighted_edge(self) -> (Ix, Ix, E) {
diff --git a/src/macros.rs b/src/macros.rs
index 964372f..0d86ad1 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -1,4 +1,3 @@
-
 macro_rules! clone_fields {
     ($name:ident, $($field:ident),+ $(,)*) => (
         fn clone(&self) -> Self {
@@ -10,4 +9,3 @@
         }
     );
 }
-
diff --git a/src/matrix_graph.rs b/src/matrix_graph.rs
index d64747c..0e0c26c 100644
--- a/src/matrix_graph.rs
+++ b/src/matrix_graph.rs
@@ -10,32 +10,14 @@
 
 use fixedbitset::FixedBitSet;
 
-use crate::{
-    Directed,
-    EdgeType,
-    Outgoing,
-    Undirected,
-    Direction,
-    IntoWeightedEdge,
-};
+use crate::{Directed, Direction, EdgeType, IntoWeightedEdge, Outgoing, Undirected};
 
 use crate::graph::NodeIndex as GraphNodeIndex;
 
 use crate::visit::{
-    Data,
-    GetAdjacencyMatrix,
-    GraphBase,
-    GraphProp,
-    IntoEdgeReferences,
-    IntoEdges,
-    IntoNeighbors,
-    IntoNeighborsDirected,
-    IntoNodeIdentifiers,
-    IntoNodeReferences,
-    NodeCount,
-    NodeIndexable,
-    NodeCompactIndexable,
-    Visitable,
+    Data, GetAdjacencyMatrix, GraphBase, GraphProp, IntoEdgeReferences, IntoEdges, IntoNeighbors,
+    IntoNeighborsDirected, IntoNodeIdentifiers, IntoNodeReferences, NodeCompactIndexable,
+    NodeCount, NodeIndexable, Visitable,
 };
 
 use crate::data::Build;
@@ -48,7 +30,7 @@
 type DefaultIx = u16;
 
 /// Node identifier.
-pub type NodeIndex<Ix=DefaultIx> = GraphNodeIndex<Ix>;
+pub type NodeIndex<Ix = DefaultIx> = GraphNodeIndex<Ix>;
 
 mod private {
     pub trait Sealed {}
@@ -125,20 +107,29 @@
     }
 
     fn as_ref(&self) -> Option<&Self::Wrapped> {
-        if !self.is_null() { Some(&self.0) }
-        else { None }
+        if !self.is_null() {
+            Some(&self.0)
+        } else {
+            None
+        }
     }
 
     fn as_mut(&mut self) -> Option<&mut Self::Wrapped> {
-        if !self.is_null() { Some(&mut self.0) }
-        else { None }
+        if !self.is_null() {
+            Some(&mut self.0)
+        } else {
+            None
+        }
     }
 }
 
 impl<T: Zero> Into<Option<T>> for NotZero<T> {
     fn into(self) -> Option<T> {
-        if !self.is_null() { Some(self.0) }
-        else { None }
+        if !self.is_null() {
+            Some(self.0)
+        } else {
+            None
+        }
     }
 }
 
@@ -167,7 +158,7 @@
                 self == &Self::zero()
             }
         }
-    }
+    };
 }
 
 macro_rules! not_zero_impls {
@@ -208,7 +199,8 @@
 /// matrix is stored. Since the backing array stores edge weights, it is recommended to box large
 /// edge weights.
 #[derive(Clone)]
-pub struct MatrixGraph<N, E, Ty = Directed, Null: Nullable<Wrapped=E> = Option<E>, Ix = DefaultIx> {
+pub struct MatrixGraph<N, E, Ty = Directed, Null: Nullable<Wrapped = E> = Option<E>, Ix = DefaultIx>
+{
     node_adjacencies: Vec<Null>,
     node_capacity: usize,
     nodes: IdStorage<N>,
@@ -223,7 +215,9 @@
 /// A `MatrixGraph` with undirected edges.
 pub type UnMatrix<N, E, Null = Option<E>, Ix = DefaultIx> = MatrixGraph<N, E, Undirected, Null, Ix>;
 
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType>
+    MatrixGraph<N, E, Ty, Null, Ix>
+{
     /// Create a new `MatrixGraph` with estimated capacity for nodes.
     pub fn with_capacity(node_capacity: usize) -> Self {
         let mut m = Self {
@@ -309,7 +303,11 @@
 
     #[inline]
     fn extend_capacity_for_node(&mut self, min_node: NodeIndex<Ix>) {
-        self.node_capacity = extend_linearized_matrix::<Ty, _>(&mut self.node_adjacencies, self.node_capacity, min_node.index());
+        self.node_capacity = extend_linearized_matrix::<Ty, _>(
+            &mut self.node_adjacencies,
+            self.node_capacity,
+            min_node.index(),
+        );
     }
 
     #[inline]
@@ -363,7 +361,9 @@
     /// **Panics** if no edge exists between `a` and `b`.
     pub fn remove_edge(&mut self, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> E {
         let p = self.to_edge_position(a, b);
-        let old_weight = mem::replace(&mut self.node_adjacencies[p], Default::default()).into().unwrap();
+        let old_weight = mem::replace(&mut self.node_adjacencies[p], Default::default())
+            .into()
+            .unwrap();
         let old_weight: Option<_> = old_weight.into();
         self.nb_edges -= 1;
         old_weight.unwrap()
@@ -423,7 +423,11 @@
     /// Produces an empty iterator if the node doesn't exist.<br>
     /// Iterator element type is [`NodeIndex<Ix>`](../graph/struct.NodeIndex.html).
     pub fn neighbors(&self, a: NodeIndex<Ix>) -> Neighbors<Ty, Null, Ix> {
-        Neighbors(Edges::on_columns(a.index(), &self.node_adjacencies, self.node_capacity))
+        Neighbors(Edges::on_columns(
+            a.index(),
+            &self.node_adjacencies,
+            self.node_capacity,
+        ))
     }
 
     /// Return an iterator of all edges of `a`.
@@ -455,10 +459,11 @@
     /// ]);
     /// ```
     pub fn from_edges<I>(iterable: I) -> Self
-        where I: IntoIterator,
-              I::Item: IntoWeightedEdge<E>,
-              <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
-              N: Default,
+    where
+        I: IntoIterator,
+        I::Item: IntoWeightedEdge<E>,
+        <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
+        N: Default,
     {
         let mut g = Self::default();
         g.extend_with_edges(iterable);
@@ -473,10 +478,11 @@
     ///
     /// Nodes are inserted automatically to match the edges.
     pub fn extend_with_edges<I>(&mut self, iterable: I)
-        where I: IntoIterator,
-              I::Item: IntoWeightedEdge<E>,
-              <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
-              N: Default,
+    where
+        I: IntoIterator,
+        I::Item: IntoWeightedEdge<E>,
+        <I::Item as IntoWeightedEdge<E>>::NodeId: Into<NodeIndex<Ix>>,
+        N: Default,
     {
         for elt in iterable {
             let (source, target, weight) = elt.into_weighted_edge();
@@ -490,7 +496,7 @@
     }
 }
 
-impl<N, E, Null: Nullable<Wrapped=E>, Ix: IndexType> MatrixGraph<N, E, Directed, Null, Ix> {
+impl<N, E, Null: Nullable<Wrapped = E>, Ix: IndexType> MatrixGraph<N, E, Directed, Null, Ix> {
     /// Return an iterator of all neighbors that have an edge between them and
     /// `a`, in the specified direction.
     /// If the graph's edges are undirected, this is equivalent to *.neighbors(a)*.
@@ -500,11 +506,19 @@
     ///
     /// Produces an empty iterator if the node doesn't exist.<br>
     /// Iterator element type is [`NodeIndex<Ix>`](../graph/struct.NodeIndex.html).
-    pub fn neighbors_directed(&self, a: NodeIndex<Ix>, d: Direction) -> Neighbors<Directed, Null, Ix> {
+    pub fn neighbors_directed(
+        &self,
+        a: NodeIndex<Ix>,
+        d: Direction,
+    ) -> Neighbors<Directed, Null, Ix> {
         if d == Outgoing {
             self.neighbors(a)
         } else {
-            Neighbors(Edges::on_rows(a.index(), &self.node_adjacencies, self.node_capacity))
+            Neighbors(Edges::on_rows(
+                a.index(),
+                &self.node_adjacencies,
+                self.node_capacity,
+            ))
         }
     }
 
@@ -537,7 +551,10 @@
 
 impl<'a, Ix: IndexType> NodeIdentifiers<'a, Ix> {
     fn new(iter: IdIterator<'a>) -> Self {
-        Self { iter, ix: PhantomData }
+        Self {
+            iter,
+            ix: PhantomData,
+        }
     }
 }
 
@@ -575,7 +592,9 @@
     type Item = (NodeIndex<Ix>, &'a N);
 
     fn next(&mut self) -> Option<Self::Item> {
-        self.iter.next().map(|i| (NodeIndex::new(i), &self.nodes[i]))
+        self.iter
+            .next()
+            .map(|i| (NodeIndex::new(i), &self.nodes[i]))
     }
 }
 
@@ -597,7 +616,8 @@
 impl<'a, Ty: EdgeType, Null: 'a + Nullable, Ix> EdgeReferences<'a, Ty, Null, Ix> {
     fn new(node_adjacencies: &'a [Null], node_capacity: usize) -> Self {
         EdgeReferences {
-            row: 0, column: 0,
+            row: 0,
+            column: 0,
             node_adjacencies,
             node_capacity,
             ty: PhantomData,
@@ -606,7 +626,9 @@
     }
 }
 
-impl<'a, Ty: EdgeType, Null: Nullable, Ix: IndexType> Iterator for EdgeReferences<'a, Ty, Null, Ix> {
+impl<'a, Ty: EdgeType, Null: Nullable, Ix: IndexType> Iterator
+    for EdgeReferences<'a, Ty, Null, Ix>
+{
     type Item = (NodeIndex<Ix>, NodeIndex<Ix>, &'a Null::Wrapped);
 
     fn next(&mut self) -> Option<Self::Item> {
@@ -621,7 +643,11 @@
             // Note that for undirected graphs, we don't want to yield the same edge twice,
             // therefore the maximum column length should be the index new after the row index.
             self.column += 1;
-            let max_column_len = if !Ty::is_directed() { row + 1 } else { self.node_capacity };
+            let max_column_len = if !Ty::is_directed() {
+                row + 1
+            } else {
+                self.node_capacity
+            };
             if self.column >= max_column_len {
                 self.column = 0;
                 self.row += 1;
@@ -713,14 +739,14 @@
             }
 
             match self.iter_direction {
-                Rows    => self.row += 1,
+                Rows => self.row += 1,
                 Columns => self.column += 1,
             }
 
             let p = to_linearized_matrix_position::<Ty>(row, column, self.node_capacity);
             if let Some(e) = self.node_adjacencies[p].as_ref() {
                 let (a, b) = match self.iter_direction {
-                    Rows    => (column, row),
+                    Rows => (column, row),
                     Columns => (row, column),
                 };
 
@@ -740,7 +766,11 @@
 }
 
 #[inline]
-fn extend_linearized_matrix<Ty: EdgeType, T: Default>(node_adjacencies: &mut Vec<T>, old_node_capacity: usize, min_node_capacity: usize) -> usize {
+fn extend_linearized_matrix<Ty: EdgeType, T: Default>(
+    node_adjacencies: &mut Vec<T>,
+    old_node_capacity: usize,
+    min_node_capacity: usize,
+) -> usize {
     if Ty::is_directed() {
         extend_flat_square_matrix(node_adjacencies, old_node_capacity, min_node_capacity)
     } else {
@@ -754,7 +784,11 @@
 }
 
 #[inline]
-fn extend_flat_square_matrix<T: Default>(node_adjacencies: &mut Vec<T>, old_node_capacity: usize, min_node_capacity: usize) -> usize {
+fn extend_flat_square_matrix<T: Default>(
+    node_adjacencies: &mut Vec<T>,
+    old_node_capacity: usize,
+    min_node_capacity: usize,
+) -> usize {
     let min_node_capacity = (min_node_capacity + 1).next_power_of_two();
 
     // Optimization: when resizing the matrix this way we skip the first few grows to make
@@ -782,12 +816,19 @@
 
 #[inline]
 fn to_lower_triangular_matrix_position(row: usize, column: usize) -> usize {
-    let (row, column) = if row > column { (row, column) } else { (column, row) };
+    let (row, column) = if row > column {
+        (row, column)
+    } else {
+        (column, row)
+    };
     (row * (row + 1)) / 2 + column
 }
 
 #[inline]
-fn extend_lower_triangular_matrix<T: Default>(node_adjacencies: &mut Vec<T>, new_node_capacity: usize) -> usize {
+fn extend_lower_triangular_matrix<T: Default>(
+    node_adjacencies: &mut Vec<T>,
+    new_node_capacity: usize,
+) -> usize {
     let max_pos = to_lower_triangular_matrix_position(new_node_capacity, new_node_capacity);
     ensure_len(node_adjacencies, max_pos + 1);
     new_node_capacity + 1
@@ -915,7 +956,9 @@
 }
 
 /// Create a new empty `MatrixGraph`.
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> Default for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> Default
+    for MatrixGraph<N, E, Ty, Null, Ix>
+{
     fn default() -> Self {
         Self::with_capacity(0)
     }
@@ -944,7 +987,9 @@
 /// Index the `MatrixGraph` by `NodeIndex` to access node weights.
 ///
 /// **Panics** if the node doesn't exist.
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> Index<NodeIndex<Ix>> for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> Index<NodeIndex<Ix>>
+    for MatrixGraph<N, E, Ty, Null, Ix>
+{
     type Output = N;
 
     fn index(&self, ax: NodeIndex<Ix>) -> &N {
@@ -955,13 +1000,17 @@
 /// Index the `MatrixGraph` by `NodeIndex` to access node weights.
 ///
 /// **Panics** if the node doesn't exist.
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> IndexMut<NodeIndex<Ix>> for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> IndexMut<NodeIndex<Ix>>
+    for MatrixGraph<N, E, Ty, Null, Ix>
+{
     fn index_mut(&mut self, ax: NodeIndex<Ix>) -> &mut N {
         self.node_weight_mut(ax)
     }
 }
 
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> NodeCount for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> NodeCount
+    for MatrixGraph<N, E, Ty, Null, Ix>
+{
     fn node_count(&self) -> usize {
         MatrixGraph::node_count(self)
     }
@@ -972,7 +1021,9 @@
 /// Also available with indexing syntax: `&graph[e]`.
 ///
 /// **Panics** if no edge exists between `a` and `b`.
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> Index<(NodeIndex<Ix>, NodeIndex<Ix>)> for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType>
+    Index<(NodeIndex<Ix>, NodeIndex<Ix>)> for MatrixGraph<N, E, Ty, Null, Ix>
+{
     type Output = E;
 
     fn index(&self, (ax, bx): (NodeIndex<Ix>, NodeIndex<Ix>)) -> &E {
@@ -985,24 +1036,29 @@
 /// Also available with indexing syntax: `&mut graph[e]`.
 ///
 /// **Panics** if no edge exists between `a` and `b`.
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> IndexMut<(NodeIndex<Ix>, NodeIndex<Ix>)> for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType>
+    IndexMut<(NodeIndex<Ix>, NodeIndex<Ix>)> for MatrixGraph<N, E, Ty, Null, Ix>
+{
     fn index_mut(&mut self, (ax, bx): (NodeIndex<Ix>, NodeIndex<Ix>)) -> &mut E {
         self.edge_weight_mut(ax, bx)
     }
 }
 
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> GetAdjacencyMatrix for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> GetAdjacencyMatrix
+    for MatrixGraph<N, E, Ty, Null, Ix>
+{
     type AdjMatrix = ();
 
-    fn adjacency_matrix(&self) -> Self::AdjMatrix {
-    }
+    fn adjacency_matrix(&self) -> Self::AdjMatrix {}
 
     fn is_adjacent(&self, _: &Self::AdjMatrix, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool {
         MatrixGraph::has_edge(self, a, b)
     }
 }
 
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> Visitable for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> Visitable
+    for MatrixGraph<N, E, Ty, Null, Ix>
+{
     type Map = FixedBitSet;
 
     fn visit_map(&self) -> FixedBitSet {
@@ -1015,21 +1071,29 @@
     }
 }
 
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> GraphBase for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> GraphBase
+    for MatrixGraph<N, E, Ty, Null, Ix>
+{
     type NodeId = NodeIndex<Ix>;
     type EdgeId = (NodeIndex<Ix>, NodeIndex<Ix>);
 }
 
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> GraphProp for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> GraphProp
+    for MatrixGraph<N, E, Ty, Null, Ix>
+{
     type EdgeType = Ty;
 }
 
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> Data for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> Data
+    for MatrixGraph<N, E, Ty, Null, Ix>
+{
     type NodeWeight = N;
     type EdgeWeight = E;
 }
 
-impl<'a, N, E: 'a, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> IntoNodeIdentifiers for &'a MatrixGraph<N, E, Ty, Null, Ix> {
+impl<'a, N, E: 'a, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> IntoNodeIdentifiers
+    for &'a MatrixGraph<N, E, Ty, Null, Ix>
+{
     type NodeIdentifiers = NodeIdentifiers<'a, Ix>;
 
     fn node_identifiers(self) -> Self::NodeIdentifiers {
@@ -1037,7 +1101,9 @@
     }
 }
 
-impl<'a, N, E: 'a, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> IntoNeighbors for &'a MatrixGraph<N, E, Ty, Null, Ix> {
+impl<'a, N, E: 'a, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> IntoNeighbors
+    for &'a MatrixGraph<N, E, Ty, Null, Ix>
+{
     type Neighbors = Neighbors<'a, Ty, Null, Ix>;
 
     fn neighbors(self, a: NodeIndex<Ix>) -> Self::Neighbors {
@@ -1045,7 +1111,9 @@
     }
 }
 
-impl<'a, N, E: 'a, Null: Nullable<Wrapped=E>, Ix: IndexType> IntoNeighborsDirected for &'a MatrixGraph<N, E, Directed, Null, Ix> {
+impl<'a, N, E: 'a, Null: Nullable<Wrapped = E>, Ix: IndexType> IntoNeighborsDirected
+    for &'a MatrixGraph<N, E, Directed, Null, Ix>
+{
     type NeighborsDirected = Neighbors<'a, Directed, Null, Ix>;
 
     fn neighbors_directed(self, a: NodeIndex<Ix>, d: Direction) -> Self::NeighborsDirected {
@@ -1053,7 +1121,9 @@
     }
 }
 
-impl<'a, N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> IntoNodeReferences for &'a MatrixGraph<N, E, Ty, Null, Ix> {
+impl<'a, N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> IntoNodeReferences
+    for &'a MatrixGraph<N, E, Ty, Null, Ix>
+{
     type NodeRef = (NodeIndex<Ix>, &'a N);
     type NodeReferences = NodeReferences<'a, N, Ix>;
     fn node_references(self) -> Self::NodeReferences {
@@ -1061,7 +1131,9 @@
     }
 }
 
-impl<'a, N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> IntoEdgeReferences for &'a MatrixGraph<N, E, Ty, Null, Ix> {
+impl<'a, N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> IntoEdgeReferences
+    for &'a MatrixGraph<N, E, Ty, Null, Ix>
+{
     type EdgeRef = (NodeIndex<Ix>, NodeIndex<Ix>, &'a E);
     type EdgeReferences = EdgeReferences<'a, Ty, Null, Ix>;
     fn edge_references(self) -> Self::EdgeReferences {
@@ -1069,14 +1141,18 @@
     }
 }
 
-impl<'a, N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> IntoEdges for &'a MatrixGraph<N, E, Ty, Null, Ix> {
+impl<'a, N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> IntoEdges
+    for &'a MatrixGraph<N, E, Ty, Null, Ix>
+{
     type Edges = Edges<'a, Ty, Null, Ix>;
     fn edges(self, a: Self::NodeId) -> Self::Edges {
         MatrixGraph::edges(self, a)
     }
 }
 
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> NodeIndexable for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> NodeIndexable
+    for MatrixGraph<N, E, Ty, Null, Ix>
+{
     fn node_bound(&self) -> usize {
         self.node_count()
     }
@@ -1090,15 +1166,24 @@
     }
 }
 
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> NodeCompactIndexable for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> NodeCompactIndexable
+    for MatrixGraph<N, E, Ty, Null, Ix>
+{
 }
 
-impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped=E>, Ix: IndexType> Build for MatrixGraph<N, E, Ty, Null, Ix> {
+impl<N, E, Ty: EdgeType, Null: Nullable<Wrapped = E>, Ix: IndexType> Build
+    for MatrixGraph<N, E, Ty, Null, Ix>
+{
     fn add_node(&mut self, weight: Self::NodeWeight) -> Self::NodeId {
         self.add_node(weight)
     }
 
-    fn add_edge(&mut self, a: Self::NodeId, b: Self::NodeId, weight: Self::EdgeWeight) -> Option<Self::EdgeId> {
+    fn add_edge(
+        &mut self,
+        a: Self::NodeId,
+        b: Self::NodeId,
+        weight: Self::EdgeWeight,
+    ) -> Option<Self::EdgeId> {
         if !self.has_edge(a, b) {
             MatrixGraph::update_edge(self, a, b, weight);
             Some((a, b))
@@ -1107,7 +1192,12 @@
         }
     }
 
-    fn update_edge(&mut self, a: Self::NodeId, b: Self::NodeId, weight: Self::EdgeWeight) -> Self::EdgeId {
+    fn update_edge(
+        &mut self,
+        a: Self::NodeId,
+        b: Self::NodeId,
+        weight: Self::EdgeWeight,
+    ) -> Self::EdgeId {
         MatrixGraph::update_edge(self, a, b, weight);
         (a, b)
     }
@@ -1116,7 +1206,7 @@
 #[cfg(test)]
 mod tests {
     use super::*;
-    use crate::{Outgoing, Incoming};
+    use crate::{Incoming, Outgoing};
 
     #[test]
     fn test_new() {
@@ -1206,7 +1296,8 @@
     }
 
     impl<It, T> IntoVec<T> for It
-        where It: Iterator<Item=T>,
+    where
+        It: Iterator<Item = T>,
     {
         fn into_vec(self) -> Vec<T> {
             self.collect()
@@ -1281,8 +1372,9 @@
     }
 
     impl<It, T> IntoSortedVec<T> for It
-        where It: Iterator<Item=T>,
-            T: Ord,
+    where
+        It: Iterator<Item = T>,
+        T: Ord,
     {
         fn into_sorted_vec(self) -> Vec<T> {
             let mut v: Vec<T> = self.collect();
@@ -1401,9 +1493,13 @@
     #[test]
     fn test_edges_directed() {
         let g: MatrixGraph<char, bool> = MatrixGraph::from_edges(&[
-            (0, 5), (0, 2), (0, 3), (0, 1),
+            (0, 5),
+            (0, 2),
+            (0, 3),
+            (0, 1),
             (1, 3),
-            (2, 3), (2, 4),
+            (2, 3),
+            (2, 4),
             (4, 0),
             (6, 6),
         ]);
@@ -1428,9 +1524,13 @@
     #[test]
     fn test_edges_undirected() {
         let g: UnMatrix<char, bool> = UnMatrix::from_edges(&[
-            (0, 5), (0, 2), (0, 3), (0, 1),
+            (0, 5),
+            (0, 2),
+            (0, 3),
+            (0, 1),
             (1, 3),
-            (2, 3), (2, 4),
+            (2, 3),
+            (2, 4),
             (4, 0),
             (6, 6),
         ]);
@@ -1459,9 +1559,13 @@
     #[test]
     fn test_edge_references() {
         let g: MatrixGraph<char, bool> = MatrixGraph::from_edges(&[
-            (0, 5), (0, 2), (0, 3), (0, 1),
+            (0, 5),
+            (0, 2),
+            (0, 3),
+            (0, 1),
             (1, 3),
-            (2, 3), (2, 4),
+            (2, 3),
+            (2, 4),
             (4, 0),
             (6, 6),
         ]);
@@ -1472,9 +1576,13 @@
     #[test]
     fn test_edge_references_undirected() {
         let g: UnMatrix<char, bool> = UnMatrix::from_edges(&[
-            (0, 5), (0, 2), (0, 3), (0, 1),
+            (0, 5),
+            (0, 2),
+            (0, 3),
+            (0, 1),
             (1, 3),
-            (2, 3), (2, 4),
+            (2, 3),
+            (2, 4),
             (4, 0),
             (6, 6),
         ]);
diff --git a/src/prelude.rs b/src/prelude.rs
index d35161e..f50b338 100644
--- a/src/prelude.rs
+++ b/src/prelude.rs
@@ -1,4 +1,3 @@
-
 //! Commonly used items.
 //!
 //! ```
@@ -6,43 +5,17 @@
 //! ```
 
 #[doc(no_inline)]
-pub use crate::graph::{
-    Graph,
-    NodeIndex,
-    EdgeIndex,
-    DiGraph,
-    UnGraph,
-};
+pub use crate::graph::{DiGraph, EdgeIndex, Graph, NodeIndex, UnGraph};
 #[cfg(feature = "graphmap")]
 #[doc(no_inline)]
-pub use crate::graphmap::{
-    GraphMap,
-    DiGraphMap,
-    UnGraphMap,
-};
+pub use crate::graphmap::{DiGraphMap, GraphMap, UnGraphMap};
 #[doc(no_inline)]
 #[cfg(feature = "stable_graph")]
-pub use crate::stable_graph::{
-    StableGraph,
-    StableDiGraph,
-    StableUnGraph,
-};
+pub use crate::stable_graph::{StableDiGraph, StableGraph, StableUnGraph};
 #[doc(no_inline)]
-pub use crate::visit::{
-    Bfs,
-    Dfs,
-    DfsPostOrder,
-};
+pub use crate::visit::{Bfs, Dfs, DfsPostOrder};
 #[doc(no_inline)]
-pub use crate::{
-    Direction,
-    Incoming,
-    Outgoing,
-    Directed,
-    Undirected,
-};
+pub use crate::{Directed, Direction, Incoming, Outgoing, Undirected};
 
 #[doc(no_inline)]
-pub use crate::visit::{
-    EdgeRef,
-};
+pub use crate::visit::EdgeRef;
diff --git a/src/quickcheck.rs b/src/quickcheck.rs
index 7ce6cad..0c7ce6b 100644
--- a/src/quickcheck.rs
+++ b/src/quickcheck.rs
@@ -1,22 +1,13 @@
 extern crate quickcheck;
-use self::quickcheck::{Gen, Arbitrary};
+use self::quickcheck::{Arbitrary, Gen};
 
-use crate::{
-    Graph,
-    EdgeType,
-};
-use crate::graph::{
-    IndexType,
-    node_index,
-};
+use crate::graph::{node_index, IndexType};
 #[cfg(feature = "stable_graph")]
 use crate::stable_graph::StableGraph;
+use crate::{EdgeType, Graph};
 
 #[cfg(feature = "graphmap")]
-use crate::graphmap::{
-    GraphMap,
-    NodeTrait,
-};
+use crate::graphmap::{GraphMap, NodeTrait};
 use crate::visit::NodeIndexable;
 
 /// Return a random float in the range [0, 1.)
@@ -38,10 +29,11 @@
 ///
 /// Requires crate feature `"quickcheck"`
 impl<N, E, Ty, Ix> Arbitrary for Graph<N, E, Ty, Ix>
-    where N: Arbitrary,
-          E: Arbitrary,
-          Ty: EdgeType + Send + 'static,
-          Ix: IndexType + Send,
+where
+    N: Arbitrary,
+    E: Arbitrary,
+    Ty: EdgeType + Send + 'static,
+    Ix: IndexType + Send,
 {
     fn arbitrary<G: Gen>(g: &mut G) -> Self {
         let nodes = usize::arbitrary(g);
@@ -71,17 +63,18 @@
 
     // shrink the graph by splitting it in two by a very
     // simple algorithm, just even and odd node indices
-    fn shrink(&self) -> Box<dyn Iterator<Item=Self>> {
+    fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
         let self_ = self.clone();
         Box::new((0..2).filter_map(move |x| {
-            let gr = self_.filter_map(|i, w| {
-                if i.index() % 2 == x {
-                    Some(w.clone())
-                } else {
-                    None
-                }
-            },
-            |_, w| Some(w.clone())
+            let gr = self_.filter_map(
+                |i, w| {
+                    if i.index() % 2 == x {
+                        Some(w.clone())
+                    } else {
+                        None
+                    }
+                },
+                |_, w| Some(w.clone()),
             );
             // make sure we shrink
             if gr.node_count() < self_.node_count() {
@@ -104,10 +97,11 @@
 ///
 /// Requires crate features `"quickcheck"` and `"stable_graph"`
 impl<N, E, Ty, Ix> Arbitrary for StableGraph<N, E, Ty, Ix>
-    where N: Arbitrary,
-          E: Arbitrary,
-          Ty: EdgeType + Send + 'static,
-          Ix: IndexType + Send,
+where
+    N: Arbitrary,
+    E: Arbitrary,
+    Ty: EdgeType + Send + 'static,
+    Ix: IndexType + Send,
 {
     fn arbitrary<G: Gen>(g: &mut G) -> Self {
         let nodes = usize::arbitrary(g);
@@ -149,17 +143,18 @@
 
     // shrink the graph by splitting it in two by a very
     // simple algorithm, just even and odd node indices
-    fn shrink(&self) -> Box<dyn Iterator<Item=Self>> {
+    fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
         let self_ = self.clone();
         Box::new((0..2).filter_map(move |x| {
-            let gr = self_.filter_map(|i, w| {
-                if i.index() % 2 == x {
-                    Some(w.clone())
-                } else {
-                    None
-                }
-            },
-            |_, w| Some(w.clone())
+            let gr = self_.filter_map(
+                |i, w| {
+                    if i.index() % 2 == x {
+                        Some(w.clone())
+                    } else {
+                        None
+                    }
+                },
+                |_, w| Some(w.clone()),
             );
             // make sure we shrink
             if gr.node_count() < self_.node_count() {
@@ -182,9 +177,10 @@
 /// Requires crate features `"quickcheck"` and `"graphmap"`
 #[cfg(feature = "graphmap")]
 impl<N, E, Ty> Arbitrary for GraphMap<N, E, Ty>
-    where N: NodeTrait + Arbitrary,
-          E: Arbitrary,
-          Ty: EdgeType + Clone + Send + 'static,
+where
+    N: NodeTrait + Arbitrary,
+    E: Arbitrary,
+    Ty: EdgeType + Clone + Send + 'static,
 {
     fn arbitrary<G: Gen>(g: &mut G) -> Self {
         let nodes = usize::arbitrary(g);
@@ -203,7 +199,11 @@
             gr.add_node(node);
         }
         for (index, &i) in nodes.iter().enumerate() {
-            let js = if Ty::is_directed() { &nodes[..] } else { &nodes[index..] };
+            let js = if Ty::is_directed() {
+                &nodes[..]
+            } else {
+                &nodes[index..]
+            };
             for &j in js {
                 let p: f64 = random_01(g);
                 if p <= edge_prob {
diff --git a/src/scored.rs b/src/scored.rs
index cb19147..a4f88a9 100644
--- a/src/scored.rs
+++ b/src/scored.rs
@@ -50,4 +50,3 @@
         }
     }
 }
-
diff --git a/src/serde_utils.rs b/src/serde_utils.rs
index fcda128..f127f33 100644
--- a/src/serde_utils.rs
+++ b/src/serde_utils.rs
@@ -1,7 +1,7 @@
+use serde::de::{Deserialize, Error, SeqAccess, Visitor};
+use serde::ser::{Serialize, SerializeSeq, Serializer};
 use std::fmt;
 use std::marker::PhantomData;
-use serde::de::{Error, Visitor, Deserialize, SeqAccess};
-use serde::ser::{Serializer, SerializeSeq, Serialize};
 
 /// Map to serializeable representation
 pub trait IntoSerializable {
@@ -10,25 +10,27 @@
 }
 
 /// Map from deserialized representation
-pub trait FromDeserialized : Sized {
+pub trait FromDeserialized: Sized {
     type Input;
-    fn from_deserialized<E>(input: Self::Input) -> Result<Self, E> where E: Error;
+    fn from_deserialized<E>(input: Self::Input) -> Result<Self, E>
+    where
+        E: Error;
 }
 
-
-
 /// Serde combinator. A sequence visitor that maps deserialized elements
 /// lazily; the visitor can also emit new errors if the elements have errors.
 pub struct MappedSequenceVisitor<T, R, F>
-    where F: Fn(T) -> Result<R, &'static str>
+where
+    F: Fn(T) -> Result<R, &'static str>,
 {
     f: F,
-    marker: PhantomData<fn() -> T>
+    marker: PhantomData<fn() -> T>,
 }
 
-impl<'de, F, T, R> MappedSequenceVisitor<T, R, F> 
-    where T: Deserialize<'de>,
-          F: Fn(T) -> Result<R, &'static str>,
+impl<'de, F, T, R> MappedSequenceVisitor<T, R, F>
+where
+    T: Deserialize<'de>,
+    F: Fn(T) -> Result<R, &'static str>,
 {
     pub fn new(f: F) -> Self {
         MappedSequenceVisitor {
@@ -38,9 +40,10 @@
     }
 }
 
-impl<'de, F, T, R> Visitor<'de> for MappedSequenceVisitor<T, R, F> 
-    where T: Deserialize<'de>,
-          F: Fn(T) -> Result<R, &'static str>,
+impl<'de, F, T, R> Visitor<'de> for MappedSequenceVisitor<T, R, F>
+where
+    T: Deserialize<'de>,
+    F: Fn(T) -> Result<R, &'static str>,
 {
     type Value = Vec<R>;
 
@@ -48,7 +51,8 @@
         write!(formatter, "a sequence")
     }
     fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
-        where A: SeqAccess<'de>,
+    where
+        A: SeqAccess<'de>,
     {
         let mut v = Vec::new();
         while let Some(elem) = seq.next_element()? {
@@ -61,12 +65,11 @@
     }
 }
 
-
-pub trait CollectSeqWithLength : Serializer {
-    fn collect_seq_with_length<I>(self, length: usize, iterable: I)
-        -> Result<Self::Ok, Self::Error>
-        where I: IntoIterator,
-              I::Item: Serialize
+pub trait CollectSeqWithLength: Serializer {
+    fn collect_seq_with_length<I>(self, length: usize, iterable: I) -> Result<Self::Ok, Self::Error>
+    where
+        I: IntoIterator,
+        I::Item: Serialize,
     {
         let mut count = 0;
         let mut seq = self.serialize_seq(Some(length))?;
@@ -78,15 +81,15 @@
         seq.end()
     }
 
-    fn collect_seq_exact<I>(self, iterable: I)
-        -> Result<Self::Ok, Self::Error>
-        where I: IntoIterator,
-              I::Item: Serialize,
-              I::IntoIter: ExactSizeIterator,
+    fn collect_seq_exact<I>(self, iterable: I) -> Result<Self::Ok, Self::Error>
+    where
+        I: IntoIterator,
+        I::Item: Serialize,
+        I::IntoIter: ExactSizeIterator,
     {
         let iter = iterable.into_iter();
         self.collect_seq_with_length(iter.len(), iter)
     }
 }
 
-impl<S> CollectSeqWithLength for S where S: Serializer { }
+impl<S> CollectSeqWithLength for S where S: Serializer {}
diff --git a/src/simple_paths.rs b/src/simple_paths.rs
index 7d698df..76be84e 100644
--- a/src/simple_paths.rs
+++ b/src/simple_paths.rs
@@ -6,26 +6,26 @@
 use indexmap::IndexSet;
 
 use crate::{
+    visit::{IntoNeighborsDirected, NodeCount},
     Direction::Outgoing,
-    visit::{
-        IntoNeighborsDirected,
-        NodeCount,
-    },
 };
 
 /// Returns iterator that produces all simple paths from `from` node to `to`, which contains at least `min_intermidiate_nodes` nodes
 /// and at most `max_intermidiate_nodes`, if given, limited by graph's order otherwise
 /// Simple path is path without repetitions
 /// Algorithm is adopted from https://networkx.github.io/documentation/stable/reference/algorithms/generated/networkx.algorithms.simple_paths.all_simple_paths.html
-pub fn all_simple_paths<TargetColl, G>(graph: G,
-                                       from: G::NodeId,
-                                       to: G::NodeId,
-                                       min_intermidiate_nodes: usize,
-                                       max_intermidiate_nodes: Option<usize>) -> impl Iterator<Item=TargetColl>
-    where G: NodeCount,
-          G: IntoNeighborsDirected,
-          G::NodeId: Eq + Hash,
-          TargetColl: FromIterator<G::NodeId>
+pub fn all_simple_paths<TargetColl, G>(
+    graph: G,
+    from: G::NodeId,
+    to: G::NodeId,
+    min_intermidiate_nodes: usize,
+    max_intermidiate_nodes: Option<usize>,
+) -> impl Iterator<Item = TargetColl>
+where
+    G: NodeCount,
+    G: IntoNeighborsDirected,
+    G::NodeId: Eq + Hash,
+    TargetColl: FromIterator<G::NodeId>,
 {
     // how many nodes are allowed in simple path up to target node
     // it is min/max allowed path length minus one, because it is more appropriate when implementing lookahead
@@ -50,7 +50,11 @@
                 if visited.len() < max_length {
                     if child == to {
                         if visited.len() >= min_length {
-                            let path = visited.iter().cloned().chain(Some(to)).collect::<TargetColl>();
+                            let path = visited
+                                .iter()
+                                .cloned()
+                                .chain(Some(to))
+                                .collect::<TargetColl>();
                             return Some(path);
                         }
                     } else if !visited.contains(&child) {
@@ -59,7 +63,11 @@
                     }
                 } else {
                     if (child == to || children.any(|v| v == to)) && visited.len() >= min_length {
-                        let path = visited.iter().cloned().chain(Some(to)).collect::<TargetColl>();
+                        let path = visited
+                            .iter()
+                            .cloned()
+                            .chain(Some(to))
+                            .collect::<TargetColl>();
                         return Some(path);
                     }
                     stack.pop();
@@ -76,17 +84,11 @@
 
 #[cfg(test)]
 mod test {
-    use std::{
-        collections::HashSet,
-        iter::FromIterator,
-    };
+    use std::{collections::HashSet, iter::FromIterator};
 
     use itertools::assert_equal;
 
-    use crate::{
-        dot::Dot,
-        prelude::DiGraph,
-    };
+    use crate::{dot::Dot, prelude::DiGraph};
 
     use super::all_simple_paths;
 
@@ -105,7 +107,7 @@
             (4, 2),
             (4, 5),
             (5, 2),
-            (5, 3)
+            (5, 3),
         ]);
 
         let expexted_simple_paths_0_to_5 = vec![
@@ -120,27 +122,27 @@
         ];
 
         println!("{}", Dot::new(&graph));
-        let actual_simple_paths_0_to_5: HashSet<Vec<_>> = all_simple_paths(&graph, 0u32.into(), 5u32.into(), 0, None)
-            .map(|v: Vec<_>| v.into_iter().map(|i| i.index()).collect())
-            .collect();
+        let actual_simple_paths_0_to_5: HashSet<Vec<_>> =
+            all_simple_paths(&graph, 0u32.into(), 5u32.into(), 0, None)
+                .map(|v: Vec<_>| v.into_iter().map(|i| i.index()).collect())
+                .collect();
         assert_eq!(actual_simple_paths_0_to_5.len(), 8);
-        assert_eq!(HashSet::from_iter(expexted_simple_paths_0_to_5), actual_simple_paths_0_to_5);
+        assert_eq!(
+            HashSet::from_iter(expexted_simple_paths_0_to_5),
+            actual_simple_paths_0_to_5
+        );
     }
 
     #[test]
     fn test_one_simple_path() {
-        let graph = DiGraph::<i32, i32, _>::from_edges(&[
-            (0, 1),
-            (2, 1)
-        ]);
+        let graph = DiGraph::<i32, i32, _>::from_edges(&[(0, 1), (2, 1)]);
 
-        let expexted_simple_paths_0_to_1 = &[
-            vec![0usize, 1],
-        ];
+        let expexted_simple_paths_0_to_1 = &[vec![0usize, 1]];
         println!("{}", Dot::new(&graph));
-        let actual_simple_paths_0_to_1: Vec<Vec<_>> = all_simple_paths(&graph, 0u32.into(), 1u32.into(), 0, None)
-            .map(|v: Vec<_>| v.into_iter().map(|i| i.index()).collect())
-            .collect();
+        let actual_simple_paths_0_to_1: Vec<Vec<_>> =
+            all_simple_paths(&graph, 0u32.into(), 1u32.into(), 0, None)
+                .map(|v: Vec<_>| v.into_iter().map(|i| i.index()).collect())
+                .collect();
 
         assert_eq!(actual_simple_paths_0_to_1.len(), 1);
         assert_equal(expexted_simple_paths_0_to_1, &actual_simple_paths_0_to_1);
@@ -148,15 +150,13 @@
 
     #[test]
     fn test_no_simple_paths() {
-        let graph = DiGraph::<i32, i32, _>::from_edges(&[
-            (0, 1),
-            (2, 1)
-        ]);
+        let graph = DiGraph::<i32, i32, _>::from_edges(&[(0, 1), (2, 1)]);
 
         println!("{}", Dot::new(&graph));
-        let actual_simple_paths_0_to_2: Vec<Vec<_>> = all_simple_paths(&graph, 0u32.into(), 2u32.into(), 0, None)
-            .map(|v: Vec<_>| v.into_iter().map(|i| i.index()).collect())
-            .collect();
+        let actual_simple_paths_0_to_2: Vec<Vec<_>> =
+            all_simple_paths(&graph, 0u32.into(), 2u32.into(), 0, None)
+                .map(|v: Vec<_>| v.into_iter().map(|i| i.index()).collect())
+                .collect();
 
         assert_eq!(actual_simple_paths_0_to_2.len(), 0);
     }
diff --git a/src/traits_graph.rs b/src/traits_graph.rs
index 1eef177..272e9e7 100644
--- a/src/traits_graph.rs
+++ b/src/traits_graph.rs
@@ -1,33 +1,26 @@
-
 use fixedbitset::FixedBitSet;
 
-use super::{
-    EdgeType,
-};
+use super::EdgeType;
 
-use super::graph::{
-    Graph,
-    IndexType,
-    NodeIndex,
-};
+use super::graph::{Graph, IndexType, NodeIndex};
 #[cfg(feature = "stable_graph")]
 use crate::stable_graph::StableGraph;
-#[cfg(feature = "stable_graph")]
-use crate::visit::{NodeIndexable, IntoEdgeReferences};
 use crate::visit::EdgeRef;
+#[cfg(feature = "stable_graph")]
+use crate::visit::{IntoEdgeReferences, NodeIndexable};
 
 use super::visit::GetAdjacencyMatrix;
 
 /// The adjacency matrix for **Graph** is a bitmap that's computed by
 /// `.adjacency_matrix()`.
-impl<N, E, Ty, Ix> GetAdjacencyMatrix for Graph<N, E, Ty, Ix> where
+impl<N, E, Ty, Ix> GetAdjacencyMatrix for Graph<N, E, Ty, Ix>
+where
     Ty: EdgeType,
     Ix: IndexType,
 {
     type AdjMatrix = FixedBitSet;
 
-    fn adjacency_matrix(&self) -> FixedBitSet
-    {
+    fn adjacency_matrix(&self) -> FixedBitSet {
         let n = self.node_count();
         let mut matrix = FixedBitSet::with_capacity(n * n);
         for edge in self.edge_references() {
@@ -41,26 +34,24 @@
         matrix
     }
 
-    fn is_adjacent(&self, matrix: &FixedBitSet, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool
-    {
+    fn is_adjacent(&self, matrix: &FixedBitSet, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool {
         let n = self.node_count();
         let index = n * a.index() + b.index();
         matrix.contains(index)
     }
 }
 
-
 #[cfg(feature = "stable_graph")]
 /// The adjacency matrix for **Graph** is a bitmap that's computed by
 /// `.adjacency_matrix()`.
-impl<N, E, Ty, Ix> GetAdjacencyMatrix for StableGraph<N, E, Ty, Ix> where
+impl<N, E, Ty, Ix> GetAdjacencyMatrix for StableGraph<N, E, Ty, Ix>
+where
     Ty: EdgeType,
     Ix: IndexType,
 {
     type AdjMatrix = FixedBitSet;
 
-    fn adjacency_matrix(&self) -> FixedBitSet
-    {
+    fn adjacency_matrix(&self) -> FixedBitSet {
         let n = self.node_bound();
         let mut matrix = FixedBitSet::with_capacity(n * n);
         for edge in self.edge_references() {
@@ -74,12 +65,9 @@
         matrix
     }
 
-    fn is_adjacent(&self, matrix: &FixedBitSet, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool
-    {
+    fn is_adjacent(&self, matrix: &FixedBitSet, a: NodeIndex<Ix>, b: NodeIndex<Ix>) -> bool {
         let n = self.node_count();
         let index = n * a.index() + b.index();
         matrix.contains(index)
     }
 }
-
-
diff --git a/src/unionfind.rs b/src/unionfind.rs
index e64d8b6..2f6b12c 100644
--- a/src/unionfind.rs
+++ b/src/unionfind.rs
@@ -1,7 +1,7 @@
 //! `UnionFind<K>` is a disjoint-set data structure.
 
-use std::cmp::Ordering;
 use super::graph::IndexType;
+use std::cmp::Ordering;
 
 /// `UnionFind<K>` is a disjoint-set data structure. It tracks set membership of *n* elements
 /// indexed from *0* to *n - 1*. The scalar type is `K` which must be an unsigned integer type.
@@ -13,8 +13,7 @@
 /// “The amortized time per operation is **O(α(n))** where **α(n)** is the
 /// inverse of **f(x) = A(x, x)** with **A** being the extremely fast-growing Ackermann function.”
 #[derive(Debug, Clone)]
-pub struct UnionFind<K>
-{
+pub struct UnionFind<K> {
     // For element at index *i*, store the index of its parent; the representative itself
     // stores its own index. This forms equivalence classes which are the disjoint sets, each
     // with a unique representative.
@@ -28,36 +27,33 @@
 }
 
 #[inline]
-unsafe fn get_unchecked<K>(xs: &[K], index: usize) -> &K
-{
+unsafe fn get_unchecked<K>(xs: &[K], index: usize) -> &K {
     debug_assert!(index < xs.len());
     xs.get_unchecked(index)
 }
 
 #[inline]
-unsafe fn get_unchecked_mut<K>(xs: &mut [K], index: usize) -> &mut K
-{
+unsafe fn get_unchecked_mut<K>(xs: &mut [K], index: usize) -> &mut K {
     debug_assert!(index < xs.len());
     xs.get_unchecked_mut(index)
 }
 
 impl<K> UnionFind<K>
-    where K: IndexType
+where
+    K: IndexType,
 {
     /// Create a new `UnionFind` of `n` disjoint sets.
-    pub fn new(n: usize) -> Self
-    {
+    pub fn new(n: usize) -> Self {
         let rank = vec![0; n];
         let parent = (0..n).map(K::new).collect::<Vec<K>>();
 
-        UnionFind{parent, rank}
+        UnionFind { parent, rank }
     }
 
     /// Return the representative for `x`.
     ///
     /// **Panics** if `x` is out of bounds.
-    pub fn find(&self, x: K) -> K
-    {
+    pub fn find(&self, x: K) -> K {
         assert!(x.index() < self.parent.len());
         unsafe {
             let mut x = x;
@@ -65,7 +61,7 @@
                 // Use unchecked indexing because we can trust the internal set ids.
                 let xparent = *get_unchecked(&self.parent, x.index());
                 if xparent == x {
-                    break
+                    break;
                 }
                 x = xparent;
             }
@@ -79,16 +75,12 @@
     /// datastructure in the process and quicken future lookups.
     ///
     /// **Panics** if `x` is out of bounds.
-    pub fn find_mut(&mut self, x: K) -> K
-    {
+    pub fn find_mut(&mut self, x: K) -> K {
         assert!(x.index() < self.parent.len());
-        unsafe {
-            self.find_mut_recursive(x)
-        }
+        unsafe { self.find_mut_recursive(x) }
     }
 
-    unsafe fn find_mut_recursive(&mut self, mut x: K) -> K
-    {
+    unsafe fn find_mut_recursive(&mut self, mut x: K) -> K {
         let mut parent = *get_unchecked(&self.parent, x.index());
         while parent != x {
             let grandparent = *get_unchecked(&self.parent, parent.index());
@@ -105,14 +97,12 @@
         self.find(x) == self.find(y)
     }
 
-
     /// Unify the two sets containing `x` and `y`.
     ///
     /// Return `false` if the sets were already the same, `true` if they were unified.
     ///
     /// **Panics** if `x` or `y` is out of bounds.
-    pub fn union(&mut self, x: K, y: K) -> bool
-    {
+    pub fn union(&mut self, x: K, y: K) -> bool {
         if x == y {
             return false;
         }
@@ -142,8 +132,7 @@
     }
 
     /// Return a vector mapping each element to its representative.
-    pub fn into_labeling(mut self) -> Vec<K>
-    {
+    pub fn into_labeling(mut self) -> Vec<K> {
         // write in the labeling of each element
         unsafe {
             for ix in 0..self.parent.len() {
diff --git a/src/util.rs b/src/util.rs
index 7cc3445..f4d28d9 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -1,23 +1,25 @@
-
 use std::iter;
 
 pub fn enumerate<I>(iterable: I) -> iter::Enumerate<I::IntoIter>
-    where I: IntoIterator
+where
+    I: IntoIterator,
 {
     iterable.into_iter().enumerate()
 }
 
 #[cfg(feature = "serde-1")]
 pub fn rev<I>(iterable: I) -> iter::Rev<I::IntoIter>
-    where I: IntoIterator,
-          I::IntoIter: DoubleEndedIterator
+where
+    I: IntoIterator,
+    I::IntoIter: DoubleEndedIterator,
 {
     iterable.into_iter().rev()
 }
 
 pub fn zip<I, J>(i: I, j: J) -> iter::Zip<I::IntoIter, J::IntoIter>
-    where I: IntoIterator,
-          J: IntoIterator
+where
+    I: IntoIterator,
+    J: IntoIterator,
 {
     i.into_iter().zip(j)
 }
diff --git a/src/visit/dfsvisit.rs b/src/visit/dfsvisit.rs
index 5ac93c7..3acaf77 100644
--- a/src/visit/dfsvisit.rs
+++ b/src/visit/dfsvisit.rs
@@ -1,5 +1,3 @@
-
-
 use crate::visit::IntoNeighbors;
 use crate::visit::{VisitMap, Visitable};
 
@@ -29,13 +27,15 @@
 macro_rules! try_control {
     ($e:expr, $p:stmt) => {
         match $e {
-            x => if x.should_break() {
-                return x;
-            } else if x.should_prune() {
-                $p
+            x => {
+                if x.should_break() {
+                    return x;
+                } else if x.should_prune() {
+                    $p
+                }
             }
         }
-    }
+    };
 }
 
 /// Control flow for `depth_first_search` callbacks.
@@ -53,7 +53,9 @@
 }
 
 impl<B> Control<B> {
-    pub fn breaking() -> Control<()> { Control::Break(()) }
+    pub fn breaking() -> Control<()> {
+        Control::Break(())
+    }
     /// Get the value in `Control::Break(_)`, if present.
     pub fn break_value(self) -> Option<B> {
         match self {
@@ -73,17 +75,27 @@
 }
 
 impl ControlFlow for () {
-    fn continuing() { }
+    fn continuing() {}
     #[inline]
-    fn should_break(&self) -> bool { false }
+    fn should_break(&self) -> bool {
+        false
+    }
     #[inline]
-    fn should_prune(&self) -> bool { false }
+    fn should_prune(&self) -> bool {
+        false
+    }
 }
 
 impl<B> ControlFlow for Control<B> {
-    fn continuing() -> Self { Control::Continue }
+    fn continuing() -> Self {
+        Control::Continue
+    }
     fn should_break(&self) -> bool {
-        if let Control::Break(_) = *self { true } else { false }
+        if let Control::Break(_) = *self {
+            true
+        } else {
+            false
+        }
     }
     fn should_prune(&self) -> bool {
         match *self {
@@ -94,18 +106,30 @@
 }
 
 impl<C: ControlFlow, E> ControlFlow for Result<C, E> {
-    fn continuing() -> Self { Ok(C::continuing()) }
+    fn continuing() -> Self {
+        Ok(C::continuing())
+    }
     fn should_break(&self) -> bool {
-        if let Ok(ref c) = *self { c.should_break() } else { true }
+        if let Ok(ref c) = *self {
+            c.should_break()
+        } else {
+            true
+        }
     }
     fn should_prune(&self) -> bool {
-        if let Ok(ref c) = *self { c.should_prune() } else { false }
+        if let Ok(ref c) = *self {
+            c.should_prune()
+        } else {
+            false
+        }
     }
 }
 
 /// The default is `Continue`.
 impl<B> Default for Control<B> {
-    fn default() -> Self { Control::Continue }
+    fn default() -> Self {
+        Control::Continue
+    }
 }
 
 /// A recursive depth first search.
@@ -171,40 +195,54 @@
 /// assert_eq!(&path, &[n(0), n(2), n(4), n(5)]);
 /// ```
 pub fn depth_first_search<G, I, F, C>(graph: G, starts: I, mut visitor: F) -> C
-    where G: IntoNeighbors + Visitable,
-          I: IntoIterator<Item=G::NodeId>,
-          F: FnMut(DfsEvent<G::NodeId>) -> C,
-          C: ControlFlow,
+where
+    G: IntoNeighbors + Visitable,
+    I: IntoIterator<Item = G::NodeId>,
+    F: FnMut(DfsEvent<G::NodeId>) -> C,
+    C: ControlFlow,
 {
     let time = &mut Time(0);
     let discovered = &mut graph.visit_map();
     let finished = &mut graph.visit_map();
 
     for start in starts {
-        try_control!(dfs_visitor(graph, start, &mut visitor, discovered, finished, time),
-                     unreachable!());
+        try_control!(
+            dfs_visitor(graph, start, &mut visitor, discovered, finished, time),
+            unreachable!()
+        );
     }
     C::continuing()
 }
 
-fn dfs_visitor<G, F, C>(graph: G, u: G::NodeId, visitor: &mut F,
-                     discovered: &mut G::Map, finished: &mut G::Map,
-                     time: &mut Time) -> C
-    where G: IntoNeighbors + Visitable,
-          F: FnMut(DfsEvent<G::NodeId>) -> C,
-          C: ControlFlow,
+fn dfs_visitor<G, F, C>(
+    graph: G,
+    u: G::NodeId,
+    visitor: &mut F,
+    discovered: &mut G::Map,
+    finished: &mut G::Map,
+    time: &mut Time,
+) -> C
+where
+    G: IntoNeighbors + Visitable,
+    F: FnMut(DfsEvent<G::NodeId>) -> C,
+    C: ControlFlow,
 {
     if !discovered.visit(u) {
         return C::continuing();
     }
 
     'prune: loop {
-        try_control!(visitor(DfsEvent::Discover(u, time_post_inc(time))), break 'prune);
+        try_control!(
+            visitor(DfsEvent::Discover(u, time_post_inc(time))),
+            break 'prune
+        );
         for v in graph.neighbors(u) {
             if !discovered.is_visited(&v) {
                 try_control!(visitor(DfsEvent::TreeEdge(u, v)), continue);
-                try_control!(dfs_visitor(graph, v, visitor, discovered, finished, time),
-                             unreachable!());
+                try_control!(
+                    dfs_visitor(graph, v, visitor, discovered, finished, time),
+                    unreachable!()
+                );
             } else if !finished.is_visited(&v) {
                 try_control!(visitor(DfsEvent::BackEdge(u, v)), continue);
             } else {
@@ -216,8 +254,10 @@
     }
     let first_finish = finished.visit(u);
     debug_assert!(first_finish);
-    try_control!(visitor(DfsEvent::Finish(u, time_post_inc(time))),
-                 panic!("Pruning on the `DfsEvent::Finish` is not supported!"));
+    try_control!(
+        visitor(DfsEvent::Finish(u, time_post_inc(time))),
+        panic!("Pruning on the `DfsEvent::Finish` is not supported!")
+    );
     C::continuing()
 }
 
diff --git a/src/visit/filter.rs b/src/visit/filter.rs
index 7f7c568..866194d 100644
--- a/src/visit/filter.rs
+++ b/src/visit/filter.rs
@@ -1,37 +1,26 @@
-
 use crate::prelude::*;
 
 use fixedbitset::FixedBitSet;
 use std::collections::HashSet;
 use std::marker::PhantomData;
 
-use crate::visit::{
-    GraphBase,
-    GraphProp,
-    IntoEdgeReferences,
-    IntoEdges,
-    IntoEdgesDirected,
-    IntoNeighbors,
-    IntoNeighborsDirected,
-    IntoNodeIdentifiers,
-    IntoNodeReferences,
-    NodeIndexable,
-    NodeRef,
-    VisitMap,
-    Visitable,
-};
+use crate::data::DataMap;
 use crate::visit::{Data, NodeCompactIndexable, NodeCount};
-use crate::data::{DataMap};
+use crate::visit::{
+    GraphBase, GraphProp, IntoEdgeReferences, IntoEdges, IntoEdgesDirected, IntoNeighbors,
+    IntoNeighborsDirected, IntoNodeIdentifiers, IntoNodeReferences, NodeIndexable, NodeRef,
+    VisitMap, Visitable,
+};
 
 /// A graph filter for nodes.
-pub trait FilterNode<N>
-{
+pub trait FilterNode<N> {
     /// Return true to have the node be part of the graph
     fn include_node(&self, node: N) -> bool;
 }
 
 impl<F, N> FilterNode<N> for F
-    where F: Fn(N) -> bool,
+where
+    F: Fn(N) -> bool,
 {
     fn include_node(&self, n: N) -> bool {
         (*self)(n)
@@ -40,7 +29,8 @@
 
 /// This filter includes the nodes that are contained in the set.
 impl<N> FilterNode<N> for FixedBitSet
-    where FixedBitSet: VisitMap<N>,
+where
+    FixedBitSet: VisitMap<N>,
 {
     fn include_node(&self, n: N) -> bool {
         self.is_visited(&n)
@@ -49,7 +39,8 @@
 
 /// This filter includes the nodes that are contained in the set.
 impl<N, S> FilterNode<N> for HashSet<N, S>
-    where HashSet<N, S>: VisitMap<N>,
+where
+    HashSet<N, S>: VisitMap<N>,
 {
     fn include_node(&self, n: N) -> bool {
         self.is_visited(&n)
@@ -61,8 +52,9 @@
 pub struct NodeFiltered<G, F>(pub G, pub F);
 
 impl<F, G> NodeFiltered<G, F>
-    where G: GraphBase,
-          F: Fn(G::NodeId) -> bool,
+where
+    G: GraphBase,
+    F: Fn(G::NodeId) -> bool,
 {
     /// Create an `NodeFiltered` adaptor from the closure `filter`.
     pub fn from_fn(graph: G, filter: F) -> Self {
@@ -70,14 +62,18 @@
     }
 }
 
-impl<G, F> GraphBase for NodeFiltered<G, F> where G: GraphBase {
+impl<G, F> GraphBase for NodeFiltered<G, F>
+where
+    G: GraphBase,
+{
     type NodeId = G::NodeId;
     type EdgeId = G::EdgeId;
 }
 
 impl<'a, G, F> IntoNeighbors for &'a NodeFiltered<G, F>
-    where G: IntoNeighbors,
-          F: FilterNode<G::NodeId>,
+where
+    G: IntoNeighbors,
+    F: FilterNode<G::NodeId>,
 {
     type Neighbors = NodeFilteredNeighbors<'a, G::Neighbors, F>;
     fn neighbors(self, n: G::NodeId) -> Self::Neighbors {
@@ -90,17 +86,17 @@
 }
 
 /// A filtered neighbors iterator.
-pub struct NodeFilteredNeighbors<'a, I, F: 'a>
-{
+pub struct NodeFilteredNeighbors<'a, I, F: 'a> {
     include_source: bool,
     iter: I,
     f: &'a F,
 }
 
 impl<'a, I, F> Iterator for NodeFilteredNeighbors<'a, I, F>
-    where I: Iterator,
-          I::Item: Copy,
-          F: FilterNode<I::Item>,
+where
+    I: Iterator,
+    I::Item: Copy,
+    F: FilterNode<I::Item>,
 {
     type Item = I::Item;
     fn next(&mut self) -> Option<Self::Item> {
@@ -114,12 +110,12 @@
 }
 
 impl<'a, G, F> IntoNeighborsDirected for &'a NodeFiltered<G, F>
-    where G: IntoNeighborsDirected,
-          F: FilterNode<G::NodeId>,
+where
+    G: IntoNeighborsDirected,
+    F: FilterNode<G::NodeId>,
 {
     type NeighborsDirected = NodeFilteredNeighbors<'a, G::NeighborsDirected, F>;
-    fn neighbors_directed(self, n: G::NodeId, dir: Direction)
-        -> Self::NeighborsDirected {
+    fn neighbors_directed(self, n: G::NodeId, dir: Direction) -> Self::NeighborsDirected {
         NodeFilteredNeighbors {
             include_source: self.1.include_node(n),
             iter: self.0.neighbors_directed(n, dir),
@@ -129,8 +125,9 @@
 }
 
 impl<'a, G, F> IntoNodeIdentifiers for &'a NodeFiltered<G, F>
-    where G: IntoNodeIdentifiers,
-          F: FilterNode<G::NodeId>,
+where
+    G: IntoNodeIdentifiers,
+    F: FilterNode<G::NodeId>,
 {
     type NodeIdentifiers = NodeFilteredNeighbors<'a, G::NodeIdentifiers, F>;
     fn node_identifiers(self) -> Self::NodeIdentifiers {
@@ -143,8 +140,9 @@
 }
 
 impl<'a, G, F> IntoNodeReferences for &'a NodeFiltered<G, F>
-    where G: IntoNodeReferences,
-          F: FilterNode<G::NodeId>,
+where
+    G: IntoNodeReferences,
+    F: FilterNode<G::NodeId>,
 {
     type NodeRef = G::NodeRef;
     type NodeReferences = NodeFilteredNodes<'a, G::NodeReferences, F>;
@@ -158,17 +156,17 @@
 }
 
 /// A filtered node references iterator.
-pub struct NodeFilteredNodes<'a, I, F: 'a>
-{
+pub struct NodeFilteredNodes<'a, I, F: 'a> {
     include_source: bool,
     iter: I,
     f: &'a F,
 }
 
 impl<'a, I, F> Iterator for NodeFilteredNodes<'a, I, F>
-    where I: Iterator,
-          I::Item: Copy + NodeRef,
-          F: FilterNode<<I::Item as NodeRef>::NodeId>,
+where
+    I: Iterator,
+    I::Item: Copy + NodeRef,
+    F: FilterNode<<I::Item as NodeRef>::NodeId>,
 {
     type Item = I::Item;
     fn next(&mut self) -> Option<Self::Item> {
@@ -182,8 +180,9 @@
 }
 
 impl<'a, G, F> IntoEdgeReferences for &'a NodeFiltered<G, F>
-    where G: IntoEdgeReferences,
-          F: FilterNode<G::NodeId>,
+where
+    G: IntoEdgeReferences,
+    F: FilterNode<G::NodeId>,
 {
     type EdgeRef = G::EdgeRef;
     type EdgeReferences = NodeFilteredEdgeReferences<'a, G, G::EdgeReferences, F>;
@@ -197,29 +196,30 @@
 }
 
 /// A filtered edges iterator.
-pub struct NodeFilteredEdgeReferences<'a, G, I, F: 'a>
-{
+pub struct NodeFilteredEdgeReferences<'a, G, I, F: 'a> {
     graph: PhantomData<G>,
     iter: I,
     f: &'a F,
 }
 
 impl<'a, G, I, F> Iterator for NodeFilteredEdgeReferences<'a, G, I, F>
-    where F: FilterNode<G::NodeId>,
-          G: IntoEdgeReferences,
-          I: Iterator<Item=G::EdgeRef>,
+where
+    F: FilterNode<G::NodeId>,
+    G: IntoEdgeReferences,
+    I: Iterator<Item = G::EdgeRef>,
 {
     type Item = I::Item;
     fn next(&mut self) -> Option<Self::Item> {
         let f = self.f;
-        self.iter.find(move |&edge| f.include_node(edge.source()) &&
-                                    f.include_node(edge.target()))
+        self.iter
+            .find(move |&edge| f.include_node(edge.source()) && f.include_node(edge.target()))
     }
 }
 
 impl<'a, G, F> IntoEdges for &'a NodeFiltered<G, F>
-    where G: IntoEdges,
-          F: FilterNode<G::NodeId>,
+where
+    G: IntoEdges,
+    F: FilterNode<G::NodeId>,
 {
     type Edges = NodeFilteredEdges<'a, G, G::Edges, F>;
     fn edges(self, a: G::NodeId) -> Self::Edges {
@@ -232,21 +232,19 @@
     }
 }
 
-
 /// A filtered edges iterator.
-pub struct NodeFilteredEdges<'a, G, I, F: 'a>
-{
+pub struct NodeFilteredEdges<'a, G, I, F: 'a> {
     graph: PhantomData<G>,
     include_source: bool,
     iter: I,
     f: &'a F,
 }
 
-
 impl<'a, G, I, F> Iterator for NodeFilteredEdges<'a, G, I, F>
-    where F: FilterNode<G::NodeId>,
-          G: IntoEdges,
-          I: Iterator<Item=G::EdgeRef>,
+where
+    F: FilterNode<G::NodeId>,
+    G: IntoEdges,
+    I: Iterator<Item = G::EdgeRef>,
 {
     type Item = I::Item;
     fn next(&mut self) -> Option<Self::Item> {
@@ -260,8 +258,9 @@
 }
 
 impl<G, F> DataMap for NodeFiltered<G, F>
-    where G: DataMap,
-          F: FilterNode<G::NodeId>,
+where
+    G: DataMap,
+    F: FilterNode<G::NodeId>,
 {
     fn node_weight(&self, id: Self::NodeId) -> Option<&Self::NodeWeight> {
         if self.1.include_node(id) {
@@ -277,13 +276,15 @@
 }
 
 macro_rules! access0 {
-    ($e:expr) => ($e.0)
+    ($e:expr) => {
+        $e.0
+    };
 }
 
-Data!{delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]}
-NodeIndexable!{delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]}
-GraphProp!{delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]}
-Visitable!{delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]}
+Data! {delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]}
+NodeIndexable! {delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]}
+GraphProp! {delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]}
+Visitable! {delegate_impl [[G, F], G, NodeFiltered<G, F>, access0]}
 
 /// A graph filter for edges
 pub trait FilterEdge<Edge> {
@@ -292,7 +293,8 @@
 }
 
 impl<F, N> FilterEdge<N> for F
-    where F: Fn(N) -> bool,
+where
+    F: Fn(N) -> bool,
 {
     fn include_edge(&self, n: N) -> bool {
         (*self)(n)
@@ -311,8 +313,9 @@
 pub struct EdgeFiltered<G, F>(pub G, pub F);
 
 impl<F, G> EdgeFiltered<G, F>
-    where G: IntoEdgeReferences,
-          F: Fn(G::EdgeRef) -> bool,
+where
+    G: IntoEdgeReferences,
+    F: Fn(G::EdgeRef) -> bool,
 {
     /// Create an `EdgeFiltered` adaptor from the closure `filter`.
     pub fn from_fn(graph: G, filter: F) -> Self {
@@ -320,14 +323,18 @@
     }
 }
 
-impl<G, F> GraphBase for EdgeFiltered<G, F> where G: GraphBase {
+impl<G, F> GraphBase for EdgeFiltered<G, F>
+where
+    G: GraphBase,
+{
     type NodeId = G::NodeId;
     type EdgeId = G::EdgeId;
 }
 
 impl<'a, G, F> IntoNeighbors for &'a EdgeFiltered<G, F>
-    where G: IntoEdges,
-          F: FilterEdge<G::EdgeRef>,
+where
+    G: IntoEdges,
+    F: FilterEdge<G::EdgeRef>,
 {
     type Neighbors = EdgeFilteredNeighbors<'a, G, F>;
     fn neighbors(self, n: G::NodeId) -> Self::Neighbors {
@@ -355,30 +362,37 @@
 
 /// A filtered neighbors iterator.
 pub struct EdgeFilteredNeighbors<'a, G, F: 'a>
-    where G: IntoEdges,
+where
+    G: IntoEdges,
 {
     iter: G::Edges,
     f: &'a F,
 }
 
 impl<'a, G, F> Iterator for EdgeFilteredNeighbors<'a, G, F>
-    where F: FilterEdge<G::EdgeRef>,
-          G: IntoEdges,
+where
+    F: FilterEdge<G::EdgeRef>,
+    G: IntoEdges,
 {
     type Item = G::NodeId;
     fn next(&mut self) -> Option<Self::Item> {
         let f = self.f;
-        (&mut self.iter).filter_map(move |edge| {
-            if f.include_edge(edge) {
-                Some(edge.target())
-            } else { None }
-        }).next()
+        (&mut self.iter)
+            .filter_map(move |edge| {
+                if f.include_edge(edge) {
+                    Some(edge.target())
+                } else {
+                    None
+                }
+            })
+            .next()
     }
 }
 
 impl<'a, G, F> IntoEdgeReferences for &'a EdgeFiltered<G, F>
-    where G: IntoEdgeReferences,
-          F: FilterEdge<G::EdgeRef>,
+where
+    G: IntoEdgeReferences,
+    F: FilterEdge<G::EdgeRef>,
 {
     type EdgeRef = G::EdgeRef;
     type EdgeReferences = EdgeFilteredEdges<'a, G, G::EdgeReferences, F>;
@@ -392,8 +406,9 @@
 }
 
 impl<'a, G, F> IntoEdges for &'a EdgeFiltered<G, F>
-    where G: IntoEdges,
-          F: FilterEdge<G::EdgeRef>,
+where
+    G: IntoEdges,
+    F: FilterEdge<G::EdgeRef>,
 {
     type Edges = EdgeFilteredEdges<'a, G, G::Edges, F>;
     fn edges(self, n: G::NodeId) -> Self::Edges {
@@ -406,17 +421,17 @@
 }
 
 /// A filtered edges iterator.
-pub struct EdgeFilteredEdges<'a, G, I, F: 'a>
-{
+pub struct EdgeFilteredEdges<'a, G, I, F: 'a> {
     graph: PhantomData<G>,
     iter: I,
     f: &'a F,
 }
 
 impl<'a, G, I, F> Iterator for EdgeFilteredEdges<'a, G, I, F>
-    where F: FilterEdge<G::EdgeRef>,
-          G: IntoEdgeReferences,
-          I: Iterator<Item=G::EdgeRef>,
+where
+    F: FilterEdge<G::EdgeRef>,
+    G: IntoEdgeReferences,
+    I: Iterator<Item = G::EdgeRef>,
 {
     type Item = I::Item;
     fn next(&mut self) -> Option<Self::Item> {
@@ -460,11 +475,11 @@
     }
 }
 
-Data!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
-GraphProp!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
-IntoNodeIdentifiers!{delegate_impl [['a, G, F], G, &'a EdgeFiltered<G, F>, access0]}
-IntoNodeReferences!{delegate_impl [['a, G, F], G, &'a EdgeFiltered<G, F>, access0]}
-NodeCompactIndexable!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
-NodeCount!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
-NodeIndexable!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
-Visitable!{delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
+Data! {delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
+GraphProp! {delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
+IntoNodeIdentifiers! {delegate_impl [['a, G, F], G, &'a EdgeFiltered<G, F>, access0]}
+IntoNodeReferences! {delegate_impl [['a, G, F], G, &'a EdgeFiltered<G, F>, access0]}
+NodeCompactIndexable! {delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
+NodeCount! {delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
+NodeIndexable! {delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
+Visitable! {delegate_impl [[G, F], G, EdgeFiltered<G, F>, access0]}
diff --git a/src/visit/macros.rs b/src/visit/macros.rs
index da24542..c558b6e 100644
--- a/src/visit/macros.rs
+++ b/src/visit/macros.rs
@@ -1,4 +1,3 @@
-
 /// Define a trait as usual, and a macro that can be used to instantiate
 /// implementations of it.
 ///
@@ -17,7 +16,7 @@
             }
         }
 
-        remove_sections! { [] 
+        remove_sections! { []
             $(#[$doc])*
             pub trait $name $($methods)*
 
@@ -67,10 +66,14 @@
 }
 
 macro_rules! deref {
-    ($e:expr) => (*$e);
+    ($e:expr) => {
+        *$e
+    };
 }
 macro_rules! deref_twice {
-    ($e:expr) => (**$e);
+    ($e:expr) => {
+        **$e
+    };
 }
 
 /// Implement a trait by delegation. By default as if we are delegating
@@ -130,4 +133,3 @@
         }
     }
 }
-
diff --git a/src/visit/mod.rs b/src/visit/mod.rs
index 739ab58..aa93c35 100644
--- a/src/visit/mod.rs
+++ b/src/visit/mod.rs
@@ -42,7 +42,8 @@
 pub use self::filter::*;
 pub use self::reversed::*;
 
-#[macro_use] mod macros;
+#[macro_use]
+mod macros;
 
 mod dfsvisit;
 mod traversal;
@@ -50,36 +51,26 @@
 pub use self::traversal::*;
 
 use fixedbitset::FixedBitSet;
-use std::collections::{
-    HashSet,
-};
-use std::hash::{Hash, BuildHasher};
+use std::collections::HashSet;
+use std::hash::{BuildHasher, Hash};
 
-use crate::prelude::{Graph, Direction};
+use super::{graph, EdgeType};
+use crate::graph::NodeIndex;
 #[cfg(feature = "graphmap")]
 use crate::prelude::GraphMap;
 #[cfg(feature = "stable_graph")]
 use crate::prelude::StableGraph;
-use crate::graph::{NodeIndex};
-use super::{
-    graph,
-    EdgeType,
-};
+use crate::prelude::{Direction, Graph};
 
-use crate::graph::{
-    IndexType,
-};
+use crate::graph::Frozen;
+use crate::graph::IndexType;
 #[cfg(feature = "stable_graph")]
 use crate::stable_graph;
-use crate::graph::Frozen;
 
 #[cfg(feature = "graphmap")]
-use crate::graphmap::{
-    self,
-    NodeTrait,
-};
+use crate::graphmap::{self, NodeTrait};
 
-trait_template!{
+trait_template! {
 /// Base graph trait: defines the associated node identifier and
 /// edge identifier types.
 pub trait GraphBase {
@@ -94,23 +85,27 @@
 }
 }
 
-GraphBase!{delegate_impl []}
-GraphBase!{delegate_impl [['a, G], G, &'a mut G, deref]}
+GraphBase! {delegate_impl []}
+GraphBase! {delegate_impl [['a, G], G, &'a mut G, deref]}
 
 /// A copyable reference to a graph.
-pub trait GraphRef : Copy + GraphBase { }
+pub trait GraphRef: Copy + GraphBase {}
 
-impl<'a, G> GraphRef for &'a G where G: GraphBase { }
+impl<'a, G> GraphRef for &'a G where G: GraphBase {}
 
-impl<'a, G> GraphBase for Frozen<'a, G> where G: GraphBase {
+impl<'a, G> GraphBase for Frozen<'a, G>
+where
+    G: GraphBase,
+{
     type NodeId = G::NodeId;
     type EdgeId = G::EdgeId;
 }
 
 #[cfg(feature = "stable_graph")]
 impl<'a, N, E: 'a, Ty, Ix> IntoNeighbors for &'a StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Neighbors = stable_graph::Neighbors<'a, E, Ix>;
     fn neighbors(self, n: Self::NodeId) -> Self::Neighbors {
@@ -118,11 +113,11 @@
     }
 }
 
-
 #[cfg(feature = "graphmap")]
 impl<'a, N: 'a, E, Ty> IntoNeighbors for &'a GraphMap<N, E, Ty>
-    where N: Copy + Ord + Hash,
-          Ty: EdgeType,
+where
+    N: Copy + Ord + Hash,
+    Ty: EdgeType,
 {
     type Neighbors = graphmap::Neighbors<'a, N, Ty>;
     fn neighbors(self, n: Self::NodeId) -> Self::Neighbors {
@@ -130,7 +125,6 @@
     }
 }
 
-
 trait_template! {
 /// Access to the neighbors of each node
 ///
@@ -147,7 +141,7 @@
 }
 }
 
-IntoNeighbors!{delegate_impl []}
+IntoNeighbors! {delegate_impl []}
 
 trait_template! {
 /// Access to the neighbors of each node, through incoming or outgoing edges.
@@ -168,51 +162,51 @@
 }
 
 impl<'a, N, E: 'a, Ty, Ix> IntoNeighbors for &'a Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Neighbors = graph::Neighbors<'a, E, Ix>;
-    fn neighbors(self, n: graph::NodeIndex<Ix>)
-        -> graph::Neighbors<'a, E, Ix>
-    {
+    fn neighbors(self, n: graph::NodeIndex<Ix>) -> graph::Neighbors<'a, E, Ix> {
         Graph::neighbors(self, n)
     }
 }
 
 impl<'a, N, E: 'a, Ty, Ix> IntoNeighborsDirected for &'a Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type NeighborsDirected = graph::Neighbors<'a, E, Ix>;
-    fn neighbors_directed(self, n: graph::NodeIndex<Ix>, d: Direction)
-        -> graph::Neighbors<'a, E, Ix>
-    {
+    fn neighbors_directed(
+        self,
+        n: graph::NodeIndex<Ix>,
+        d: Direction,
+    ) -> graph::Neighbors<'a, E, Ix> {
         Graph::neighbors_directed(self, n, d)
     }
 }
 
 #[cfg(feature = "stable_graph")]
 impl<'a, N, E: 'a, Ty, Ix> IntoNeighborsDirected for &'a StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type NeighborsDirected = stable_graph::Neighbors<'a, E, Ix>;
-    fn neighbors_directed(self, n: graph::NodeIndex<Ix>, d: Direction)
-        -> Self::NeighborsDirected
-    {
+    fn neighbors_directed(self, n: graph::NodeIndex<Ix>, d: Direction) -> Self::NeighborsDirected {
         StableGraph::neighbors_directed(self, n, d)
     }
 }
 
 #[cfg(feature = "graphmap")]
 impl<'a, N: 'a, E, Ty> IntoNeighborsDirected for &'a GraphMap<N, E, Ty>
-    where N: Copy + Ord + Hash,
-          Ty: EdgeType,
+where
+    N: Copy + Ord + Hash,
+    Ty: EdgeType,
 {
     type NeighborsDirected = graphmap::NeighborsDirected<'a, N, Ty>;
-    fn neighbors_directed(self, n: N, dir: Direction)
-        -> Self::NeighborsDirected
-    {
+    fn neighbors_directed(self, n: N, dir: Direction) -> Self::NeighborsDirected {
         self.neighbors_directed(n, dir)
     }
 }
@@ -238,7 +232,7 @@
 }
 }
 
-IntoEdges!{delegate_impl []}
+IntoEdges! {delegate_impl []}
 
 trait_template! {
 /// Access to all edges of each node, in the specified direction.
@@ -264,7 +258,7 @@
 }
 }
 
-IntoEdgesDirected!{delegate_impl []}
+IntoEdgesDirected! {delegate_impl []}
 
 trait_template! {
 /// Access to the sequence of the graph’s `NodeId`s.
@@ -276,11 +270,12 @@
 }
 }
 
-IntoNodeIdentifiers!{delegate_impl []}
+IntoNodeIdentifiers! {delegate_impl []}
 
 impl<'a, N, E: 'a, Ty, Ix> IntoNodeIdentifiers for &'a Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type NodeIdentifiers = graph::NodeIndices<Ix>;
     fn node_identifiers(self) -> graph::NodeIndices<Ix> {
@@ -289,8 +284,9 @@
 }
 
 impl<N, E, Ty, Ix> NodeCount for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn node_count(&self) -> usize {
         self.node_count()
@@ -299,8 +295,9 @@
 
 #[cfg(feature = "stable_graph")]
 impl<'a, N, E: 'a, Ty, Ix> IntoNodeIdentifiers for &'a StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type NodeIdentifiers = stable_graph::NodeIndices<'a, N, Ix>;
     fn node_identifiers(self) -> Self::NodeIdentifiers {
@@ -310,15 +307,16 @@
 
 #[cfg(feature = "stable_graph")]
 impl<N, E, Ty, Ix> NodeCount for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     fn node_count(&self) -> usize {
         self.node_count()
     }
 }
 
-IntoNeighborsDirected!{delegate_impl []}
+IntoNeighborsDirected! {delegate_impl []}
 
 trait_template! {
 /// Define associated data for nodes and edges
@@ -329,13 +327,13 @@
 }
 }
 
-Data!{delegate_impl []}
-Data!{delegate_impl [['a, G], G, &'a mut G, deref]}
+Data! {delegate_impl []}
+Data! {delegate_impl [['a, G], G, &'a mut G, deref]}
 
 /// An edge reference.
 ///
 /// Edge references are used by traits `IntoEdges` and `IntoEdgeReferences`.
-pub trait EdgeRef : Copy {
+pub trait EdgeRef: Copy {
     type NodeId;
     type EdgeId;
     type Weight;
@@ -350,20 +348,29 @@
 }
 
 impl<'a, N, E> EdgeRef for (N, N, &'a E)
-    where N: Copy
+where
+    N: Copy,
 {
     type NodeId = N;
     type EdgeId = (N, N);
     type Weight = E;
 
-    fn source(&self) -> N { self.0 }
-    fn target(&self) -> N { self.1 }
-    fn weight(&self) -> &E { self.2 }
-    fn id(&self) -> (N, N) { (self.0, self.1) }
+    fn source(&self) -> N {
+        self.0
+    }
+    fn target(&self) -> N {
+        self.1
+    }
+    fn weight(&self) -> &E {
+        self.2
+    }
+    fn id(&self) -> (N, N) {
+        (self.0, self.1)
+    }
 }
 
 /// A node reference.
-pub trait NodeRef : Copy {
+pub trait NodeRef: Copy {
     type NodeId;
     type Weight;
     fn id(&self) -> Self::NodeId;
@@ -381,14 +388,17 @@
 }
 }
 
-IntoNodeReferences!{delegate_impl []}
+IntoNodeReferences! {delegate_impl []}
 
 impl<Id> NodeRef for (Id, ())
-    where Id: Copy,
+where
+    Id: Copy,
 {
     type NodeId = Id;
     type Weight = ();
-    fn id(&self) -> Self::NodeId { self.0 }
+    fn id(&self) -> Self::NodeId {
+        self.0
+    }
     fn weight(&self) -> &Self::Weight {
         static DUMMY: () = ();
         &DUMMY
@@ -396,15 +406,19 @@
 }
 
 impl<'a, Id, W> NodeRef for (Id, &'a W)
-    where Id: Copy,
+where
+    Id: Copy,
 {
     type NodeId = Id;
     type Weight = W;
-    fn id(&self) -> Self::NodeId { self.0 }
-    fn weight(&self) -> &Self::Weight { self.1 }
+    fn id(&self) -> Self::NodeId {
+        self.0
+    }
+    fn weight(&self) -> &Self::Weight {
+        self.1
+    }
 }
 
-
 trait_template! {
 /// Access to the sequence of the graph’s edges
 pub trait IntoEdgeReferences : Data + GraphRef {
@@ -417,12 +431,13 @@
 }
 }
 
-IntoEdgeReferences!{delegate_impl [] }
+IntoEdgeReferences! {delegate_impl [] }
 
 #[cfg(feature = "graphmap")]
 impl<N, E, Ty> Data for GraphMap<N, E, Ty>
-    where N: Copy + PartialEq,
-          Ty: EdgeType,
+where
+    N: Copy + PartialEq,
+    Ty: EdgeType,
 {
     type NodeWeight = N;
     type EdgeWeight = E;
@@ -442,35 +457,38 @@
 }
 }
 
-GraphProp!{delegate_impl []}
+GraphProp! {delegate_impl []}
 
 impl<N, E, Ty, Ix> GraphProp for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type EdgeType = Ty;
 }
 
 #[cfg(feature = "stable_graph")]
 impl<N, E, Ty, Ix> GraphProp for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type EdgeType = Ty;
 }
 
 #[cfg(feature = "graphmap")]
 impl<N, E, Ty> GraphProp for GraphMap<N, E, Ty>
-    where N: NodeTrait,
-          Ty: EdgeType,
+where
+    N: NodeTrait,
+    Ty: EdgeType,
 {
     type EdgeType = Ty;
 }
 
-
 impl<'a, N: 'a, E: 'a, Ty, Ix> IntoEdgeReferences for &'a Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type EdgeRef = graph::EdgeReference<'a, E, Ix>;
     type EdgeReferences = graph::EdgeReferences<'a, E, Ix>;
@@ -479,8 +497,7 @@
     }
 }
 
-
-trait_template!{
+trait_template! {
     /// The graph’s `NodeId`s map to indices
     pub trait NodeIndexable : GraphBase {
         @section self
@@ -494,7 +511,7 @@
     }
 }
 
-NodeIndexable!{delegate_impl []}
+NodeIndexable! {delegate_impl []}
 
 trait_template! {
 /// A graph with a known node count.
@@ -504,7 +521,7 @@
 }
 }
 
-NodeCount!{delegate_impl []}
+NodeCount! {delegate_impl []}
 
 trait_template! {
 /// The graph’s `NodeId`s map to indices, in a range without holes.
@@ -514,21 +531,30 @@
 pub trait NodeCompactIndexable : NodeIndexable + NodeCount { }
 }
 
-NodeCompactIndexable!{delegate_impl []}
+NodeCompactIndexable! {delegate_impl []}
 
 impl<N, E, Ty, Ix> NodeIndexable for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
-    fn node_bound(&self) -> usize { self.node_count() }
-    fn to_index(&self, ix: NodeIndex<Ix>) -> usize { ix.index() }
-    fn from_index(&self, ix: usize) -> Self::NodeId { NodeIndex::new(ix) }
+    fn node_bound(&self) -> usize {
+        self.node_count()
+    }
+    fn to_index(&self, ix: NodeIndex<Ix>) -> usize {
+        ix.index()
+    }
+    fn from_index(&self, ix: usize) -> Self::NodeId {
+        NodeIndex::new(ix)
+    }
 }
 
 impl<N, E, Ty, Ix> NodeCompactIndexable for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
-{ }
+where
+    Ty: EdgeType,
+    Ix: IndexType,
+{
+}
 
 /// A mapping for storing the visited status for NodeId `N`.
 pub trait VisitMap<N> {
@@ -542,7 +568,8 @@
 }
 
 impl<Ix> VisitMap<graph::NodeIndex<Ix>> for FixedBitSet
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     fn visit(&mut self, x: graph::NodeIndex<Ix>) -> bool {
         !self.put(x.index())
@@ -553,7 +580,8 @@
 }
 
 impl<Ix> VisitMap<graph::EdgeIndex<Ix>> for FixedBitSet
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     fn visit(&mut self, x: graph::EdgeIndex<Ix>) -> bool {
         !self.put(x.index())
@@ -564,7 +592,8 @@
 }
 
 impl<Ix> VisitMap<Ix> for FixedBitSet
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     fn visit(&mut self, x: Ix) -> bool {
         !self.put(x.index())
@@ -575,8 +604,9 @@
 }
 
 impl<N, S> VisitMap<N> for HashSet<N, S>
-    where N: Hash + Eq,
-          S: BuildHasher,
+where
+    N: Hash + Eq,
+    S: BuildHasher,
 {
     fn visit(&mut self, x: N) -> bool {
         self.insert(x)
@@ -586,7 +616,7 @@
     }
 }
 
-trait_template!{
+trait_template! {
 /// A graph that can create a map that tracks the visited status of its nodes.
 pub trait Visitable : GraphBase {
     @section type
@@ -599,21 +629,25 @@
     fn reset_map(self: &Self, map: &mut Self::Map) -> ();
 }
 }
-Visitable!{delegate_impl []}
+Visitable! {delegate_impl []}
 
 impl<N, E, Ty, Ix> GraphBase for Graph<N, E, Ty, Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     type NodeId = graph::NodeIndex<Ix>;
     type EdgeId = graph::EdgeIndex<Ix>;
 }
 
 impl<N, E, Ty, Ix> Visitable for Graph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Map = FixedBitSet;
-    fn visit_map(&self) -> FixedBitSet { FixedBitSet::with_capacity(self.node_count()) }
+    fn visit_map(&self) -> FixedBitSet {
+        FixedBitSet::with_capacity(self.node_count())
+    }
 
     fn reset_map(&self, map: &mut Self::Map) {
         map.clear();
@@ -623,7 +657,8 @@
 
 #[cfg(feature = "stable_graph")]
 impl<N, E, Ty, Ix> GraphBase for StableGraph<N, E, Ty, Ix>
-    where Ix: IndexType,
+where
+    Ix: IndexType,
 {
     type NodeId = graph::NodeIndex<Ix>;
     type EdgeId = graph::EdgeIndex<Ix>;
@@ -631,8 +666,9 @@
 
 #[cfg(feature = "stable_graph")]
 impl<N, E, Ty, Ix> Visitable for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type Map = FixedBitSet;
     fn visit_map(&self) -> FixedBitSet {
@@ -646,17 +682,18 @@
 
 #[cfg(feature = "stable_graph")]
 impl<N, E, Ty, Ix> Data for StableGraph<N, E, Ty, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     type NodeWeight = N;
     type EdgeWeight = E;
 }
 
-
 #[cfg(feature = "graphmap")]
 impl<N, E, Ty> GraphBase for GraphMap<N, E, Ty>
-    where N: Copy + PartialEq,
+where
+    N: Copy + PartialEq,
 {
     type NodeId = N;
     type EdgeId = (N, N);
@@ -664,11 +701,14 @@
 
 #[cfg(feature = "graphmap")]
 impl<N, E, Ty> Visitable for GraphMap<N, E, Ty>
-    where N: Copy + Ord + Hash,
-          Ty: EdgeType,
+where
+    N: Copy + Ord + Hash,
+    Ty: EdgeType,
 {
     type Map = HashSet<N>;
-    fn visit_map(&self) -> HashSet<N> { HashSet::with_capacity(self.node_count()) }
+    fn visit_map(&self) -> HashSet<N> {
+        HashSet::with_capacity(self.node_count())
+    }
     fn reset_map(&self, map: &mut Self::Map) {
         map.clear();
     }
@@ -693,18 +733,18 @@
 }
 }
 
-
-GetAdjacencyMatrix!{delegate_impl []}
+GetAdjacencyMatrix! {delegate_impl []}
 
 #[cfg(feature = "graphmap")]
 /// The `GraphMap` keeps an adjacency matrix internally.
 impl<N, E, Ty> GetAdjacencyMatrix for GraphMap<N, E, Ty>
-    where N: Copy + Ord + Hash,
-          Ty: EdgeType,
+where
+    N: Copy + Ord + Hash,
+    Ty: EdgeType,
 {
     type AdjMatrix = ();
     #[inline]
-    fn adjacency_matrix(&self) { }
+    fn adjacency_matrix(&self) {}
     #[inline]
     fn is_adjacent(&self, _: &(), a: N, b: N) -> bool {
         self.contains_edge(a, b)
diff --git a/src/visit/reversed.rs b/src/visit/reversed.rs
index ee5c772..c332c70 100644
--- a/src/visit/reversed.rs
+++ b/src/visit/reversed.rs
@@ -1,26 +1,9 @@
-
-use crate::{
-    Direction,
-    Incoming,
-};
+use crate::{Direction, Incoming};
 
 use crate::visit::{
-    GraphBase,
-    GraphRef,
-    IntoEdges,
-    IntoEdgesDirected,
-    IntoNodeIdentifiers,
-    IntoNodeReferences,
-    IntoNeighbors,
-    IntoNeighborsDirected,
-    IntoEdgeReferences,
-    NodeCompactIndexable,
-    NodeCount,
-    NodeIndexable,
-    Visitable,
-    EdgeRef,
-    Data,
-    GraphProp,
+    Data, EdgeRef, GraphBase, GraphProp, GraphRef, IntoEdgeReferences, IntoEdges,
+    IntoEdgesDirected, IntoNeighbors, IntoNeighborsDirected, IntoNodeIdentifiers,
+    IntoNodeReferences, NodeCompactIndexable, NodeCount, NodeIndexable, Visitable,
 };
 
 /// An edge-reversing graph adaptor.
@@ -34,33 +17,33 @@
     type EdgeId = G::EdgeId;
 }
 
-impl<G: GraphRef> GraphRef for Reversed<G> { }
+impl<G: GraphRef> GraphRef for Reversed<G> {}
 
-Data!{delegate_impl [[G], G, Reversed<G>, access0]}
+Data! {delegate_impl [[G], G, Reversed<G>, access0]}
 
 impl<G> IntoNeighbors for Reversed<G>
-    where G: IntoNeighborsDirected
+where
+    G: IntoNeighborsDirected,
 {
     type Neighbors = G::NeighborsDirected;
-    fn neighbors(self, n: G::NodeId) -> G::NeighborsDirected
-    {
+    fn neighbors(self, n: G::NodeId) -> G::NeighborsDirected {
         self.0.neighbors_directed(n, Incoming)
     }
 }
 
 impl<G> IntoNeighborsDirected for Reversed<G>
-    where G: IntoNeighborsDirected
+where
+    G: IntoNeighborsDirected,
 {
     type NeighborsDirected = G::NeighborsDirected;
-    fn neighbors_directed(self, n: G::NodeId, d: Direction)
-        -> G::NeighborsDirected
-    {
+    fn neighbors_directed(self, n: G::NodeId, d: Direction) -> G::NeighborsDirected {
         self.0.neighbors_directed(n, d.opposite())
     }
 }
 
 impl<G> IntoEdges for Reversed<G>
-    where G: IntoEdgesDirected
+where
+    G: IntoEdgesDirected,
 {
     type Edges = ReversedEdges<G::EdgesDirected>;
     fn edges(self, a: Self::NodeId) -> Self::Edges {
@@ -71,7 +54,8 @@
 }
 
 impl<G> IntoEdgesDirected for Reversed<G>
-    where G: IntoEdgesDirected
+where
+    G: IntoEdgesDirected,
 {
     type EdgesDirected = ReversedEdges<G::EdgesDirected>;
     fn edges_directed(self, a: Self::NodeId, dir: Direction) -> Self::Edges {
@@ -81,8 +65,7 @@
     }
 }
 
-impl<G: Visitable> Visitable for Reversed<G>
-{
+impl<G: Visitable> Visitable for Reversed<G> {
     type Map = G::Map;
     fn visit_map(&self) -> G::Map {
         self.0.visit_map()
@@ -98,7 +81,9 @@
 }
 
 impl<I> Iterator for ReversedEdges<I>
-    where I: Iterator, I::Item: EdgeRef
+where
+    I: Iterator,
+    I::Item: EdgeRef,
 {
     type Item = ReversedEdgeReference<I::Item>;
     fn next(&mut self) -> Option<Self::Item> {
@@ -112,7 +97,8 @@
 
 /// An edge reference
 impl<R> EdgeRef for ReversedEdgeReference<R>
-    where R: EdgeRef,
+where
+    R: EdgeRef,
 {
     type NodeId = R::NodeId;
     type EdgeId = R::EdgeId;
@@ -132,7 +118,8 @@
 }
 
 impl<G> IntoEdgeReferences for Reversed<G>
-    where G: IntoEdgeReferences
+where
+    G: IntoEdgeReferences,
 {
     type EdgeRef = ReversedEdgeReference<G::EdgeRef>;
     type EdgeReferences = ReversedEdgeReferences<G::EdgeReferences>;
@@ -149,8 +136,9 @@
 }
 
 impl<I> Iterator for ReversedEdgeReferences<I>
-    where I: Iterator,
-          I::Item: EdgeRef,
+where
+    I: Iterator,
+    I::Item: EdgeRef,
 {
     type Item = ReversedEdgeReference<I::Item>;
     fn next(&mut self) -> Option<Self::Item> {
@@ -159,14 +147,14 @@
 }
 
 macro_rules! access0 {
-    ($e:expr) => ($e.0)
+    ($e:expr) => {
+        $e.0
+    };
 }
 
-NodeIndexable!{delegate_impl [[G], G, Reversed<G>, access0]}
-NodeCompactIndexable!{delegate_impl [[G], G, Reversed<G>, access0]}
-IntoNodeIdentifiers!{delegate_impl [[G], G, Reversed<G>, access0]}
-IntoNodeReferences!{delegate_impl [[G], G, Reversed<G>, access0]}
-GraphProp!{delegate_impl [[G], G, Reversed<G>, access0]}
-NodeCount!{delegate_impl [[G], G, Reversed<G>, access0]}
-
-
+NodeIndexable! {delegate_impl [[G], G, Reversed<G>, access0]}
+NodeCompactIndexable! {delegate_impl [[G], G, Reversed<G>, access0]}
+IntoNodeIdentifiers! {delegate_impl [[G], G, Reversed<G>, access0]}
+IntoNodeReferences! {delegate_impl [[G], G, Reversed<G>, access0]}
+GraphProp! {delegate_impl [[G], G, Reversed<G>, access0]}
+NodeCount! {delegate_impl [[G], G, Reversed<G>, access0]}
diff --git a/src/visit/traversal.rs b/src/visit/traversal.rs
index 36618fe..e37f359 100644
--- a/src/visit/traversal.rs
+++ b/src/visit/traversal.rs
@@ -1,7 +1,6 @@
-
-use crate::{Incoming};
-use super::{IntoNeighbors, IntoNeighborsDirected, Visitable, VisitMap};
-use super::{GraphRef, Reversed, IntoNodeIdentifiers};
+use super::{GraphRef, IntoNodeIdentifiers, Reversed};
+use super::{IntoNeighbors, IntoNeighborsDirected, VisitMap, Visitable};
+use crate::Incoming;
 use std::collections::VecDeque;
 
 /// Visit nodes of a graph in a depth-first-search (DFS) emitting nodes in
@@ -43,13 +42,15 @@
 }
 
 impl<N, VM> Dfs<N, VM>
-    where N: Copy + PartialEq,
-          VM: VisitMap<N>,
+where
+    N: Copy + PartialEq,
+    VM: VisitMap<N>,
 {
     /// Create a new **Dfs**, using the graph's visitor map, and put **start**
     /// in the stack of nodes to visit.
     pub fn new<G>(graph: G, start: N) -> Self
-        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    where
+        G: GraphRef + Visitable<NodeId = N, Map = VM>,
     {
         let mut dfs = Dfs::empty(graph);
         dfs.move_to(start);
@@ -58,15 +59,13 @@
 
     /// Create a `Dfs` from a vector and a visit map
     pub fn from_parts(stack: Vec<N>, discovered: VM) -> Self {
-        Dfs {
-            stack,
-            discovered,
-        }
+        Dfs { stack, discovered }
     }
 
     /// Clear the visit state
     pub fn reset<G>(&mut self, graph: G)
-        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    where
+        G: GraphRef + Visitable<NodeId = N, Map = VM>,
     {
         graph.reset_map(&mut self.discovered);
         self.stack.clear();
@@ -74,7 +73,8 @@
 
     /// Create a new **Dfs** using the graph's visitor map, and no stack.
     pub fn empty<G>(graph: G) -> Self
-        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    where
+        G: GraphRef + Visitable<NodeId = N, Map = VM>,
     {
         Dfs {
             stack: Vec::new(),
@@ -84,15 +84,15 @@
 
     /// Keep the discovered map, but clear the visit stack and restart
     /// the dfs from a particular node.
-    pub fn move_to(&mut self, start: N)
-    {
+    pub fn move_to(&mut self, start: N) {
         self.stack.clear();
         self.stack.push(start);
     }
 
     /// Return the next node in the dfs, or **None** if the traversal is done.
     pub fn next<G>(&mut self, graph: G) -> Option<N>
-        where G: IntoNeighbors<NodeId=N>,
+    where
+        G: IntoNeighbors<NodeId = N>,
     {
         while let Some(node) = self.stack.pop() {
             if self.discovered.visit(node) {
@@ -126,13 +126,15 @@
 }
 
 impl<N, VM> DfsPostOrder<N, VM>
-    where N: Copy + PartialEq,
-          VM: VisitMap<N>,
+where
+    N: Copy + PartialEq,
+    VM: VisitMap<N>,
 {
     /// Create a new `DfsPostOrder` using the graph's visitor map, and put
     /// `start` in the stack of nodes to visit.
     pub fn new<G>(graph: G, start: N) -> Self
-        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    where
+        G: GraphRef + Visitable<NodeId = N, Map = VM>,
     {
         let mut dfs = Self::empty(graph);
         dfs.move_to(start);
@@ -141,7 +143,8 @@
 
     /// Create a new `DfsPostOrder` using the graph's visitor map, and no stack.
     pub fn empty<G>(graph: G) -> Self
-        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    where
+        G: GraphRef + Visitable<NodeId = N, Map = VM>,
     {
         DfsPostOrder {
             stack: Vec::new(),
@@ -152,7 +155,8 @@
 
     /// Clear the visit state
     pub fn reset<G>(&mut self, graph: G)
-        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    where
+        G: GraphRef + Visitable<NodeId = N, Map = VM>,
     {
         graph.reset_map(&mut self.discovered);
         graph.reset_map(&mut self.finished);
@@ -161,15 +165,15 @@
 
     /// Keep the discovered and finished map, but clear the visit stack and restart
     /// the dfs from a particular node.
-    pub fn move_to(&mut self, start: N)
-    {
+    pub fn move_to(&mut self, start: N) {
         self.stack.clear();
         self.stack.push(start);
     }
 
     /// Return the next node in the traversal, or `None` if the traversal is done.
     pub fn next<G>(&mut self, graph: G) -> Option<N>
-        where G: IntoNeighbors<NodeId=N>,
+    where
+        G: IntoNeighbors<NodeId = N>,
     {
         while let Some(&nx) = self.stack.last() {
             if self.discovered.visit(nx) {
@@ -229,27 +233,27 @@
 }
 
 impl<N, VM> Bfs<N, VM>
-    where N: Copy + PartialEq,
-          VM: VisitMap<N>,
+where
+    N: Copy + PartialEq,
+    VM: VisitMap<N>,
 {
     /// Create a new **Bfs**, using the graph's visitor map, and put **start**
     /// in the stack of nodes to visit.
     pub fn new<G>(graph: G, start: N) -> Self
-        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    where
+        G: GraphRef + Visitable<NodeId = N, Map = VM>,
     {
         let mut discovered = graph.visit_map();
         discovered.visit(start);
         let mut stack = VecDeque::new();
         stack.push_front(start);
-        Bfs {
-            stack,
-            discovered,
-        }
+        Bfs { stack, discovered }
     }
 
     /// Return the next node in the bfs, or **None** if the traversal is done.
     pub fn next<G>(&mut self, graph: G) -> Option<N>
-        where G: IntoNeighbors<NodeId=N>
+    where
+        G: IntoNeighbors<NodeId = N>,
     {
         if let Some(node) = self.stack.pop_front() {
             for succ in graph.neighbors(node) {
@@ -262,7 +266,6 @@
         }
         None
     }
-
 }
 
 /// A topological order traversal for a graph.
@@ -277,13 +280,15 @@
 }
 
 impl<N, VM> Topo<N, VM>
-    where N: Copy + PartialEq,
-          VM: VisitMap<N>,
+where
+    N: Copy + PartialEq,
+    VM: VisitMap<N>,
 {
     /// Create a new `Topo`, using the graph's visitor map, and put all
     /// initial nodes in the to visit list.
     pub fn new<G>(graph: G) -> Self
-        where G: IntoNodeIdentifiers + IntoNeighborsDirected + Visitable<NodeId=N, Map=VM>,
+    where
+        G: IntoNodeIdentifiers + IntoNeighborsDirected + Visitable<NodeId = N, Map = VM>,
     {
         let mut topo = Self::empty(graph);
         topo.extend_with_initials(graph);
@@ -291,18 +296,22 @@
     }
 
     fn extend_with_initials<G>(&mut self, g: G)
-        where G: IntoNodeIdentifiers + IntoNeighborsDirected<NodeId=N>,
+    where
+        G: IntoNodeIdentifiers + IntoNeighborsDirected<NodeId = N>,
     {
         // find all initial nodes (nodes without incoming edges)
-        self.tovisit.extend(g.node_identifiers()
-                             .filter(move |&a| g.neighbors_directed(a, Incoming).next().is_none()));
+        self.tovisit.extend(
+            g.node_identifiers()
+                .filter(move |&a| g.neighbors_directed(a, Incoming).next().is_none()),
+        );
     }
 
     /* Private until it has a use */
     /// Create a new `Topo`, using the graph's visitor map with *no* starting
     /// index specified.
     fn empty<G>(graph: G) -> Self
-        where G: GraphRef + Visitable<NodeId=N, Map=VM>
+    where
+        G: GraphRef + Visitable<NodeId = N, Map = VM>,
     {
         Topo {
             ordered: graph.visit_map(),
@@ -312,7 +321,8 @@
 
     /// Clear visited state, and put all initial nodes in the to visit list.
     pub fn reset<G>(&mut self, graph: G)
-        where G: IntoNodeIdentifiers + IntoNeighborsDirected + Visitable<NodeId=N, Map=VM>,
+    where
+        G: IntoNodeIdentifiers + IntoNeighborsDirected + Visitable<NodeId = N, Map = VM>,
     {
         graph.reset_map(&mut self.ordered);
         self.tovisit.clear();
@@ -325,7 +335,8 @@
     /// *Note:* The graph may not have a complete topological order, and the only
     /// way to know is to run the whole traversal and make sure it visits every node.
     pub fn next<G>(&mut self, g: G) -> Option<N>
-        where G: IntoNeighborsDirected + Visitable<NodeId=N, Map=VM>,
+    where
+        G: IntoNeighborsDirected + Visitable<NodeId = N, Map = VM>,
     {
         // Take an unvisited element and find which of its neighbors are next
         while let Some(nix) = self.tovisit.pop() {
@@ -336,7 +347,10 @@
             for neigh in g.neighbors(nix) {
                 // Look at each neighbor, and those that only have incoming edges
                 // from the already ordered list, they are the next to visit.
-                if Reversed(g).neighbors(neigh).all(|b| self.ordered.is_visited(&b)) {
+                if Reversed(g)
+                    .neighbors(neigh)
+                    .all(|b| self.ordered.is_visited(&b))
+                {
                     self.tovisit.push(neigh);
                 }
             }
@@ -346,7 +360,6 @@
     }
 }
 
-
 /// A walker is a traversal state, but where part of the traversal
 /// information is supplied manually to each next call.
 ///
@@ -359,8 +372,9 @@
 
     /// Create an iterator out of the walker and given `context`.
     fn iter(self, context: Context) -> WalkerIter<Self, Context>
-        where Self: Sized,
-              Context: Clone,
+    where
+        Self: Sized,
+        Context: Clone,
     {
         WalkerIter {
             walker: self,
@@ -377,8 +391,9 @@
 }
 
 impl<W, C> WalkerIter<W, C>
-    where W: Walker<C>,
-          C: Clone,
+where
+    W: Walker<C>,
+    C: Clone,
 {
     pub fn context(&self) -> C {
         self.context.clone()
@@ -394,8 +409,9 @@
 }
 
 impl<W, C> Iterator for WalkerIter<W, C>
-    where W: Walker<C>,
-          C: Clone,
+where
+    W: Walker<C>,
+    C: Clone,
 {
     type Item = W::Item;
     fn next(&mut self) -> Option<Self::Item> {
@@ -404,7 +420,8 @@
 }
 
 impl<'a, C, W: ?Sized> Walker<C> for &'a mut W
-    where W: Walker<C>,
+where
+    W: Walker<C>,
 {
     type Item = W::Item;
     fn walk_next(&mut self, context: C) -> Option<Self::Item> {
@@ -413,7 +430,8 @@
 }
 
 impl<G> Walker<G> for Dfs<G::NodeId, G::Map>
-    where G: IntoNeighbors + Visitable
+where
+    G: IntoNeighbors + Visitable,
 {
     type Item = G::NodeId;
     fn walk_next(&mut self, context: G) -> Option<Self::Item> {
@@ -422,7 +440,8 @@
 }
 
 impl<G> Walker<G> for DfsPostOrder<G::NodeId, G::Map>
-    where G: IntoNeighbors + Visitable
+where
+    G: IntoNeighbors + Visitable,
 {
     type Item = G::NodeId;
     fn walk_next(&mut self, context: G) -> Option<Self::Item> {
@@ -431,7 +450,8 @@
 }
 
 impl<G> Walker<G> for Bfs<G::NodeId, G::Map>
-    where G: IntoNeighbors + Visitable
+where
+    G: IntoNeighbors + Visitable,
 {
     type Item = G::NodeId;
     fn walk_next(&mut self, context: G) -> Option<Self::Item> {
@@ -440,7 +460,8 @@
 }
 
 impl<G> Walker<G> for Topo<G::NodeId, G::Map>
-    where G: IntoNeighborsDirected + Visitable,
+where
+    G: IntoNeighborsDirected + Visitable,
 {
     type Item = G::NodeId;
     fn walk_next(&mut self, context: G) -> Option<Self::Item> {
diff --git a/tests/graph.rs b/tests/graph.rs
index 758007d..a8e4097 100644
--- a/tests/graph.rs
+++ b/tests/graph.rs
@@ -4,56 +4,36 @@
 use std::hash::Hash;
 
 use petgraph::prelude::*;
-use petgraph::{
-    EdgeType,
-};
+use petgraph::EdgeType;
 
 use petgraph as pg;
 
 use petgraph::algo::{
-    dominators,
-    has_path_connecting,
-    is_cyclic_undirected,
+    dominators, has_path_connecting, is_cyclic_undirected, is_isomorphic_matching,
     min_spanning_tree,
-    is_isomorphic_matching,
 };
 
 use petgraph::graph::node_index as n;
-use petgraph::graph::{
-    IndexType,
-};
+use petgraph::graph::IndexType;
 
+use petgraph::algo::{astar, dijkstra, DfsSpace};
 use petgraph::visit::{
-    IntoEdges,
-    IntoEdgesDirected,
-    IntoNodeIdentifiers,
-    NodeFiltered,
-    Reversed,
-    Topo,
-    IntoNeighbors,
-    VisitMap,
-    Walker,
-};
-use petgraph::algo::{
-    DfsSpace,
-    dijkstra,
-    astar,
+    IntoEdges, IntoEdgesDirected, IntoNeighbors, IntoNodeIdentifiers, NodeFiltered, Reversed, Topo,
+    VisitMap, Walker,
 };
 
-use petgraph::dot::{
-    Dot,
-};
+use petgraph::dot::Dot;
 
 fn set<I>(iter: I) -> HashSet<I::Item>
-    where I: IntoIterator,
-          I::Item: Hash + Eq,
+where
+    I: IntoIterator,
+    I::Item: Hash + Eq,
 {
     iter.into_iter().collect()
 }
 
 #[test]
-fn undirected()
-{
+fn undirected() {
     let mut og = Graph::new_undirected();
     let a = og.add_node(0);
     let b = og.add_node(1);
@@ -89,7 +69,6 @@
     assert!(og.find_edge(a, a).is_none());
     assert!(og.find_edge(b, c).is_some());
     assert_graph_consistent(&og);
-
 }
 
 #[test]
@@ -147,7 +126,6 @@
     }
 }
 
-
 #[test]
 fn bfs() {
     let mut gr = Graph::new();
@@ -187,13 +165,11 @@
     assert_eq!(bfs.next(&gr), None);
 }
 
-
-
 #[test]
 fn mst() {
     use petgraph::data::FromElements;
 
-    let mut gr = Graph::<_,_>::new();
+    let mut gr = Graph::<_, _>::new();
     let a = gr.add_node("A");
     let b = gr.add_node("B");
     let c = gr.add_node("C");
@@ -245,7 +221,6 @@
 
     assert!(mst.find_edge(d, b).is_none());
     assert!(mst.find_edge(b, c).is_none());
-
 }
 
 #[test]
@@ -312,7 +287,6 @@
     gr.add_edge(a, b, ());
     gr.add_edge(a, b, ());
     assert_eq!(gr.edge_count(), 2);
-
 }
 
 #[test]
@@ -380,8 +354,7 @@
 }
 
 #[test]
-fn update_edge()
-{
+fn update_edge() {
     {
         let mut gr = Graph::new();
         let a = gr.add_node("a");
@@ -432,8 +405,17 @@
     let scores = dijkstra(&g, a, None, |e| *e.weight());
     let mut scores: Vec<_> = scores.into_iter().map(|(n, s)| (g[n], s)).collect();
     scores.sort();
-    assert_eq!(scores,
-       vec![("A", 0), ("B", 7), ("C", 9), ("D", 11), ("E", 20), ("F", 20)]);
+    assert_eq!(
+        scores,
+        vec![
+            ("A", 0),
+            ("B", 7),
+            ("C", 9),
+            ("D", 11),
+            ("E", 20),
+            ("F", 20)
+        ]
+    );
 
     let scores = dijkstra(&g, a, Some(c), |e| *e.weight());
     assert_eq!(scores[&c], 9);
@@ -496,7 +478,13 @@
             (x2 - x1).abs() + (y2 - y1).abs()
         }
     };
-    let path = astar(&g, a, |finish| finish == f, |e| *e.weight(), heuristic_for(f));
+    let path = astar(
+        &g,
+        a,
+        |finish| finish == f,
+        |e| *e.weight(),
+        heuristic_for(f),
+    );
 
     assert_eq!(path, Some((6., vec![a, d, e, f])));
 
@@ -504,10 +492,14 @@
     let dijkstra_run = dijkstra(&g, a, None, |e| *e.weight());
 
     for end in g.node_indices() {
-        let astar_path = astar(&g, a, |finish| finish == end, |e| *e.weight(),
-                               heuristic_for(end));
-        assert_eq!(dijkstra_run.get(&end).cloned(),
-                   astar_path.map(|t| t.0));
+        let astar_path = astar(
+            &g,
+            a,
+            |finish| finish == end,
+            |e| *e.weight(),
+            heuristic_for(end),
+        );
+        assert_eq!(dijkstra_run.get(&end).cloned(), astar_path.map(|t| t.0));
     }
 }
 
@@ -568,20 +560,25 @@
         assert_eq!(graphs.len(), 1 << nedges);
 
         // check that all generated graphs have unique adjacency matrices
-        let mut adjmats = graphs.iter().map(Graph::adjacency_matrix).collect::<Vec<_>>();
+        let mut adjmats = graphs
+            .iter()
+            .map(Graph::adjacency_matrix)
+            .collect::<Vec<_>>();
         adjmats.sort();
         adjmats.dedup();
         assert_eq!(adjmats.len(), graphs.len());
         for gr in &graphs {
-            assert!(!petgraph::algo::is_cyclic_directed(gr),
-                    "Assertion failed: {:?} acyclic", gr);
+            assert!(
+                !petgraph::algo::is_cyclic_directed(gr),
+                "Assertion failed: {:?} acyclic",
+                gr
+            );
         }
     }
 }
 
 #[test]
-fn without()
-{
+fn without() {
     let mut og = Graph::new_undirected();
     let a = og.add_node(0);
     let b = og.add_node(1);
@@ -605,8 +602,7 @@
     assert_eq!(term, vec![b, c, d]);
 }
 
-fn assert_is_topo_order<N, E>(gr: &Graph<N, E, Directed>, order: &[NodeIndex])
-{
+fn assert_is_topo_order<N, E>(gr: &Graph<N, E, Directed>, order: &[NodeIndex]) {
     assert_eq!(gr.node_count(), order.len());
     // check all the edges of the graph
     for edge in gr.raw_edges() {
@@ -615,14 +611,18 @@
         let ai = order.iter().position(|x| *x == a).unwrap();
         let bi = order.iter().position(|x| *x == b).unwrap();
         println!("Check that {:?} is before {:?}", a, b);
-        assert!(ai < bi, "Topo order: assertion that node {:?} is before {:?} failed",
-                a, b);
+        assert!(
+            ai < bi,
+            "Topo order: assertion that node {:?} is before {:?} failed",
+            a,
+            b
+        );
     }
 }
 
 #[test]
 fn test_toposort() {
-    let mut gr = Graph::<_,_>::new();
+    let mut gr = Graph::<_, _>::new();
     let a = gr.add_node("A");
     let b = gr.add_node("B");
     let c = gr.add_node("C");
@@ -661,7 +661,7 @@
 
 #[test]
 fn test_toposort_eq() {
-    let mut g = Graph::<_,_>::new();
+    let mut g = Graph::<_, _>::new();
     let a = g.add_node("A");
     let b = g.add_node("B");
     g.add_edge(a, b, ());
@@ -671,7 +671,7 @@
 
 #[test]
 fn is_cyclic_directed() {
-    let mut gr = Graph::<_,_>::new();
+    let mut gr = Graph::<_, _>::new();
     let a = gr.add_node("A");
     let b = gr.add_node("B");
     let c = gr.add_node("C");
@@ -708,8 +708,11 @@
 
 /// Compare two scc sets. Inside each scc, the order does not matter,
 /// but the order of the sccs is significant.
-fn assert_sccs_eq(mut res: Vec<Vec<NodeIndex>>, mut answer: Vec<Vec<NodeIndex>>,
-                  scc_order_matters: bool) {
+fn assert_sccs_eq(
+    mut res: Vec<Vec<NodeIndex>>,
+    mut answer: Vec<Vec<NodeIndex>>,
+    scc_order_matters: bool,
+) {
     // normalize the result and compare with the answer.
     for scc in &mut res {
         scc.sort();
@@ -737,20 +740,28 @@
         (7, 5),
         (1, 7),
         (7, 4),
-        (4, 1)]);
+        (4, 1),
+    ]);
 
-    assert_sccs_eq(petgraph::algo::kosaraju_scc(&gr), vec![
-        vec![n(0), n(3), n(6)],
-        vec![n(2), n(5), n(8)],
-        vec![n(1), n(4), n(7)],
-    ], true);
+    assert_sccs_eq(
+        petgraph::algo::kosaraju_scc(&gr),
+        vec![
+            vec![n(0), n(3), n(6)],
+            vec![n(2), n(5), n(8)],
+            vec![n(1), n(4), n(7)],
+        ],
+        true,
+    );
     // Reversed edges gives the same sccs (when sorted)
-    assert_sccs_eq(petgraph::algo::kosaraju_scc(Reversed(&gr)), vec![
-        vec![n(1), n(4), n(7)],
-        vec![n(2), n(5), n(8)],
-        vec![n(0), n(3), n(6)],
-    ], true);
-
+    assert_sccs_eq(
+        petgraph::algo::kosaraju_scc(Reversed(&gr)),
+        vec![
+            vec![n(1), n(4), n(7)],
+            vec![n(2), n(5), n(8)],
+            vec![n(0), n(3), n(6)],
+        ],
+        true,
+    );
 
     // Test an undirected graph just for fun.
     // Sccs are just connected components.
@@ -759,11 +770,14 @@
     let ed = hr.find_edge(n(6), n(8)).unwrap();
     assert!(hr.remove_edge(ed).is_some());
 
-    assert_sccs_eq(petgraph::algo::kosaraju_scc(&hr), vec![
-        vec![n(0), n(3), n(6)],
-        vec![n(1), n(2), n(4), n(5), n(7), n(8)],
-    ], false);
-
+    assert_sccs_eq(
+        petgraph::algo::kosaraju_scc(&hr),
+        vec![
+            vec![n(0), n(3), n(6)],
+            vec![n(1), n(2), n(4), n(5), n(7), n(8)],
+        ],
+        false,
+    );
 
     // acyclic non-tree, #14
     let n = NodeIndex::new;
@@ -777,27 +791,24 @@
     gr.add_edge(n(2), n(0), ());
     gr.add_edge(n(1), n(0), ());
 
-    assert_sccs_eq(petgraph::algo::kosaraju_scc(&gr), vec![
-        vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)],
-    ], true);
+    assert_sccs_eq(
+        petgraph::algo::kosaraju_scc(&gr),
+        vec![vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)]],
+        true,
+    );
 
     // Kosaraju bug from PR #60
     let mut gr = Graph::<(), ()>::new();
-    gr.extend_with_edges(&[
-        (0, 0),
-        (1, 0),
-        (2, 0),
-        (2, 1),
-        (2, 2),
-    ]);
+    gr.extend_with_edges(&[(0, 0), (1, 0), (2, 0), (2, 1), (2, 2)]);
     gr.add_node(());
     // no order for the disconnected one
-    assert_sccs_eq(petgraph::algo::kosaraju_scc(&gr), vec![
-        vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)],
-    ], false);
+    assert_sccs_eq(
+        petgraph::algo::kosaraju_scc(&gr),
+        vec![vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)]],
+        false,
+    );
 }
 
-
 #[test]
 fn tarjan_scc() {
     let gr: Graph<(), ()> = Graph::from_edges(&[
@@ -811,14 +822,18 @@
         (7, 5),
         (1, 7),
         (7, 4),
-        (4, 1)]);
+        (4, 1),
+    ]);
 
-    assert_sccs_eq(petgraph::algo::tarjan_scc(&gr), vec![
-        vec![n(0), n(3), n(6)],
-        vec![n(2), n(5), n(8)],
-        vec![n(1), n(4), n(7)],
-    ], true);
-
+    assert_sccs_eq(
+        petgraph::algo::tarjan_scc(&gr),
+        vec![
+            vec![n(0), n(3), n(6)],
+            vec![n(2), n(5), n(8)],
+            vec![n(1), n(4), n(7)],
+        ],
+        true,
+    );
 
     // Test an undirected graph just for fun.
     // Sccs are just connected components.
@@ -827,11 +842,14 @@
     let ed = hr.find_edge(n(6), n(8)).unwrap();
     assert!(hr.remove_edge(ed).is_some());
 
-    assert_sccs_eq(petgraph::algo::tarjan_scc(&hr), vec![
-        vec![n(1), n(2), n(4), n(5), n(7), n(8)],
-        vec![n(0), n(3), n(6)],
-    ], false);
-
+    assert_sccs_eq(
+        petgraph::algo::tarjan_scc(&hr),
+        vec![
+            vec![n(1), n(2), n(4), n(5), n(7), n(8)],
+            vec![n(0), n(3), n(6)],
+        ],
+        false,
+    );
 
     // acyclic non-tree, #14
     let n = NodeIndex::new;
@@ -845,30 +863,26 @@
     gr.add_edge(n(2), n(0), ());
     gr.add_edge(n(1), n(0), ());
 
-    assert_sccs_eq(petgraph::algo::tarjan_scc(&gr), vec![
-        vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)],
-    ], true);
+    assert_sccs_eq(
+        petgraph::algo::tarjan_scc(&gr),
+        vec![vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)]],
+        true,
+    );
 
     // Kosaraju bug from PR #60
     let mut gr = Graph::<(), ()>::new();
-    gr.extend_with_edges(&[
-        (0, 0),
-        (1, 0),
-        (2, 0),
-        (2, 1),
-        (2, 2),
-    ]);
+    gr.extend_with_edges(&[(0, 0), (1, 0), (2, 0), (2, 1), (2, 2)]);
     gr.add_node(());
     // no order for the disconnected one
-    assert_sccs_eq(petgraph::algo::tarjan_scc(&gr), vec![
-        vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)],
-    ], false);
+    assert_sccs_eq(
+        petgraph::algo::tarjan_scc(&gr),
+        vec![vec![n(0)], vec![n(1)], vec![n(2)], vec![n(3)]],
+        false,
+    );
 }
 
-
 #[test]
-fn condensation()
-{
+fn condensation() {
     let gr: Graph<(), ()> = Graph::from_edges(&[
         (6, 0),
         (0, 3),
@@ -881,8 +895,8 @@
         (7, 5),
         (1, 7),
         (7, 4),
-        (4, 1)]);
-
+        (4, 1),
+    ]);
 
     // make_acyclic = true
 
@@ -890,9 +904,11 @@
 
     assert!(cond.node_count() == 3);
     assert!(cond.edge_count() == 2);
-    assert!(!petgraph::algo::is_cyclic_directed(&cond),
-            "Assertion failed: {:?} acyclic", cond);
-
+    assert!(
+        !petgraph::algo::is_cyclic_directed(&cond),
+        "Assertion failed: {:?} acyclic",
+        cond
+    );
 
     // make_acyclic = false
 
@@ -903,8 +919,7 @@
 }
 
 #[test]
-fn connected_comp()
-{
+fn connected_comp() {
     let n = NodeIndex::new;
     let mut gr = Graph::new();
     gr.add_node(0);
@@ -942,8 +957,7 @@
 
 #[should_panic]
 #[test]
-fn oob_index()
-{
+fn oob_index() {
     let mut gr = Graph::<_, ()>::new();
     let a = gr.add_node(0);
     let b = gr.add_node(1);
@@ -952,8 +966,7 @@
 }
 
 #[test]
-fn usize_index()
-{
+fn usize_index() {
     let mut gr = Graph::<_, _, Directed, usize>::with_capacity(0, 0);
     let a = gr.add_node(0);
     let b = gr.add_node(1);
@@ -968,8 +981,7 @@
 }
 
 #[test]
-fn u8_index()
-{
+fn u8_index() {
     let mut gr = Graph::<_, (), Undirected, u8>::with_capacity(0, 0);
     for _ in 0..255 {
         gr.add_node(());
@@ -978,8 +990,7 @@
 
 #[should_panic]
 #[test]
-fn u8_index_overflow()
-{
+fn u8_index_overflow() {
     let mut gr = Graph::<_, (), Undirected, u8>::with_capacity(0, 0);
     for _ in 0..256 {
         gr.add_node(());
@@ -988,8 +999,7 @@
 
 #[should_panic]
 #[test]
-fn u8_index_overflow_edges()
-{
+fn u8_index_overflow_edges() {
     let mut gr = Graph::<_, (), Undirected, u8>::with_capacity(0, 0);
     let a = gr.add_node('a');
     let b = gr.add_node('b');
@@ -1000,7 +1010,7 @@
 
 #[test]
 fn test_weight_iterators() {
-    let mut gr = Graph::<_,_>::new();
+    let mut gr = Graph::<_, _>::new();
     let a = gr.add_node("A");
     let b = gr.add_node("B");
     let c = gr.add_node("C");
@@ -1044,7 +1054,7 @@
     let old = gr.clone();
     for (index, ew) in gr.edge_weights_mut().enumerate() {
         assert_eq!(old[EdgeIndex::new(index)], *ew);
-        *ew = - *ew;
+        *ew = -*ew;
     }
     for (index, edge) in gr.raw_edges().iter().enumerate() {
         assert_eq!(edge.weight, -1. * old[EdgeIndex::new(index)]);
@@ -1053,7 +1063,7 @@
 
 #[test]
 fn walk_edges() {
-    let mut gr = Graph::<_,_>::new();
+    let mut gr = Graph::<_, _>::new();
     let a = gr.add_node(0.);
     let b = gr.add_node(1.);
     let c = gr.add_node(2.);
@@ -1096,7 +1106,7 @@
 
 #[test]
 fn index_twice_mut() {
-    let mut gr = Graph::<_,_>::new();
+    let mut gr = Graph::<_, _>::new();
     let a = gr.add_node(0.);
     let b = gr.add_node(0.);
     let c = gr.add_node(0.);
@@ -1117,7 +1127,9 @@
     gr.add_edge(e, g, 9.);
 
     for dir in &[Incoming, Outgoing] {
-        for nw in gr.node_weights_mut() { *nw = 0.; }
+        for nw in gr.node_weights_mut() {
+            *nw = 0.;
+        }
 
         // walk the graph and sum incoming edges
         let mut dfs = Dfs::new(&gr, a);
@@ -1132,7 +1144,10 @@
         // check the sums
         for i in 0..gr.node_count() {
             let ni = NodeIndex::new(i);
-            let s = gr.edges_directed(ni, *dir).map(|e| *e.weight()).fold(0., |a, b| a + b);
+            let s = gr
+                .edges_directed(ni, *dir)
+                .map(|e| *e.weight())
+                .fold(0., |a, b| a + b);
             assert_eq!(s, gr[ni]);
         }
         println!("Sum {:?}: {:?}", dir, gr);
@@ -1169,20 +1184,30 @@
     let gr = make_edge_iterator_graph::<Directed>();
 
     for i in gr.node_indices() {
-        itertools::assert_equal(
-            gr.edges_directed(i, Outgoing),
-            gr.edges(i));
+        itertools::assert_equal(gr.edges_directed(i, Outgoing), gr.edges(i));
 
         // Reversed reverses edges, so target and source need to be reversed once more.
         itertools::assert_equal(
-            gr.edges_directed(i, Outgoing).map(|edge| (edge.source(), edge.target())),
-            Reversed(&gr).edges_directed(i, Incoming).map(|edge| (edge.target(), edge.source())));
+            gr.edges_directed(i, Outgoing)
+                .map(|edge| (edge.source(), edge.target())),
+            Reversed(&gr)
+                .edges_directed(i, Incoming)
+                .map(|edge| (edge.target(), edge.source())),
+        );
 
         for edge in gr.edges_directed(i, Outgoing) {
-            assert_eq!(edge.source(), i, "outgoing edges should have a fixed source");
+            assert_eq!(
+                edge.source(),
+                i,
+                "outgoing edges should have a fixed source"
+            );
         }
         for edge in Reversed(&gr).edges_directed(i, Incoming) {
-            assert_eq!(edge.target(), i, "reversed incoming edges should have a fixed target");
+            assert_eq!(
+                edge.target(),
+                i,
+                "reversed incoming edges should have a fixed target"
+            );
         }
     }
 
@@ -1192,20 +1217,30 @@
     println!("{:#?}", gr);
     for i in gr.node_indices() {
         // Compare against reversed graphs two different ways: using .reverse() and Reversed.
-        itertools::assert_equal(
-            gr.edges_directed(i, Incoming),
-            reversed_gr.edges(i));
+        itertools::assert_equal(gr.edges_directed(i, Incoming), reversed_gr.edges(i));
 
         // Reversed reverses edges, so target and source need to be reversed once more.
         itertools::assert_equal(
-            gr.edges_directed(i, Incoming).map(|edge| (edge.source(), edge.target())),
-            Reversed(&gr).edges(i).map(|edge| (edge.target(), edge.source())));
+            gr.edges_directed(i, Incoming)
+                .map(|edge| (edge.source(), edge.target())),
+            Reversed(&gr)
+                .edges(i)
+                .map(|edge| (edge.target(), edge.source())),
+        );
 
         for edge in gr.edges_directed(i, Incoming) {
-            assert_eq!(edge.target(), i, "incoming edges should have a fixed target");
+            assert_eq!(
+                edge.target(),
+                i,
+                "incoming edges should have a fixed target"
+            );
         }
         for edge in Reversed(&gr).edges_directed(i, Outgoing) {
-            assert_eq!(edge.source(), i, "reversed outgoing edges should have a fixed source");
+            assert_eq!(
+                edge.source(),
+                i,
+                "reversed outgoing edges should have a fixed source"
+            );
         }
     }
 }
@@ -1215,38 +1250,58 @@
     let gr = make_edge_iterator_graph::<Undirected>();
 
     for i in gr.node_indices() {
-        itertools::assert_equal(
-            gr.edges_directed(i, Outgoing),
-            gr.edges(i));
+        itertools::assert_equal(gr.edges_directed(i, Outgoing), gr.edges(i));
 
         // Reversed reverses edges, so target and source need to be reversed once more.
         itertools::assert_equal(
-            gr.edges_directed(i, Outgoing).map(|edge| (edge.source(), edge.target())),
-            Reversed(&gr).edges_directed(i, Incoming).map(|edge| (edge.target(), edge.source())));
+            gr.edges_directed(i, Outgoing)
+                .map(|edge| (edge.source(), edge.target())),
+            Reversed(&gr)
+                .edges_directed(i, Incoming)
+                .map(|edge| (edge.target(), edge.source())),
+        );
 
         for edge in gr.edges_directed(i, Outgoing) {
-            assert_eq!(edge.source(), i, "outgoing edges should have a fixed source");
+            assert_eq!(
+                edge.source(),
+                i,
+                "outgoing edges should have a fixed source"
+            );
         }
         for edge in Reversed(&gr).edges_directed(i, Incoming) {
-            assert_eq!(edge.target(), i, "reversed incoming edges should have a fixed target");
+            assert_eq!(
+                edge.target(),
+                i,
+                "reversed incoming edges should have a fixed target"
+            );
         }
     }
 
     for i in gr.node_indices() {
-        itertools::assert_equal(
-            gr.edges_directed(i, Incoming),
-            gr.edges(i));
+        itertools::assert_equal(gr.edges_directed(i, Incoming), gr.edges(i));
 
         // Reversed reverses edges, so target and source need to be reversed once more.
         itertools::assert_equal(
-            gr.edges_directed(i, Incoming).map(|edge| (edge.source(), edge.target())),
-            Reversed(&gr).edges(i).map(|edge| (edge.target(), edge.source())));
+            gr.edges_directed(i, Incoming)
+                .map(|edge| (edge.source(), edge.target())),
+            Reversed(&gr)
+                .edges(i)
+                .map(|edge| (edge.target(), edge.source())),
+        );
 
         for edge in gr.edges_directed(i, Incoming) {
-            assert_eq!(edge.target(), i, "incoming edges should have a fixed target");
+            assert_eq!(
+                edge.target(),
+                i,
+                "incoming edges should have a fixed target"
+            );
         }
         for edge in Reversed(&gr).edges_directed(i, Outgoing) {
-            assert_eq!(edge.source(), i, "reversed outgoing edges should have a fixed source");
+            assert_eq!(
+                edge.source(),
+                i,
+                "reversed outgoing edges should have a fixed source"
+            );
         }
     }
 }
@@ -1254,7 +1309,7 @@
 #[test]
 fn toposort_generic() {
     // This is a DAG, visit it in order
-    let mut gr = Graph::<_,_>::new();
+    let mut gr = Graph::<_, _>::new();
     let b = gr.add_node(("B", 0.));
     let a = gr.add_node(("A", 0.));
     let c = gr.add_node(("C", 0.));
@@ -1314,7 +1369,7 @@
 #[test]
 fn test_has_path() {
     // This is a DAG, visit it in order
-    let mut gr = Graph::<_,_>::new();
+    let mut gr = Graph::<_, _>::new();
     let b = gr.add_node(("B", 0.));
     let a = gr.add_node(("A", 0.));
     let c = gr.add_node(("C", 0.));
@@ -1376,24 +1431,27 @@
     g.add_edge(e, f, 6);
     println!("{:?}", g);
 
-    let g2 = g.filter_map(|_, name| Some(*name), |_, &weight| if weight >= 10 {
-        Some(weight)
-    } else { None });
+    let g2 = g.filter_map(
+        |_, name| Some(*name),
+        |_, &weight| if weight >= 10 { Some(weight) } else { None },
+    );
     assert_eq!(g2.edge_count(), 4);
     for edge in g2.raw_edges() {
         assert!(edge.weight >= 10);
     }
 
-    let g3 = g.filter_map(|i, &name| if i == a || i == e { None } else { Some(name) },
-                          |i, &weight| {
-                              let (source, target) = g.edge_endpoints(i).unwrap();
-                              // don't map edges from a removed node
-                              assert!(source != a);
-                              assert!(target != a);
-                              assert!(source != e);
-                              assert!(target != e);
-                              Some(weight)
-                          });
+    let g3 = g.filter_map(
+        |i, &name| if i == a || i == e { None } else { Some(name) },
+        |i, &weight| {
+            let (source, target) = g.edge_endpoints(i).unwrap();
+            // don't map edges from a removed node
+            assert!(source != a);
+            assert!(target != a);
+            assert!(source != e);
+            assert!(target != e);
+            Some(weight)
+        },
+    );
     assert_eq!(g3.node_count(), g.node_count() - 2);
     assert_eq!(g3.edge_count(), g.edge_count() - 5);
     assert_graph_consistent(&g3);
@@ -1410,11 +1468,8 @@
 #[test]
 fn from_edges() {
     let n = NodeIndex::new;
-    let gr = Graph::<(), (), Undirected>::from_edges(&[
-        (0, 1), (0, 2), (0, 3),
-        (1, 2), (1, 3),
-        (2, 3),
-    ]);
+    let gr =
+        Graph::<(), (), Undirected>::from_edges(&[(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]);
     assert_eq!(gr.node_count(), 4);
     assert_eq!(gr.edge_count(), 6);
     assert_eq!(gr.neighbors(n(0)).count(), 3);
@@ -1434,8 +1489,9 @@
         (2, 3, 3),
     ]);
     gr.retain_edges(|mut gr, i| {
-        if gr[i] <= 0 { false }
-        else {
+        if gr[i] <= 0 {
+            false
+        } else {
             gr[i] -= 1;
             let (s, t) = gr.edge_endpoints(i).unwrap();
             gr[s] += 1;
@@ -1456,30 +1512,30 @@
 }
 
 fn assert_graph_consistent<N, E, Ty, Ix>(g: &Graph<N, E, Ty, Ix>)
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     assert_eq!(g.node_count(), g.node_indices().count());
     assert_eq!(g.edge_count(), g.edge_indices().count());
     for edge in g.raw_edges() {
-        assert!(g.find_edge(edge.source(), edge.target()).is_some(),
-                "Edge not in graph! {:?} to {:?}", edge.source(), edge.target());
+        assert!(
+            g.find_edge(edge.source(), edge.target()).is_some(),
+            "Edge not in graph! {:?} to {:?}",
+            edge.source(),
+            edge.target()
+        );
     }
 }
 
 #[test]
 fn neighbors_selfloops() {
     // Directed graph
-    let mut gr = Graph::<_ ,()>::new();
+    let mut gr = Graph::<_, ()>::new();
     let a = gr.add_node("a");
     let b = gr.add_node("b");
     let c = gr.add_node("c");
-    gr.extend_with_edges(&[
-        (a, a),
-        (a, b),
-        (c, a),
-        (a, a),
-    ]);
+    gr.extend_with_edges(&[(a, a), (a, b), (c, a), (a, a)]);
 
     let out_edges = [a, a, b];
     let in_edges = [a, a, c];
@@ -1501,19 +1557,25 @@
 
     let mut seen_walk = Vec::new();
     let mut walk = gr.neighbors(a).detach();
-    while let Some(n) = walk.next_node(&gr) { seen_walk.push(n); }
+    while let Some(n) = walk.next_node(&gr) {
+        seen_walk.push(n);
+    }
     seen_walk.sort();
     assert_eq!(&seen_walk, &out_edges);
 
     seen_walk.clear();
     let mut walk = gr.neighbors_directed(a, Incoming).detach();
-    while let Some(n) = walk.next_node(&gr) { seen_walk.push(n); }
+    while let Some(n) = walk.next_node(&gr) {
+        seen_walk.push(n);
+    }
     seen_walk.sort();
     assert_eq!(&seen_walk, &in_edges);
 
     seen_walk.clear();
     let mut walk = gr.neighbors_undirected(a).detach();
-    while let Some(n) = walk.next_node(&gr) { seen_walk.push(n); }
+    while let Some(n) = walk.next_node(&gr) {
+        seen_walk.push(n);
+    }
     seen_walk.sort();
     assert_eq!(&seen_walk, &undir_edges);
 
@@ -1522,11 +1584,7 @@
     let a = gr.add_node("a");
     let b = gr.add_node("b");
     let c = gr.add_node("c");
-    gr.extend_with_edges(&[
-        (a, a),
-        (a, b),
-        (c, a),
-    ]);
+    gr.extend_with_edges(&[(a, a), (a, b), (c, a)]);
 
     let out_edges = [a, b, c];
     let in_edges = [a, b, c];
@@ -1548,10 +1606,10 @@
     assert_eq!(&seen_undir, &undir_edges);
 }
 
-
 fn degree<'a, G>(g: G, node: G::NodeId) -> usize
-    where G: IntoNeighbors,
-          G::NodeId: PartialEq,
+where
+    G: IntoNeighbors,
+    G::NodeId: PartialEq,
 {
     // self loops count twice
     let original_node = node.clone();
@@ -1567,30 +1625,35 @@
 fn degree_sequence() {
     let mut gr = Graph::<usize, (), Undirected>::from_edges(&[
         (0, 1),
-        (1, 2), (1, 3),
-        (2, 4), (3, 4),
+        (1, 2),
+        (1, 3),
+        (2, 4),
+        (3, 4),
         (4, 4),
-        (4, 5), (3, 5),
+        (4, 5),
+        (3, 5),
     ]);
     gr.add_node(0); // add isolated node
-    let mut degree_sequence = gr.node_indices()
-                                .map(|i| degree(&gr, i))
-                                .collect::<Vec<_>>();
+    let mut degree_sequence = gr
+        .node_indices()
+        .map(|i| degree(&gr, i))
+        .collect::<Vec<_>>();
 
     degree_sequence.sort_by(|x, y| Ord::cmp(y, x));
     assert_eq!(&degree_sequence, &[5, 3, 3, 2, 2, 1, 0]);
 
     let mut gr = GraphMap::<_, (), Undirected>::from_edges(&[
         (0, 1),
-        (1, 2), (1, 3),
-        (2, 4), (3, 4),
+        (1, 2),
+        (1, 3),
+        (2, 4),
+        (3, 4),
         (4, 4),
-        (4, 5), (3, 5),
+        (4, 5),
+        (3, 5),
     ]);
     gr.add_node(6); // add isolated node
-    let mut degree_sequence = gr.nodes()
-                                .map(|i| degree(&gr, i))
-                                .collect::<Vec<_>>();
+    let mut degree_sequence = gr.nodes().map(|i| degree(&gr, i)).collect::<Vec<_>>();
 
     degree_sequence.sort_by(|x, y| Ord::cmp(y, x));
     assert_eq!(&degree_sequence, &[5, 3, 3, 2, 2, 1, 0]);
@@ -1613,10 +1676,11 @@
     gr.add_edge(b, a, 5);
 
     // neighbors (edges) are in lifo order, if it's a directed graph
-    assert_eq!(gr.neighbors(a).collect::<Vec<_>>(),
-               vec![c, a, b]);
-    assert_eq!(gr.neighbors_directed(a, Incoming).collect::<Vec<_>>(),
-               vec![b, c, c, a]);
+    assert_eq!(gr.neighbors(a).collect::<Vec<_>>(), vec![c, a, b]);
+    assert_eq!(
+        gr.neighbors_directed(a, Incoming).collect::<Vec<_>>(),
+        vec![b, c, c, a]
+    );
 }
 
 #[test]
@@ -1631,13 +1695,15 @@
     let a = gr.add_node(Record { a: 1, b: r"abc\" });
     gr.add_edge(a, a, (1, 2));
     let dot_output = format!("{:?}", Dot::new(&gr));
-    assert_eq!(dot_output,
-    // The single \ turns into four \\\\ because of Debug which turns it to \\ and then escaping each \ to \\.
-r#"digraph {
+    assert_eq!(
+        dot_output,
+        // The single \ turns into four \\\\ because of Debug which turns it to \\ and then escaping each \ to \\.
+        r#"digraph {
     0 [label="Record { a: 1, b: \"abc\\\\\" }"]
     0 -> 0 [label="(1, 2)"]
 }
-"#);
+"#
+    );
 }
 
 #[test]
@@ -1700,7 +1766,6 @@
     }
     assert_eq!(set(po), set(vec![a]));
 
-
     let mut g = Graph::new();
     let a = g.add_node("A");
     let b = g.add_node("B");
@@ -1813,15 +1878,20 @@
 
 #[test]
 fn dfs_visit() {
-    use petgraph::visit::{Visitable, VisitMap};
-    use petgraph::visit::DfsEvent::*;
-    use petgraph::visit::{Time, depth_first_search};
     use petgraph::visit::Control;
+    use petgraph::visit::DfsEvent::*;
+    use petgraph::visit::{depth_first_search, Time};
+    use petgraph::visit::{VisitMap, Visitable};
     let gr: Graph<(), ()> = Graph::from_edges(&[
-        (0, 5), (0, 2), (0, 3), (0, 1),
+        (0, 5),
+        (0, 2),
+        (0, 3),
+        (0, 1),
         (1, 3),
-        (2, 3), (2, 4),
-        (4, 0), (4, 5),
+        (2, 3),
+        (2, 4),
+        (4, 0),
+        (4, 5),
     ]);
 
     let invalid_time = Time(!0);
@@ -1856,7 +1926,10 @@
     assert!(discover_time.iter().all(|x| *x != invalid_time));
     assert!(finish_time.iter().all(|x| *x != invalid_time));
     assert_eq!(edges.len(), gr.edge_count());
-    assert_eq!(edges, set(gr.edge_references().map(|e| (e.source(), e.target()))));
+    assert_eq!(
+        edges,
+        set(gr.edge_references().map(|e| (e.source(), e.target())))
+    );
     println!("{:?}", discover_time);
     println!("{:?}", finish_time);
 
@@ -1906,23 +1979,15 @@
     assert!(ret.break_value().is_none());
 }
 
-
 #[test]
 fn filtered_post_order() {
     use petgraph::visit::NodeFiltered;
 
-    let mut gr: Graph<(), ()> = Graph::from_edges(&[
-        (0, 2),
-        (1, 2),
-        (0, 3),
-        (1, 4),
-        (2, 4),
-        (4, 5),
-        (3, 5),
-    ]);
+    let mut gr: Graph<(), ()> =
+        Graph::from_edges(&[(0, 2), (1, 2), (0, 3), (1, 4), (2, 4), (4, 5), (3, 5)]);
     // map reachable nodes
     let mut dfs = Dfs::new(&gr, n(0));
-    while let Some(_) = dfs.next(&gr) { }
+    while let Some(_) = dfs.next(&gr) {}
 
     let map = dfs.discovered;
     gr.add_edge(n(0), n(1), ());
@@ -1937,39 +2002,78 @@
 
 #[test]
 fn filter_elements() {
-    use petgraph::data::Element::{Node, Edge};
-    use petgraph::data::FromElements;
+    use petgraph::data::Element::{Edge, Node};
     use petgraph::data::ElementIterator;
+    use petgraph::data::FromElements;
     let elements = vec![
-        Node { weight: "A"},
-        Node { weight: "B"},
-        Node { weight: "C"},
-        Node { weight: "D"},
-        Node { weight: "E"},
-        Node { weight: "F"},
-
-        Edge { source: 0, target: 1, weight: 7 },
-        Edge { source: 2, target: 0, weight: 9 },
-        Edge { source: 0, target: 3, weight: 14 },
-        Edge { source: 1, target: 2, weight: 10 },
-        Edge { source: 3, target: 2, weight: 2 },
-        Edge { source: 3, target: 4, weight: 9 },
-        Edge { source: 1, target: 5, weight: 15 },
-        Edge { source: 2, target: 5, weight: 11 },
-        Edge { source: 4, target: 5, weight: 6 },
+        Node { weight: "A" },
+        Node { weight: "B" },
+        Node { weight: "C" },
+        Node { weight: "D" },
+        Node { weight: "E" },
+        Node { weight: "F" },
+        Edge {
+            source: 0,
+            target: 1,
+            weight: 7,
+        },
+        Edge {
+            source: 2,
+            target: 0,
+            weight: 9,
+        },
+        Edge {
+            source: 0,
+            target: 3,
+            weight: 14,
+        },
+        Edge {
+            source: 1,
+            target: 2,
+            weight: 10,
+        },
+        Edge {
+            source: 3,
+            target: 2,
+            weight: 2,
+        },
+        Edge {
+            source: 3,
+            target: 4,
+            weight: 9,
+        },
+        Edge {
+            source: 1,
+            target: 5,
+            weight: 15,
+        },
+        Edge {
+            source: 2,
+            target: 5,
+            weight: 11,
+        },
+        Edge {
+            source: 4,
+            target: 5,
+            weight: 6,
+        },
     ];
     let mut g = DiGraph::<_, _>::from_elements(elements.iter().cloned());
     println!("{:#?}", g);
     assert!(g.contains_edge(n(1), n(5)));
-    let g2 = DiGraph::<_, _>::from_elements(elements.iter().cloned().filter_elements(|elt| {
-        match elt {
+    let g2 =
+        DiGraph::<_, _>::from_elements(elements.iter().cloned().filter_elements(|elt| match elt {
             Node { ref weight } if **weight == "B" => false,
             _ => true,
-        }
-    }));
+        }));
     println!("{:#?}", g2);
     g.remove_node(n(1));
-    assert!(is_isomorphic_matching(&g, &g2, PartialEq::eq, PartialEq::eq));
+    assert!(is_isomorphic_matching(
+        &g,
+        &g2,
+        PartialEq::eq,
+        PartialEq::eq
+    ));
 }
 
 #[test]
@@ -1979,29 +2083,29 @@
     use petgraph::visit::IntoEdgeReferences;
 
     let gr = UnGraph::<(), _>::from_edges(&[
-            // cycle
-            (0, 1, 7),
-            (1, 2, 9),
-            (2, 1, 14),
-
-            // cycle
-            (3, 4, 10),
-            (4, 5, 2),
-            (5, 3, 9),
-
-            // cross edges
-            (0, 3, -1),
-            (1, 4, -2),
-            (2, 5, -3),
+        // cycle
+        (0, 1, 7),
+        (1, 2, 9),
+        (2, 1, 14),
+        // cycle
+        (3, 4, 10),
+        (4, 5, 2),
+        (5, 3, 9),
+        // cross edges
+        (0, 3, -1),
+        (1, 4, -2),
+        (2, 5, -3),
     ]);
     assert_eq!(connected_components(&gr), 1);
     let positive_edges = EdgeFiltered::from_fn(&gr, |edge| *edge.weight() >= 0);
     assert_eq!(positive_edges.edge_references().count(), 6);
-    assert!(positive_edges.edge_references().all(|edge| *edge.weight() >= 0));
+    assert!(positive_edges
+        .edge_references()
+        .all(|edge| *edge.weight() >= 0));
     assert_eq!(connected_components(&positive_edges), 2);
 
     let mut dfs = DfsPostOrder::new(&positive_edges, n(0));
-    while let Some(_) = dfs.next(&positive_edges) { }
+    while let Some(_) = dfs.next(&positive_edges) {}
 
     let n = n::<u32>;
     for node in &[n(0), n(1), n(2)] {
@@ -2116,37 +2220,79 @@
     let doms = dominators::simple_fast(&graph, r);
 
     assert_eq!(doms.root(), r);
-    assert_eq!(doms.immediate_dominator(r), None,
-               "The root node has no idom");
+    assert_eq!(
+        doms.immediate_dominator(r),
+        None,
+        "The root node has no idom"
+    );
 
-    assert_eq!(doms.immediate_dominator(a), Some(r),
-               "r is the immediate dominator of a");
-    assert_eq!(doms.immediate_dominator(b), Some(r),
-               "r is the immediate dominator of b");
-    assert_eq!(doms.immediate_dominator(c), Some(r),
-               "r is the immediate dominator of c");
-    assert_eq!(doms.immediate_dominator(f), Some(c),
-               "c is the immediate dominator of f");
-    assert_eq!(doms.immediate_dominator(g), Some(c),
-               "c is the immediate dominator of g");
-    assert_eq!(doms.immediate_dominator(j), Some(g),
-               "g is the immediate dominator of j");
-    assert_eq!(doms.immediate_dominator(d), Some(r),
-               "r is the immediate dominator of d");
-    assert_eq!(doms.immediate_dominator(l), Some(d),
-               "d is the immediate dominator of l");
-    assert_eq!(doms.immediate_dominator(e), Some(r),
-               "r is the immediate dominator of e");
-    assert_eq!(doms.immediate_dominator(i), Some(r),
-               "r is the immediate dominator of i");
-    assert_eq!(doms.immediate_dominator(k), Some(r),
-               "r is the immediate dominator of k");
-    assert_eq!(doms.immediate_dominator(h), Some(r),
-               "r is the immediate dominator of h");
+    assert_eq!(
+        doms.immediate_dominator(a),
+        Some(r),
+        "r is the immediate dominator of a"
+    );
+    assert_eq!(
+        doms.immediate_dominator(b),
+        Some(r),
+        "r is the immediate dominator of b"
+    );
+    assert_eq!(
+        doms.immediate_dominator(c),
+        Some(r),
+        "r is the immediate dominator of c"
+    );
+    assert_eq!(
+        doms.immediate_dominator(f),
+        Some(c),
+        "c is the immediate dominator of f"
+    );
+    assert_eq!(
+        doms.immediate_dominator(g),
+        Some(c),
+        "c is the immediate dominator of g"
+    );
+    assert_eq!(
+        doms.immediate_dominator(j),
+        Some(g),
+        "g is the immediate dominator of j"
+    );
+    assert_eq!(
+        doms.immediate_dominator(d),
+        Some(r),
+        "r is the immediate dominator of d"
+    );
+    assert_eq!(
+        doms.immediate_dominator(l),
+        Some(d),
+        "d is the immediate dominator of l"
+    );
+    assert_eq!(
+        doms.immediate_dominator(e),
+        Some(r),
+        "r is the immediate dominator of e"
+    );
+    assert_eq!(
+        doms.immediate_dominator(i),
+        Some(r),
+        "r is the immediate dominator of i"
+    );
+    assert_eq!(
+        doms.immediate_dominator(k),
+        Some(r),
+        "r is the immediate dominator of k"
+    );
+    assert_eq!(
+        doms.immediate_dominator(h),
+        Some(r),
+        "r is the immediate dominator of h"
+    );
 
     let mut graph = graph.clone();
     let z = graph.add_node("z");
     let doms = dominators::simple_fast(&graph, r);
-    assert_eq!(doms.immediate_dominator(z), None,
-               "nodes that aren't reachable from the root do not have an idom");
+    assert_eq!(
+        doms.immediate_dominator(z),
+        None,
+        "nodes that aren't reachable from the root do not have an idom"
+    );
 }
diff --git a/tests/graphmap.rs b/tests/graphmap.rs
index c8fbeed..6891cf7 100644
--- a/tests/graphmap.rs
+++ b/tests/graphmap.rs
@@ -5,11 +5,11 @@
 use std::fmt;
 
 use petgraph::prelude::*;
-use petgraph::visit::{ Walker, };
+use petgraph::visit::Walker;
 
-use petgraph::algo::{ dijkstra, };
+use petgraph::algo::dijkstra;
 
-use petgraph::dot::{Dot, Config};
+use petgraph::dot::{Config, Dot};
 
 #[test]
 fn simple() {
@@ -47,13 +47,21 @@
     let scores = dijkstra(&gr, a, None, |e| *e.weight());
     let mut scores: Vec<_> = scores.into_iter().collect();
     scores.sort();
-    assert_eq!(scores,
-       vec![("A", 0), ("B", 7), ("C", 9), ("D", 11), ("E", 20), ("F", 20)]);
+    assert_eq!(
+        scores,
+        vec![
+            ("A", 0),
+            ("B", 7),
+            ("C", 9),
+            ("D", 11),
+            ("E", 20),
+            ("F", 20)
+        ]
+    );
 }
 
 #[test]
-fn remov()
-{
+fn remov() {
     let mut g = UnGraphMap::new();
     g.add_node(1);
     g.add_node(2);
@@ -75,8 +83,7 @@
 }
 
 #[test]
-fn remove_directed()
-{
+fn remove_directed() {
     let mut g = GraphMap::<_, _, Directed>::with_capacity(0, 0);
     g.add_edge(1, 2, -1);
     println!("{:?}", g);
@@ -118,13 +125,17 @@
     {
         let mut cnt = 0;
         let mut dfs = Dfs::new(&gr, h);
-        while let Some(_) = dfs.next(&gr) { cnt += 1; }
+        while let Some(_) = dfs.next(&gr) {
+            cnt += 1;
+        }
         assert_eq!(cnt, 4);
     }
     {
         let mut cnt = 0;
         let mut dfs = Dfs::new(&gr, z);
-        while let Some(_) = dfs.next(&gr) { cnt += 1; }
+        while let Some(_) = dfs.next(&gr) {
+            cnt += 1;
+        }
         assert_eq!(cnt, 1);
     }
 
@@ -146,30 +157,28 @@
     gr.add_edge(i, k, 4);
 
     let real_edges: HashSet<_> = gr.all_edges().map(|(a, b, &w)| (a, b, w)).collect();
-    let expected_edges: HashSet<_> = vec![
-        ("H", "I", 1),
-        ("H", "J", 2),
-        ("I", "J", 3),
-        ("I", "K", 4)
-    ].into_iter().collect();
+    let expected_edges: HashSet<_> =
+        vec![("H", "I", 1), ("H", "J", 2), ("I", "J", 3), ("I", "K", 4)]
+            .into_iter()
+            .collect();
 
     assert_eq!(real_edges, expected_edges);
 }
 
 #[test]
 fn from_edges() {
-    let gr = GraphMap::<_, _, Undirected>::from_edges(&[
-        ("a", "b", 1),
-        ("a", "c", 2),
-        ("c", "d", 3),
-    ]);
+    let gr =
+        GraphMap::<_, _, Undirected>::from_edges(&[("a", "b", 1), ("a", "c", 2), ("c", "d", 3)]);
     assert_eq!(gr.node_count(), 4);
     assert_eq!(gr.edge_count(), 3);
     assert_eq!(gr[("a", "c")], 2);
 
     let gr = GraphMap::<_, (), Undirected>::from_edges(&[
-        (0, 1), (0, 2), (0, 3),
-        (1, 2), (1, 3),
+        (0, 1),
+        (0, 2),
+        (0, 3),
+        (1, 2),
+        (1, 3),
         (2, 3),
     ]);
     assert_eq!(gr.node_count(), 4);
@@ -182,7 +191,6 @@
     println!("{:?}", Dot::with_config(&gr, &[Config::EdgeNoLabel]));
 }
 
-
 #[test]
 fn graphmap_directed() {
     //let root = TypedArena::<Node<_>>::new();
@@ -193,15 +201,7 @@
     let c = gr.add_node("C");
     let d = gr.add_node("D");
     let e = gr.add_node("E");
-    let edges = [
-        (a, b),
-        (a, c),
-        (a, d),
-        (b, c),
-        (c, d),
-        (d, e),
-        (b, b),
-    ];
+    let edges = [(a, b), (a, c), (a, d), (b, c), (c, d), (d, e), (b, b)];
     gr.extend(&edges);
 
     // Add reverse edges -- ok!
@@ -215,7 +215,8 @@
 }
 
 fn assert_sccs_eq<N>(mut res: Vec<Vec<N>>, mut answer: Vec<Vec<N>>)
-    where N: Ord + fmt::Debug,
+where
+    N: Ord + fmt::Debug,
 {
     // normalize the result and compare with the answer.
     for scc in &mut res {
@@ -242,13 +243,13 @@
         (7, 5, 7),
         (1, 7, 8),
         (7, 4, 9),
-        (4, 1, 10)]);
-
-    assert_sccs_eq(petgraph::algo::kosaraju_scc(&gr), vec![
-        vec![0, 3, 6],
-        vec![1, 4, 7],
-        vec![2, 5, 8],
+        (4, 1, 10),
     ]);
+
+    assert_sccs_eq(
+        petgraph::algo::kosaraju_scc(&gr),
+        vec![vec![0, 3, 6], vec![1, 4, 7], vec![2, 5, 8]],
+    );
 }
 
 #[test]
@@ -264,7 +265,8 @@
         (7, 5, 7),
         (1, 7, 8),
         (7, 4, 9),
-        (4, 1, 10)]);
+        (4, 1, 10),
+    ]);
 
     let graph: Graph<_, _, _> = gr.clone().into_graph();
     println!("{}", Dot::new(&gr));
@@ -283,11 +285,8 @@
 #[test]
 fn test_all_edges_mut() {
     // graph with edge weights equal to in+out
-    let mut graph: GraphMap<_, u32, Directed> = GraphMap::from_edges(&[
-        (0, 1, 1),
-        (1, 2, 3),
-        (2, 0, 2),
-    ]);
+    let mut graph: GraphMap<_, u32, Directed> =
+        GraphMap::from_edges(&[(0, 1, 1), (1, 2, 3), (2, 0, 2)]);
 
     // change it so edge weight is equal to 2 * (in+out)
     for (start, end, weight) in graph.all_edges_mut() {
diff --git a/tests/iso.rs b/tests/iso.rs
index 539e81b..2ddeb52 100644
--- a/tests/iso.rs
+++ b/tests/iso.rs
@@ -3,19 +3,11 @@
 use std::fs::File;
 use std::io::prelude::*;
 
+use petgraph::graph::{edge_index, node_index};
 use petgraph::prelude::*;
-use petgraph::{
-    EdgeType,
-};
-use petgraph::graph::{
-    node_index,
-    edge_index,
-};
+use petgraph::EdgeType;
 
-use petgraph::algo::{
-    is_isomorphic,
-    is_isomorphic_matching,
-};
+use petgraph::algo::{is_isomorphic, is_isomorphic_matching};
 
 /// Petersen A and B are isomorphic
 ///
@@ -208,16 +200,12 @@
 ";
 
 /// Parse a text adjacency matrix format into a directed graph
-fn parse_graph<Ty: EdgeType>(s: &str) -> Graph<(), (), Ty>
-{
+fn parse_graph<Ty: EdgeType>(s: &str) -> Graph<(), (), Ty> {
     let mut gr = Graph::with_capacity(0, 0);
     let s = s.trim();
     let lines = s.lines().filter(|l| !l.is_empty());
     for (row, line) in lines.enumerate() {
-        for (col, word) in line.split(' ')
-                                .filter(|s| !s.is_empty())
-                                .enumerate()
-        {
+        for (col, word) in line.split(' ').filter(|s| !s.is_empty()).enumerate() {
             let has_edge = word.parse::<i32>().unwrap();
             assert!(has_edge == 0 || has_edge == 1);
             if has_edge == 0 {
@@ -241,11 +229,11 @@
 }
 
 /// Parse a file in adjacency matrix format into a directed graph
-fn graph_from_file(path: &str) -> Graph<(), (), Directed>
-{
+fn graph_from_file(path: &str) -> Graph<(), (), Directed> {
     let mut f = File::open(path).expect("file not found");
     let mut contents = String::new();
-    f.read_to_string(&mut contents).expect("failed to read from file");
+    f.read_to_string(&mut contents)
+        .expect("failed to read from file");
     parse_graph(&contents)
 }
 
@@ -269,8 +257,7 @@
 */
 
 #[test]
-fn petersen_iso()
-{
+fn petersen_iso() {
     // The correct isomorphism is
     // 0 => 0, 1 => 3, 2 => 1, 3 => 4, 5 => 2, 6 => 5, 7 => 7, 8 => 6, 9 => 8, 4 => 9
     let peta = str_to_digraph(PETERSEN_A);
@@ -286,8 +273,7 @@
 }
 
 #[test]
-fn petersen_undir_iso()
-{
+fn petersen_undir_iso() {
     // The correct isomorphism is
     // 0 => 0, 1 => 3, 2 => 1, 3 => 4, 5 => 2, 6 => 5, 7 => 7, 8 => 6, 9 => 8, 4 => 9
     let peta = str_to_digraph(PETERSEN_A);
@@ -297,8 +283,7 @@
 }
 
 #[test]
-fn full_iso()
-{
+fn full_iso() {
     let a = str_to_graph(FULL_A);
     let b = str_to_graph(FULL_B);
 
@@ -306,8 +291,7 @@
 }
 
 #[test]
-fn praust_dir_no_iso()
-{
+fn praust_dir_no_iso() {
     let a = str_to_digraph(PRAUST_A);
     let b = str_to_digraph(PRAUST_B);
 
@@ -315,8 +299,7 @@
 }
 
 #[test]
-fn praust_undir_no_iso()
-{
+fn praust_undir_no_iso() {
     let a = str_to_graph(PRAUST_A);
     let b = str_to_graph(PRAUST_B);
 
@@ -324,8 +307,7 @@
 }
 
 #[test]
-fn coxeter_di_iso()
-{
+fn coxeter_di_iso() {
     // The correct isomorphism is
     let a = str_to_digraph(COXETER_A);
     let b = str_to_digraph(COXETER_B);
@@ -333,8 +315,7 @@
 }
 
 #[test]
-fn coxeter_undi_iso()
-{
+fn coxeter_undi_iso() {
     // The correct isomorphism is
     let a = str_to_graph(COXETER_A);
     let b = str_to_graph(COXETER_B);
@@ -342,40 +323,35 @@
 }
 
 #[test]
-fn g14_dir_not_iso()
-{
+fn g14_dir_not_iso() {
     let a = str_to_digraph(G1D);
     let b = str_to_digraph(G4D);
     assert!(!petgraph::algo::is_isomorphic(&a, &b));
 }
 
 #[test]
-fn g14_undir_not_iso()
-{
+fn g14_undir_not_iso() {
     let a = str_to_digraph(G1U);
     let b = str_to_digraph(G4U);
     assert!(!petgraph::algo::is_isomorphic(&a, &b));
 }
 
 #[test]
-fn g12_undir_iso()
-{
+fn g12_undir_iso() {
     let a = str_to_digraph(G1U);
     let b = str_to_digraph(G2U);
     assert!(petgraph::algo::is_isomorphic(&a, &b));
 }
 
 #[test]
-fn g3_not_iso()
-{
+fn g3_not_iso() {
     let a = str_to_digraph(G3_1);
     let b = str_to_digraph(G3_2);
     assert!(!petgraph::algo::is_isomorphic(&a, &b));
 }
 
 #[test]
-fn g8_not_iso()
-{
+fn g8_not_iso() {
     let a = str_to_digraph(G8_1);
     let b = str_to_digraph(G8_2);
     assert_eq!(a.edge_count(), b.edge_count());
@@ -384,8 +360,7 @@
 }
 
 #[test]
-fn s12_not_iso()
-{
+fn s12_not_iso() {
     let a = str_to_digraph(S1);
     let b = str_to_digraph(S2);
     assert_eq!(a.edge_count(), b.edge_count());
@@ -394,8 +369,7 @@
 }
 
 #[test]
-fn iso1()
-{
+fn iso1() {
     let mut g0 = Graph::<_, ()>::new();
     let mut g1 = Graph::<_, ()>::new();
     assert!(petgraph::algo::is_isomorphic(&g0, &g1));
@@ -418,8 +392,7 @@
 }
 
 #[test]
-fn iso2()
-{
+fn iso2() {
     let mut g0 = Graph::<_, ()>::new();
     let mut g1 = Graph::<_, ()>::new();
 
@@ -467,19 +440,24 @@
 
 #[test]
 fn iso_matching() {
-    let g0 = Graph::<(), _>::from_edges(&[
-        (0, 0, 1),
-        (0, 1, 2),
-        (0, 2, 3),
-        (1, 2, 4),
-    ]);
+    let g0 = Graph::<(), _>::from_edges(&[(0, 0, 1), (0, 1, 2), (0, 2, 3), (1, 2, 4)]);
 
     let mut g1 = g0.clone();
     g1[edge_index(0)] = 0;
-    assert!(!is_isomorphic_matching(&g0, &g1, |x, y| x == y, |x, y| x == y));
+    assert!(!is_isomorphic_matching(
+        &g0,
+        &g1,
+        |x, y| x == y,
+        |x, y| x == y
+    ));
     let mut g2 = g0.clone();
     g2[edge_index(1)] = 0;
-    assert!(!is_isomorphic_matching(&g0, &g2, |x, y| x == y, |x, y| x == y));
+    assert!(!is_isomorphic_matching(
+        &g0,
+        &g2,
+        |x, y| x == y,
+        |x, y| x == y
+    ));
 }
 
 #[test]
@@ -501,27 +479,12 @@
 #[should_panic]
 #[test]
 fn iso_multigraph_failure() {
-    let g0 = Graph::<(), ()>::from_edges(&[
-        (0, 0),
-        (0, 0),
-        (0, 1),
-        (1, 1),
-        (1, 1),
-        (1, 0),
-    ]);
+    let g0 = Graph::<(), ()>::from_edges(&[(0, 0), (0, 0), (0, 1), (1, 1), (1, 1), (1, 0)]);
 
-    let g1 = Graph::<(), ()>::from_edges(&[
-        (0, 0),
-        (0, 1),
-        (0, 1),
-        (1, 1),
-        (1, 0),
-        (1, 0),
-    ]);
+    let g1 = Graph::<(), ()>::from_edges(&[(0, 0), (0, 1), (0, 1), (1, 1), (1, 0), (1, 0)]);
     assert!(!is_isomorphic(&g0, &g1));
 }
 
-
 /// Isomorphic pair
 const COXETER_A: &str = "
  0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 
@@ -588,4 +551,3 @@
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 
  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0
 ";
-
diff --git a/tests/quickcheck.rs b/tests/quickcheck.rs
index 2831a2d..f95eb1c 100644
--- a/tests/quickcheck.rs
+++ b/tests/quickcheck.rs
@@ -1,11 +1,13 @@
-#![cfg(feature="quickcheck")]
-#[macro_use] extern crate quickcheck;
-extern crate rand;
+#![cfg(feature = "quickcheck")]
+#[macro_use]
+extern crate quickcheck;
 extern crate petgraph;
-#[macro_use] extern crate defmac;
+extern crate rand;
+#[macro_use]
+extern crate defmac;
 
-extern crate odds;
 extern crate itertools;
+extern crate odds;
 
 mod utils;
 
@@ -15,45 +17,29 @@
 use std::collections::HashSet;
 use std::hash::Hash;
 
-use rand::Rng;
 use itertools::assert_equal;
 use itertools::cloned;
+use rand::Rng;
 
-use petgraph::prelude::*;
-use petgraph::{
-    EdgeType, 
-};
-use petgraph::dot::{Dot, Config};
 use petgraph::algo::{
-    condensation,
-    min_spanning_tree,
-    is_cyclic_undirected,
-    is_cyclic_directed,
-    is_isomorphic,
-    is_isomorphic_matching,
-    toposort,
-    kosaraju_scc,
-    tarjan_scc,
-    dijkstra,
-    bellman_ford,
-};
-use petgraph::visit::{Topo, Reversed};
-use petgraph::visit::{
-    IntoNodeReferences,
-    IntoEdgeReferences,
-    NodeIndexable,
-    EdgeRef,
+    bellman_ford, condensation, dijkstra, is_cyclic_directed, is_cyclic_undirected, is_isomorphic,
+    is_isomorphic_matching, kosaraju_scc, min_spanning_tree, tarjan_scc, toposort,
 };
 use petgraph::data::FromElements;
-use petgraph::graph::{IndexType, node_index, edge_index};
-use petgraph::graphmap::{
-    NodeTrait,
-};
+use petgraph::dot::{Config, Dot};
+use petgraph::graph::{edge_index, node_index, IndexType};
+use petgraph::graphmap::NodeTrait;
+use petgraph::prelude::*;
+use petgraph::visit::{EdgeRef, IntoEdgeReferences, IntoNodeReferences, NodeIndexable};
+use petgraph::visit::{Reversed, Topo};
+use petgraph::EdgeType;
 
 fn mst_graph<N, E, Ty, Ix>(g: &Graph<N, E, Ty, Ix>) -> Graph<N, E, Undirected, Ix>
-    where Ty: EdgeType,
-          Ix: IndexType,
-          N: Clone, E: Clone + PartialOrd,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
+    N: Clone,
+    E: Clone + PartialOrd,
 {
     Graph::from_elements(min_spanning_tree(&g))
 }
@@ -101,34 +87,43 @@
 }
 
 fn assert_graph_consistent<N, E, Ty, Ix>(g: &Graph<N, E, Ty, Ix>)
-    where Ty: EdgeType,
-          Ix: IndexType,
+where
+    Ty: EdgeType,
+    Ix: IndexType,
 {
     assert_eq!(g.node_count(), g.node_indices().count());
     assert_eq!(g.edge_count(), g.edge_indices().count());
     for edge in g.raw_edges() {
-        assert!(g.find_edge(edge.source(), edge.target()).is_some(),
-                "Edge not in graph! {:?} to {:?}", edge.source(), edge.target());
+        assert!(
+            g.find_edge(edge.source(), edge.target()).is_some(),
+            "Edge not in graph! {:?} to {:?}",
+            edge.source(),
+            edge.target()
+        );
     }
 }
 
 #[test]
 fn reverse_directed() {
     fn prop<Ty: EdgeType>(mut g: Graph<(), (), Ty>) -> bool {
-        let node_outdegrees = g.node_indices()
-                                .map(|i| g.neighbors_directed(i, Outgoing).count())
-                                .collect::<Vec<_>>();
-        let node_indegrees = g.node_indices()
-                                .map(|i| g.neighbors_directed(i, Incoming).count())
-                                .collect::<Vec<_>>();
+        let node_outdegrees = g
+            .node_indices()
+            .map(|i| g.neighbors_directed(i, Outgoing).count())
+            .collect::<Vec<_>>();
+        let node_indegrees = g
+            .node_indices()
+            .map(|i| g.neighbors_directed(i, Incoming).count())
+            .collect::<Vec<_>>();
 
         g.reverse();
-        let new_outdegrees = g.node_indices()
-                                .map(|i| g.neighbors_directed(i, Outgoing).count())
-                                .collect::<Vec<_>>();
-        let new_indegrees = g.node_indices()
-                                .map(|i| g.neighbors_directed(i, Incoming).count())
-                                .collect::<Vec<_>>();
+        let new_outdegrees = g
+            .node_indices()
+            .map(|i| g.neighbors_directed(i, Outgoing).count())
+            .collect::<Vec<_>>();
+        let new_indegrees = g
+            .node_indices()
+            .map(|i| g.neighbors_directed(i, Incoming).count())
+            .collect::<Vec<_>>();
         assert_eq!(node_outdegrees, new_indegrees);
         assert_eq!(node_indegrees, new_outdegrees);
         assert_graph_consistent(&g);
@@ -160,14 +155,21 @@
         assert_eq!(num_pos_post, g.node_count());
 
         // check against filter_map
-        let filtered = og.filter_map(|_, w| if *w >= 0 { Some(*w) } else { None },
-                                     |_, w| Some(*w));
+        let filtered = og.filter_map(
+            |_, w| if *w >= 0 { Some(*w) } else { None },
+            |_, w| Some(*w),
+        );
         assert_eq!(g.node_count(), filtered.node_count());
         /*
         println!("Iso of graph with nodes={}, edges={}",
                  g.node_count(), g.edge_count());
                  */
-        assert!(is_isomorphic_matching(&filtered, &g, PartialEq::eq, PartialEq::eq));
+        assert!(is_isomorphic_matching(
+            &filtered,
+            &g,
+            PartialEq::eq,
+            PartialEq::eq
+        ));
 
         true
     }
@@ -200,7 +202,8 @@
             // check against filter_map
             let filtered = og.filter_map(
                 |_, w| Some(*w),
-                |_, w| if *w >= 0 { Some(*w) } else { None });
+                |_, w| if *w >= 0 { Some(*w) } else { None },
+            );
             assert_eq!(g.node_count(), filtered.node_count());
             assert!(is_isomorphic(&filtered, &g));
         }
@@ -235,7 +238,8 @@
             // check against filter_map
             let filtered = og.filter_map(
                 |_, w| Some(*w),
-                |_, w| if *w >= 0 { Some(*w) } else { None });
+                |_, w| if *w >= 0 { Some(*w) } else { None },
+            );
             assert_eq!(g.node_count(), filtered.node_count());
         }
         true
@@ -267,14 +271,17 @@
             // Add edges
             for i in g.edge_indices() {
                 let (s, t) = g.edge_endpoints(i).unwrap();
-                ng.add_edge(map[s.index()],
-                            map[t.index()],
-                            g[i]);
+                ng.add_edge(map[s.index()], map[t.index()], g[i]);
             }
             if g.node_count() < 20 && g.edge_count() < 50 {
                 assert!(is_isomorphic(&g, &ng));
             }
-            assert!(is_isomorphic_matching(&g, &ng, PartialEq::eq, PartialEq::eq));
+            assert!(is_isomorphic_matching(
+                &g,
+                &ng,
+                PartialEq::eq,
+                PartialEq::eq
+            ));
         }
         true
     }
@@ -297,9 +304,19 @@
             ng[j] = (g[j] == 0) as i8;
         }
         if i.index() < g.node_count() || j.index() < g.edge_count() {
-            assert!(!is_isomorphic_matching(&g, &ng, PartialEq::eq, PartialEq::eq));
+            assert!(!is_isomorphic_matching(
+                &g,
+                &ng,
+                PartialEq::eq,
+                PartialEq::eq
+            ));
         } else {
-            assert!(is_isomorphic_matching(&g, &ng, PartialEq::eq, PartialEq::eq));
+            assert!(is_isomorphic_matching(
+                &g,
+                &ng,
+                PartialEq::eq,
+                PartialEq::eq
+            ));
         }
         true
     }
@@ -378,7 +395,12 @@
                 assert!(g.remove_edge(ex).is_some());
             }
             //assert_graph_consistent(&g);
-            assert!(g.find_edge(a, b).is_none(), "failed to remove edge {:?} from graph {:?}", (a, b), g);
+            assert!(
+                g.find_edge(a, b).is_none(),
+                "failed to remove edge {:?} from graph {:?}",
+                (a, b),
+                g
+            );
             assert!(g.neighbors(a).find(|x| *x == b).is_none());
             if !g.is_directed() {
                 assert!(g.find_edge(b, a).is_none());
@@ -392,17 +414,30 @@
 }
 
 fn assert_graphmap_consistent<N, E, Ty>(g: &GraphMap<N, E, Ty>)
-    where Ty: EdgeType,
-          N: NodeTrait + fmt::Debug,
+where
+    Ty: EdgeType,
+    N: NodeTrait + fmt::Debug,
 {
     for (a, b, _weight) in g.all_edges() {
-        assert!(g.contains_edge(a, b),
-                "Edge not in graph! {:?} to {:?}", a, b);
-        assert!(g.neighbors(a).find(|x| *x == b).is_some(),
-                "Edge {:?} not in neighbor list for {:?}", (a, b), a);
+        assert!(
+            g.contains_edge(a, b),
+            "Edge not in graph! {:?} to {:?}",
+            a,
+            b
+        );
+        assert!(
+            g.neighbors(a).find(|x| *x == b).is_some(),
+            "Edge {:?} not in neighbor list for {:?}",
+            (a, b),
+            a
+        );
         if !g.is_directed() {
-            assert!(g.neighbors(b).find(|x| *x == a).is_some(),
-                    "Edge {:?} not in neighbor list for {:?}", (b, a), b);
+            assert!(
+                g.neighbors(b).find(|x| *x == a).is_some(),
+                "Edge {:?} not in neighbor list for {:?}",
+                (b, a),
+                b
+            );
         }
     }
 }
@@ -417,9 +452,8 @@
             assert_eq!(contains, g.contains_edge(b, a));
         }
         assert_eq!(g.remove_edge(a, b).is_some(), contains);
-        assert!(!g.contains_edge(a, b) &&
-            g.neighbors(a).find(|x| *x == b).is_none());
-            //(g.is_directed() || g.neighbors(b).find(|x| *x == a).is_none()));
+        assert!(!g.contains_edge(a, b) && g.neighbors(a).find(|x| *x == b).is_none());
+        //(g.is_directed() || g.neighbors(b).find(|x| *x == a).is_none()));
         assert!(g.remove_edge(a, b).is_none());
         assert_graphmap_consistent(&g);
         true
@@ -433,9 +467,9 @@
     fn prop(mut g: UnGraphMap<i8, ()>, a: i8, b: i8) -> bool {
         assert_eq!(g.contains_edge(a, b), g.add_edge(a, b, ()).is_some());
         g.remove_edge(a, b);
-        !g.contains_edge(a, b) &&
-            g.neighbors(a).find(|x| *x == b).is_none() &&
-            g.neighbors(b).find(|x| *x == a).is_none()
+        !g.contains_edge(a, b)
+            && g.neighbors(a).find(|x| *x == b).is_none()
+            && g.neighbors(b).find(|x| *x == a).is_none()
     }
     quickcheck::quickcheck(prop as fn(_, _, _) -> bool);
 }
@@ -481,7 +515,6 @@
     }
 }
 
-
 quickcheck! {
     // Reversed edges gives the same sccs (when sorted)
     fn graph_reverse_sccs(g: Graph<(), ()>) -> bool {
@@ -565,17 +598,18 @@
 
     // shrink the graph by splitting it in two by a very
     // simple algorithm, just even and odd node indices
-    fn shrink(&self) -> Box<dyn Iterator<Item=Self>> {
+    fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
         let self_ = self.clone();
         Box::new((0..2).filter_map(move |x| {
-            let gr = self_.0.filter_map(|i, w| {
-                if i.index() % 2 == x {
-                    Some(w.clone())
-                } else {
-                    None
-                }
-            },
-            |_, w| Some(w.clone())
+            let gr = self_.0.filter_map(
+                |i, w| {
+                    if i.index() % 2 == x {
+                        Some(w.clone())
+                    } else {
+                        None
+                    }
+                },
+                |_, w| Some(w.clone()),
             );
             // make sure we shrink
             if gr.node_count() < self_.0.node_count() {
@@ -589,7 +623,11 @@
 
 fn is_topo_order<N>(gr: &Graph<N, (), Directed>, order: &[NodeIndex]) -> bool {
     if gr.node_count() != order.len() {
-        println!("Graph ({}) and count ({}) had different amount of nodes.", gr.node_count(), order.len());
+        println!(
+            "Graph ({}) and count ({}) had different amount of nodes.",
+            gr.node_count(),
+            order.len()
+        );
         return false;
     }
     // check all the edges of the graph
@@ -606,10 +644,13 @@
     true
 }
 
-
 fn subset_is_topo_order<N>(gr: &Graph<N, (), Directed>, order: &[NodeIndex]) -> bool {
     if gr.node_count() < order.len() {
-        println!("Graph (len={}) had less nodes than order (len={})", gr.node_count(), order.len());
+        println!(
+            "Graph (len={}) had less nodes than order (len={})",
+            gr.node_count(),
+            order.len()
+        );
         return false;
     }
     // check all the edges of the graph
@@ -711,13 +752,13 @@
 }
 
 fn set<I>(iter: I) -> HashSet<I::Item>
-    where I: IntoIterator,
-          I::Item: Hash + Eq,
+where
+    I: IntoIterator,
+    I::Item: Hash + Eq,
 {
     iter.into_iter().collect()
 }
 
-
 quickcheck! {
     fn dfs_visit(gr: Graph<(), ()>, node: usize) -> bool {
         use petgraph::visit::{Visitable, VisitMap};
diff --git a/tests/stable_graph.rs b/tests/stable_graph.rs
index 8645865..9ac401e 100644
--- a/tests/stable_graph.rs
+++ b/tests/stable_graph.rs
@@ -1,20 +1,17 @@
 #![cfg(feature = "stable_graph")]
 
-extern crate petgraph;
 extern crate itertools;
-#[macro_use] extern crate defmac;
+extern crate petgraph;
+#[macro_use]
+extern crate defmac;
 
+use itertools::assert_equal;
+use petgraph::algo::{kosaraju_scc, min_spanning_tree, tarjan_scc};
+use petgraph::dot::Dot;
 use petgraph::prelude::*;
 use petgraph::stable_graph::node_index as n;
+use petgraph::visit::{IntoEdgeReferences, IntoNodeReferences, NodeIndexable};
 use petgraph::EdgeType;
-use petgraph::algo::{kosaraju_scc, tarjan_scc, min_spanning_tree};
-use petgraph::visit::{
-    NodeIndexable,
-    IntoNodeReferences,
-    IntoEdgeReferences,
-};
-use petgraph::dot::Dot;
-use itertools::assert_equal;
 
 #[test]
 fn node_indices() {
@@ -72,11 +69,15 @@
         (6, 0),
         (0, 3),
         (3, 6),
-        (8, 6), (8, 2),
-        (2, 5), (5, 8), (7, 5),
+        (8, 6),
+        (8, 2),
+        (2, 5),
+        (5, 8),
+        (7, 5),
         (1, 7),
         (7, 4),
-        (4, 1)]);
+        (4, 1),
+    ]);
     // make an identical replacement of n(4) and leave a hole
     let x = gr.add_node(());
     gr.add_edge(n(7), x, ());
@@ -91,28 +92,34 @@
     println!("{:?}", gr);
 
     let x = n(gr.node_bound() - 1);
-    assert_sccs_eq(kosaraju_scc(&gr), vec![
-        vec![n(0), n(3), n(6)],
-        vec![n(1), n(7),   x ],
-        vec![n(2), n(5), n(8)],
-    ]);
+    assert_sccs_eq(
+        kosaraju_scc(&gr),
+        vec![
+            vec![n(0), n(3), n(6)],
+            vec![n(1), n(7), x],
+            vec![n(2), n(5), n(8)],
+        ],
+    );
 }
 
-
 #[test]
 fn test_tarjan_scc() {
     let gr = scc_graph();
 
     let x = n(gr.node_bound() - 1);
-    assert_sccs_eq(tarjan_scc(&gr), vec![
-        vec![n(0), n(3), n(6)],
-        vec![n(1), n(7),   x ],
-        vec![n(2), n(5), n(8)],
-    ]);
+    assert_sccs_eq(
+        tarjan_scc(&gr),
+        vec![
+            vec![n(0), n(3), n(6)],
+            vec![n(1), n(7), x],
+            vec![n(2), n(5), n(8)],
+        ],
+    );
 }
 
 fn make_graph<Ty>() -> StableGraph<(), i32, Ty>
-    where Ty: EdgeType,
+where
+    Ty: EdgeType,
 {
     let mut gr = StableGraph::default();
     let mut c = 0..;
@@ -129,7 +136,8 @@
         (1, 7, e()),
         (7, 4, e()),
         (8, 6, e()), // parallel edge
-        (4, 1, e())]);
+        (4, 1, e()),
+    ]);
     // make an identical replacement of n(4) and leave a hole
     let x = gr.add_node(());
     gr.add_edge(n(7), x, e());
@@ -164,7 +172,10 @@
 fn test_edges_undirected() {
     let gr = make_graph::<Undirected>();
     let x = n(9);
-    assert_equal(edges!(gr, x), vec![(x, 16), (x, 14), (n(1), 13), (n(7), 12)]);
+    assert_equal(
+        edges!(gr, x),
+        vec![(x, 16), (x, 14), (n(1), 13), (n(7), 12)],
+    );
     assert_equal(edges!(gr, n(0)), vec![(n(3), 1)]);
     assert_equal(edges!(gr, n(4)), vec![]);
 }
@@ -173,11 +184,13 @@
 fn test_edge_iterators_directed() {
     let gr = make_graph::<Directed>();
     for i in gr.node_indices() {
-        itertools::assert_equal(
-            gr.edges_directed(i, Outgoing),
-            gr.edges(i));
+        itertools::assert_equal(gr.edges_directed(i, Outgoing), gr.edges(i));
         for edge in gr.edges_directed(i, Outgoing) {
-            assert_eq!(edge.source(), i, "outgoing edges should have a fixed source");
+            assert_eq!(
+                edge.source(),
+                i,
+                "outgoing edges should have a fixed source"
+            );
         }
     }
     let mut incoming = vec![Vec::new(); gr.node_bound()];
@@ -192,9 +205,14 @@
     for i in gr.node_indices() {
         itertools::assert_equal(
             gr.edges_directed(i, Incoming).map(|e| e.source()),
-            incoming[i.index()].iter().rev().cloned());
+            incoming[i.index()].iter().rev().cloned(),
+        );
         for edge in gr.edges_directed(i, Incoming) {
-            assert_eq!(edge.target(), i, "incoming edges should have a fixed target");
+            assert_eq!(
+                edge.target(),
+                i,
+                "incoming edges should have a fixed target"
+            );
         }
     }
 }
@@ -203,25 +221,29 @@
 fn test_edge_iterators_undir() {
     let gr = make_graph::<Undirected>();
     for i in gr.node_indices() {
-        itertools::assert_equal(
-            gr.edges_directed(i, Outgoing),
-            gr.edges(i));
+        itertools::assert_equal(gr.edges_directed(i, Outgoing), gr.edges(i));
         for edge in gr.edges_directed(i, Outgoing) {
-            assert_eq!(edge.source(), i, "outgoing edges should have a fixed source");
+            assert_eq!(
+                edge.source(),
+                i,
+                "outgoing edges should have a fixed source"
+            );
         }
     }
     for i in gr.node_indices() {
-        itertools::assert_equal(
-            gr.edges_directed(i, Incoming),
-            gr.edges(i));
+        itertools::assert_equal(gr.edges_directed(i, Incoming), gr.edges(i));
         for edge in gr.edges_directed(i, Incoming) {
-            assert_eq!(edge.target(), i, "incoming edges should have a fixed target");
+            assert_eq!(
+                edge.target(),
+                i,
+                "incoming edges should have a fixed target"
+            );
         }
     }
 }
 
 #[test]
-#[should_panic(expected="is not a node")]
+#[should_panic(expected = "is not a node")]
 fn add_edge_vacant() {
     let mut g = StableGraph::<_, _>::new();
     let a = g.add_node(0);
@@ -232,7 +254,7 @@
 }
 
 #[test]
-#[should_panic(expected="is not a node")]
+#[should_panic(expected = "is not a node")]
 fn add_edge_oob() {
     let mut g = StableGraph::<_, _>::new();
     let a = g.add_node(0);
@@ -245,9 +267,7 @@
 fn test_node_references() {
     let gr = scc_graph();
 
-    itertools::assert_equal(
-        gr.node_references().map(|(i, _)| i),
-        gr.node_indices());
+    itertools::assert_equal(gr.node_references().map(|(i, _)| i), gr.node_indices());
 }
 
 #[test]
@@ -257,40 +277,19 @@
     let b = g.add_node(1);
     let c = g.add_node(2);
     let d = g.add_node(3);
-    g.extend_with_edges(&[
-        (a, b, 1),
-        (a, c, 2),
-        (b, c, 3),
-        (c, c, 4),
-        (a, d, 5),
-    ]);
+    g.extend_with_edges(&[(a, b, 1), (a, c, 2), (b, c, 3), (c, c, 4), (a, d, 5)]);
     g.remove_node(b);
 
-    itertools::assert_equal(
-        g.neighbors(a),
-        vec![d, c],
-    );
-    itertools::assert_equal(
-        g.neighbors(c),
-        vec![c, a],
-    );
-    itertools::assert_equal(
-        g.neighbors(d),
-        vec![a],
-    );
+    itertools::assert_equal(g.neighbors(a), vec![d, c]);
+    itertools::assert_equal(g.neighbors(c), vec![c, a]);
+    itertools::assert_equal(g.neighbors(d), vec![a]);
 
     // the node that was removed
-    itertools::assert_equal(
-        g.neighbors(b),
-        vec![],
-    );
+    itertools::assert_equal(g.neighbors(b), vec![]);
 
     // remove one more
     g.remove_node(c);
-    itertools::assert_equal(
-        g.neighbors(c),
-        vec![],
-    );
+    itertools::assert_equal(g.neighbors(c), vec![]);
 }
 
 #[test]
@@ -301,14 +300,16 @@
     gr.add_edge(a, a, "10");
     gr.add_edge(a, b, "20");
     let dot_output = format!("{}", Dot::new(&gr));
-    assert_eq!(dot_output,
-r#"digraph {
+    assert_eq!(
+        dot_output,
+        r#"digraph {
     0 [label="x"]
     1 [label="y"]
     0 -> 0 [label="10"]
     0 -> 1 [label="20"]
 }
-"#);
+"#
+    );
 }
 
 defmac!(iter_eq a, b => a.eq(b));
@@ -355,8 +356,8 @@
     assert!(edges_eq!(gr5, ans));
 }
 
-use petgraph::stable_graph::StableGraph;
 use petgraph::data::FromElements;
+use petgraph::stable_graph::StableGraph;
 
 #[test]
 fn from_min_spanning_tree() {
@@ -372,5 +373,5 @@
     for i in 0..3 {
         let _ = g.remove_node(nodes[i]);
     }
-    let _ = StableGraph::<(),(),Undirected,usize>::from_elements(min_spanning_tree(&g));
+    let _ = StableGraph::<(), (), Undirected, usize>::from_elements(min_spanning_tree(&g));
 }
diff --git a/tests/unionfind.rs b/tests/unionfind.rs
index ff8a51f..8b54db7 100644
--- a/tests/unionfind.rs
+++ b/tests/unionfind.rs
@@ -1,9 +1,9 @@
-extern crate rand;
 extern crate petgraph;
+extern crate rand;
 
-use rand::{Rng, thread_rng, ChaChaRng, SeedableRng};
-use std::collections::HashSet;
 use petgraph::unionfind::UnionFind;
+use rand::{thread_rng, ChaChaRng, Rng, SeedableRng};
+use std::collections::HashSet;
 
 #[test]
 fn uf_test() {
@@ -90,8 +90,7 @@
 }
 
 #[test]
-fn labeling()
-{
+fn labeling() {
     let mut u = UnionFind::<u32>::new(48);
     for i in 0..24 {
         u.union(i + 1, i);
diff --git a/tests/utils/mod.rs b/tests/utils/mod.rs
index 09de454..95b9b37 100644
--- a/tests/utils/mod.rs
+++ b/tests/utils/mod.rs
@@ -1,5 +1,3 @@
-
-
 mod qc;
 
 pub use self::qc::*;
diff --git a/tests/utils/qc.rs b/tests/utils/qc.rs
index 2715ab1..f335625 100644
--- a/tests/utils/qc.rs
+++ b/tests/utils/qc.rs
@@ -1,4 +1,3 @@
-
 use quickcheck::{Arbitrary, Gen, StdGen};
 use std::ops::Deref;
 
@@ -8,19 +7,21 @@
 
 impl<T> Deref for Small<T> {
     type Target = T;
-    fn deref(&self) -> &T { &self.0 }
+    fn deref(&self) -> &T {
+        &self.0
+    }
 }
 
 impl<T> Arbitrary for Small<T>
-    where T: Arbitrary
+where
+    T: Arbitrary,
 {
     fn arbitrary<G: Gen>(g: &mut G) -> Self {
         let sz = g.size() / 2;
         Small(T::arbitrary(&mut StdGen::new(g, sz)))
     }
 
-    fn shrink(&self) -> Box<dyn Iterator<Item=Self>> {
+    fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
         Box::new((**self).shrink().map(Small))
     }
 }
-
