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
use crate::*;

impl<T> Set<T> for Option<T> {
    fn set(self, new_value: T) -> Self {
        self.map(|_| new_value)
    }
}

impl<T> Modify<T> for Option<T> {
    fn modify(self, f: impl FnOnce(T) -> T) -> Self {
        self.map(f)
    }
}

impl<LevelOne, LevelTwo>
SetSecond<LevelOne, LevelTwo>
for Option<LevelOne>
    where LevelOne: Set<LevelTwo> {}

impl<LevelOne, LevelTwo, LevelThree>
SetThird<LevelOne, LevelTwo, LevelThree>
for Option<LevelOne>
    where LevelOne: Modify<LevelTwo>,
          LevelTwo: Set<LevelThree> {}

impl<LevelOne, LevelTwo, LevelThree, LevelFour>
SetFourth<LevelOne, LevelTwo, LevelThree, LevelFour>
for Option<LevelOne>
    where LevelOne: Modify<LevelTwo>,
          LevelTwo: Modify<LevelThree>,
          LevelThree: Set<LevelFour> {}

impl<LevelOne, LevelTwo, LevelThree, LevelFour, LevelFive>
SetFifth<LevelOne, LevelTwo, LevelThree, LevelFour, LevelFive>
for Option<LevelOne>
    where LevelOne: Modify<LevelTwo>,
          LevelTwo: Modify<LevelThree>,
          LevelThree: Modify<LevelFour>,
          LevelFour: Set<LevelFive> {}


impl<LevelOne, LevelTwo>
ModifySecond<LevelOne, LevelTwo>
for Option<LevelOne>
    where LevelOne: Modify<LevelTwo> {}

impl<LevelOne, LevelTwo, LevelThree>
ModifyThird<LevelOne, LevelTwo, LevelThree>
for Option<LevelOne>
    where LevelOne: Modify<LevelTwo>,
          LevelTwo: Modify<LevelThree> {}

impl<LevelOne, LevelTwo, LevelThree, LevelFour>
ModifyFourth<LevelOne, LevelTwo, LevelThree, LevelFour>
for Option<LevelOne>
    where LevelOne: Modify<LevelTwo>,
          LevelTwo: Modify<LevelThree>,
          LevelThree: Modify<LevelFour> {}

impl<LevelOne, LevelTwo, LevelThree, LevelFour, LevelFive>
ModifyFifth<LevelOne, LevelTwo, LevelThree, LevelFour, LevelFive>
for Option<LevelOne>
    where LevelOne: Modify<LevelTwo>,
          LevelTwo: Modify<LevelThree>,
          LevelThree: Modify<LevelFour>,
          LevelFour: Modify<LevelFive> {}