1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
macro_rules! e { ($e:expr) => {$e} }

macro_rules! match_index {
    ($n:expr, $this:expr, $($i:tt),*) => (
        match $n {
            $(
                e!($i) => Some(&e!($this . $i)),
            )*
            _ => None
        }
    )
}

macro_rules! impl_indexing {
    ($typ:ty, $($i:tt),*) => (
        impl <T> TupleIndexingExt<T> for $typ {
            fn get(&self, n: usize) -> Option<&T> {
                match_index!(n, self, $($i),*)
            }
        }
    )
}

pub trait TupleIndexingExt<T> {
    fn get(&self, n: usize) -> Option<&T>;
}

impl <T> TupleIndexingExt<T> for () {
    fn get(&self, _: usize) -> Option<&T> {
        None
    }
}

impl_indexing!(
    (T,),
    0
);

impl_indexing!(
    (T, T),
    0, 1
);

impl_indexing!(
    (T, T, T),
    0, 1, 2
);

impl_indexing!(
    (T, T, T, T),
    0, 1, 2, 3
);

impl_indexing!(
    (T, T, T, T, T),
    0, 1, 2, 3, 4
);

impl_indexing!(
    (T, T, T, T, T, T),
    0, 1, 2, 3, 4, 5
);

impl_indexing!(
    (T, T, T, T, T, T, T),
    0, 1, 2, 3, 4, 5, 6
);

impl_indexing!(
    (T, T, T, T, T, T, T, T),
    0, 1, 2, 3, 4, 5, 6, 7
);

impl_indexing!(
    (T, T, T, T, T, T, T, T, T),
    0, 1, 2, 3, 4, 5, 6, 7, 8
);

impl_indexing!(
    (T, T, T, T, T, T, T, T, T, T),
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9
);