1use super::*;
2
3pub trait Insert<NewReq, MinDepth, Queries, Next>
5where
6 MinDepth: IsNumber,
7 Self::MinDepth: IsNumber,
8{
9 fn insert(self, new_req: NewReq) -> Next;
12 type MinDepth;
13 type Queries;
14}
15
16impl<Req, NewReq> Insert<NewReq, Succ<Zero>, Left<Here>, Node<Req, Node<NewReq, (), ()>, ()>>
18 for Node<Req, (), ()>
19{
20 fn insert(self, new_req: NewReq) -> Node<Req, Node<NewReq, (), ()>, ()> {
21 Node {
22 requirement: self.requirement,
23 prev_left: Node {
24 requirement: new_req,
25 prev_left: (),
26 prev_right: (),
27 },
28 prev_right: (),
29 }
30 }
31
32 type MinDepth = Succ<Zero>;
33 type Queries = Left<Here>;
34}
35
36impl<Req, ReqR, NewReq>
38 Insert<
39 NewReq,
40 Succ<Succ<Zero>>,
41 Left<Right<Here>>,
42 Node<Req, Node<NewReq, (), ()>, Node<ReqR, (), ()>>,
43 > for Node<Req, (), Node<ReqR, (), ()>>
44{
45 fn insert(self, new_req: NewReq) -> Node<Req, Node<NewReq, (), ()>, Node<ReqR, (), ()>> {
46 Node {
47 requirement: self.requirement,
48 prev_left: Node {
49 requirement: new_req,
50 prev_left: (),
51 prev_right: (),
52 },
53 prev_right: self.prev_right,
54 }
55 }
56
57 type MinDepth = Succ<Succ<Zero>>;
58 type Queries = Left<Here>;
59}
60
61impl<Req, ReqL, NewReq>
63 Insert<
64 NewReq,
65 Succ<Succ<Zero>>,
66 Right<Left<Here>>,
67 Node<Req, Node<ReqL, (), ()>, Node<NewReq, (), ()>>,
68 > for Node<Req, Node<ReqL, (), ()>, ()>
69{
70 fn insert(self, new_req: NewReq) -> Node<Req, Node<ReqL, (), ()>, Node<NewReq, (), ()>> {
71 Node {
72 requirement: self.requirement,
73 prev_left: self.prev_left,
74 prev_right: Node {
75 requirement: new_req,
76 prev_left: (),
77 prev_right: (),
78 },
79 }
80 }
81
82 type MinDepth = Succ<Succ<Zero>>;
83 type Queries = Right<Here>;
84}
85
86impl<
88 Req,
89 ReqL,
90 SubtreeLL,
91 SubtreeLR,
92 ReqR,
93 SubtreeRL,
94 SubtreeRR,
95 NewReq,
96 NextSubtreeL,
97 PrevQueriesL,
98>
99 Insert<
100 NewReq,
101 <Node<Req, NextSubtreeL, Node<ReqR, SubtreeRL, SubtreeRR>> as MinDepth>::Output,
102 Left<PrevQueriesL>,
103 Node<Req, NextSubtreeL, Node<ReqR, SubtreeRL, SubtreeRR>>,
104 > for Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, Node<ReqR, SubtreeRL, SubtreeRR>>
105where
106 Node<ReqL, SubtreeLL, SubtreeLR>: MinDepth,
107 Node<ReqR, SubtreeRL, SubtreeRR>: MinDepth,
108 Node<Req, NextSubtreeL, Node<ReqR, SubtreeRL, SubtreeRR>>: MinDepth,
109 NextSubtreeL: MinDepth,
110 Node<ReqL, SubtreeLL, SubtreeLR>:
111 Insert<NewReq, <NextSubtreeL as MinDepth>::Output, PrevQueriesL, NextSubtreeL>,
112 (): LessThan<
113 <Node<ReqL, SubtreeLL, SubtreeLR> as MinDepth>::Output,
114 <Node<ReqR, SubtreeRL, SubtreeRR> as MinDepth>::Output,
115 >,
116{
117 fn insert(self, new_req: NewReq) -> Node<Req, NextSubtreeL, Node<ReqR, SubtreeRL, SubtreeRR>> {
118 Node {
119 requirement: self.requirement,
120 prev_left: self.prev_left.insert(new_req),
121 prev_right: self.prev_right,
122 }
123 }
124
125 type MinDepth =
126 Succ<<Node<Req, NextSubtreeL, Node<ReqR, SubtreeRL, SubtreeRR>> as MinDepth>::Output>;
127 type Queries = Left<PrevQueriesL>;
128}
129
130impl<
132 Req,
133 ReqL,
134 SubtreeLL,
135 SubtreeLR,
136 ReqR,
137 SubtreeRL,
138 SubtreeRR,
139 NewReq,
140 NextSubtreeR,
141 PrevQueriesR,
142>
143 Insert<
144 NewReq,
145 <Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, NextSubtreeR> as MinDepth>::Output,
146 Right<PrevQueriesR>,
147 Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, NextSubtreeR>,
148 > for Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, Node<ReqR, SubtreeRL, SubtreeRR>>
149where
150 Node<ReqL, SubtreeLL, SubtreeLR>: MinDepth,
151 Node<ReqR, SubtreeRL, SubtreeRR>: MinDepth,
152 Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, NextSubtreeR>: MinDepth,
153 NextSubtreeR: MinDepth,
154 Node<ReqR, SubtreeRL, SubtreeRR>:
155 Insert<NewReq, <NextSubtreeR as MinDepth>::Output, PrevQueriesR, NextSubtreeR>,
156 (): GreaterThanOrEqual<
157 <Node<ReqL, SubtreeLL, SubtreeLR> as MinDepth>::Output,
158 <Node<ReqR, SubtreeRL, SubtreeRR> as MinDepth>::Output,
159 >,
160{
161 fn insert(self, new_req: NewReq) -> Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, NextSubtreeR> {
162 Node {
163 requirement: self.requirement,
164 prev_left: self.prev_left,
165 prev_right: self.prev_right.insert(new_req),
166 }
167 }
168
169 type MinDepth =
170 Succ<<Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, NextSubtreeR> as MinDepth>::Output>;
171 type Queries = Right<PrevQueriesR>;
172}