Lifetime constraint verbosity on associated items


#1

In gfx-rs we have a Resources type with a bunch of associated types. Whatever works with gfx-rs in a backend-abstract way depends on R: Resources bound.

Now, there is a problem when one wants to have explicit lifetimes for anything that depends on R. Rust requires the bounds to also be applied to all associated types of R, even if some of them are not used, and Rust is not able to derive this constraint. We end up with this boilerplate in the where clause:

    R::Buffer: 'a,
    R::ArrayBuffer: 'a,
    R::Shader: 'a,
    R::Program: 'a,
    R::FrameBuffer: 'a,
    R::Surface: 'a,
    R::Texture: 'a,
    R::Sampler: 'a,

This file in gfx_scene has lots of examples, because this dependency propagates upwards, thus hammering our ability to build high-level abstractions.

Note-1: this has been reported on reddit earlier.

Note-2: Complaint from Layl - our user at the time - on IRC:

that really is not an acceptable solution
if every time I need to have a reference stored to something in gfx, I need to bring 8 bounds along

Note-3: the problem is not limited to our gfx::Resources, it’s just given as an example.