rfcs icon indicating copy to clipboard operation
rfcs copied to clipboard

Move SliceIndex type parameter to parameters

Open SOF3 opened this issue 2 years ago • 3 comments

If I have a struct like this:

struct T1 {}
struct T2 {}

pub struct Aggregate {
    v1: Vec<T1>,
    v2: Vec<T2>,
}

impl Aggregate {
    pub fn compute<R>(&self, range: R) -> Option<u32> {
        for v in self.v1.get(range)? {
            output += v.compute();
        }
        for v in self.v2.get(range)? {
            output += v.compute();
        }
        Some(output)
    }
}

The type bound for R would need to be R: SliceIndex<[T1]> + SliceIndex<[T2]>, which exposes internal implementation details.

I propose moving the <T> in SliceIndex<T> to the methods and leverage GATs:

trait SliceIndex : Sized {
    type Output<T: ?Sized>: ?Sized;
    fn get<T: ?Sized>(self, slice: &T) -> Option<&Self::Output<T>>;
    fn get_mut<T: ?Sized>(self, slice: &mut T) -> Option<&mut Self::Output<T>>;
    // ...
}

SOF3 avatar Sep 05 '23 14:09 SOF3