-
Notifications
You must be signed in to change notification settings - Fork 2
/
tuple.rs
86 lines (62 loc) · 1.4 KB
/
tuple.rs
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
83
84
85
86
pub use markers::*;
pub use ops::*;
mod markers {
pub trait Tuple0 {}
impl Tuple0 for () {}
pub trait Tuple1 {}
impl<E0> Tuple1 for (E0,) {}
pub trait Tuple2 {}
impl<E0, E1> Tuple2 for (E0, E1) {}
pub trait Tuple3 {}
impl<E0, E1, E2> Tuple3 for (E0, E1, E2) {}
pub trait Tuple4 {}
impl<E0, E1, E2, E3> Tuple4 for (E0, E1, E2, E3) {}
}
mod ops {
pub trait Get0 {
type Output;
}
pub trait Get1 {
type Output;
}
pub trait Get2 {
type Output;
}
pub trait Get3 {
type Output;
}
// 1-tuple
impl<E0> Get0 for (E0,) {
type Output = E0;
}
// 2-tuple
impl<E0, E1> Get0 for (E0, E1) {
type Output = E0;
}
impl<E0, E1> Get1 for (E0, E1) {
type Output = E1;
}
// 3-tuple
impl<E0, E1, E2> Get0 for (E0, E1, E2) {
type Output = E0;
}
impl<E0, E1, E2> Get1 for (E0, E1, E2) {
type Output = E1;
}
impl<E0, E1, E2> Get2 for (E0, E1, E2) {
type Output = E2;
}
// 4-tuple
impl<E0, E1, E2, E3> Get0 for (E0, E1, E2, E3) {
type Output = E0;
}
impl<E0, E1, E2, E3> Get1 for (E0, E1, E2, E3) {
type Output = E1;
}
impl<E0, E1, E2, E3> Get2 for (E0, E1, E2, E3) {
type Output = E2;
}
impl<E0, E1, E2, E3> Get3 for (E0, E1, E2, E3) {
type Output = E3;
}
}