Monomorphized directed weighted graph traits



I’ve written a set of traits for a graph library, which should allow for monomorphization during compilation, so that multiple implementers can provide an efficient interface to their graphs.

It mainly features a set of types that are associated with the main graph type, which the compiler may use to monomorphize calls to trait methods.

In what ways might I improve the interface and lifetime “situation”?
Right now, essentially everything lives 'a long. Might this cause trouble down the road?

pub type VertexId = usize;

pub trait Vertex<'a, G: DirectedWeightedGraph<'a>>
    Self: 'a,
    fn id(&'a self) -> VertexId;
    fn adjacent(&'a self) -> G::AdjVertexIterT;
    fn edges(&self) -> G::AdjWeightedEdgeIterT;

pub trait WeightedEdge<'a, G: DirectedWeightedGraph<'a>> {
    fn source(&'a self) -> G::VertexT;
    fn target(&'a self) -> G::VertexT;
    fn weight(&self) -> &'a G::Weight;

pub trait Vertices<'a, G: DirectedWeightedGraph<'a>> {
    fn iter(&'a self) -> G::VertexIterT;
    fn by_id(&'a self, id: VertexId) -> Option<G::VertexT>;

pub trait DirectedWeightedGraph<'a>
    Self: 'a + Sized,
    type VertexT: Vertex<'a, Self> + 'a;
    type VerticesT: Vertices<'a, Self> + 'a;
    type VertexIterT: Iterator<Item = Self::VertexT> + 'a;
    type AdjVertexIterT: Iterator<Item = Self::VertexT> + 'a;
    type WeightedEdgeT: WeightedEdge<'a, Self>;
    type WeightedEdgeIterT: Iterator<Item = Self::WeightedEdgeT>;
    type AdjWeightedEdgeIterT: Iterator<Item = Self::WeightedEdgeT>;
    type Weight;

    fn vertices(&'a self) -> Self::VerticesT;
    fn edges(&'a self) -> Self::WeightedEdgeIterT;

Thanks a lot in advance, for any ideas, suggestions and your time!