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
mod zero_choice;
pub use zero_choice::*;
mod secrecy;
pub use secrecy::*;
mod point_type;
pub use point_type::*;
pub trait ChangeMark<T> {
type Out;
fn change_mark(item: T) -> Self::Out;
}
impl<T, A, B> ChangeMark<T> for (A, B)
where
A: ChangeMark<T>,
B: ChangeMark<<A as ChangeMark<T>>::Out>,
{
type Out = <B as ChangeMark<A::Out>>::Out;
fn change_mark(item: T) -> Self::Out {
B::change_mark(A::change_mark(item))
}
}
impl<T, A, B, C> ChangeMark<T> for (A, B, C)
where
A: ChangeMark<T>,
B: ChangeMark<<A as ChangeMark<T>>::Out>,
C: ChangeMark<<B as ChangeMark<<A as ChangeMark<T>>::Out>>::Out>,
{
type Out = C::Out;
fn change_mark(item: T) -> Self::Out {
C::change_mark(B::change_mark(A::change_mark(item)))
}
}
pub trait Mark: Sized {
fn mark<M: ChangeMark<Self>>(self) -> M::Out;
}
impl<T> Mark for T {
#[must_use]
fn mark<M: ChangeMark<Self>>(self) -> M::Out {
M::change_mark(self)
}
}