index_from_end/
into_index.rs

1use crate::*;
2
3pub trait IntoIndex<I> {
4    fn into_index(self, len: I) -> I;
5}
6
7impl IntoIndex<usize> for usize {
8    fn into_index(self, _: Self) -> Self {
9        self
10    }
11}
12
13impl<I> IntoIndex<I> for Len {
14
15    fn into_index(self, len: I) -> I {
16        len
17    }
18}
19
20impl IntoIndex<usize> for FromEnd {
21
22    fn into_index(self, len: usize) -> usize {
23        len - self.dist
24    }
25}
26
27impl IntoIndex<usize> for LenFrac {
28
29    fn into_index(self, len: usize) -> usize {
30        len * self.numer / self.denom
31    }
32}
33
34impl IntoIndex<usize> for FromFrac {
35
36    fn into_index(self, len: usize) -> usize {
37        let frac = len * self.numer / self.denom;
38        if self.offset > 0 {
39            frac + self.offset as usize
40        } else {
41            frac - (-self.offset) as usize
42        }
43    }
44}