use super::*;
pub trait Insert<NewReq, MinDepth, Queries, Next>
where
MinDepth: IsNumber,
Self::MinDepth: IsNumber,
{
fn insert(self, new_req: NewReq) -> Next;
type MinDepth;
type Queries;
}
impl<Req, NewReq> Insert<NewReq, Succ<Zero>, Left<Here>, Node<Req, Node<NewReq, (), ()>, ()>>
for Node<Req, (), ()>
{
fn insert(self, new_req: NewReq) -> Node<Req, Node<NewReq, (), ()>, ()> {
Node {
requirement: self.requirement,
prev_left: Node {
requirement: new_req,
prev_left: (),
prev_right: (),
},
prev_right: (),
}
}
type MinDepth = Succ<Zero>;
type Queries = Left<Here>;
}
impl<Req, ReqR, NewReq>
Insert<
NewReq,
Succ<Succ<Zero>>,
Left<Right<Here>>,
Node<Req, Node<NewReq, (), ()>, Node<ReqR, (), ()>>,
> for Node<Req, (), Node<ReqR, (), ()>>
{
fn insert(self, new_req: NewReq) -> Node<Req, Node<NewReq, (), ()>, Node<ReqR, (), ()>> {
Node {
requirement: self.requirement,
prev_left: Node {
requirement: new_req,
prev_left: (),
prev_right: (),
},
prev_right: self.prev_right,
}
}
type MinDepth = Succ<Succ<Zero>>;
type Queries = Left<Here>;
}
impl<Req, ReqL, NewReq>
Insert<
NewReq,
Succ<Succ<Zero>>,
Right<Left<Here>>,
Node<Req, Node<ReqL, (), ()>, Node<NewReq, (), ()>>,
> for Node<Req, Node<ReqL, (), ()>, ()>
{
fn insert(self, new_req: NewReq) -> Node<Req, Node<ReqL, (), ()>, Node<NewReq, (), ()>> {
Node {
requirement: self.requirement,
prev_left: self.prev_left,
prev_right: Node {
requirement: new_req,
prev_left: (),
prev_right: (),
},
}
}
type MinDepth = Succ<Succ<Zero>>;
type Queries = Right<Here>;
}
impl<
Req,
ReqL,
SubtreeLL,
SubtreeLR,
ReqR,
SubtreeRL,
SubtreeRR,
NewReq,
NextSubtreeL,
PrevQueriesL,
>
Insert<
NewReq,
<Node<Req, NextSubtreeL, Node<ReqR, SubtreeRL, SubtreeRR>> as MinDepth>::Output,
Left<PrevQueriesL>,
Node<Req, NextSubtreeL, Node<ReqR, SubtreeRL, SubtreeRR>>,
> for Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, Node<ReqR, SubtreeRL, SubtreeRR>>
where
Node<ReqL, SubtreeLL, SubtreeLR>: MinDepth,
Node<ReqR, SubtreeRL, SubtreeRR>: MinDepth,
Node<Req, NextSubtreeL, Node<ReqR, SubtreeRL, SubtreeRR>>: MinDepth,
NextSubtreeL: MinDepth,
Node<ReqL, SubtreeLL, SubtreeLR>:
Insert<NewReq, <NextSubtreeL as MinDepth>::Output, PrevQueriesL, NextSubtreeL>,
(): LessThan<
<Node<ReqL, SubtreeLL, SubtreeLR> as MinDepth>::Output,
<Node<ReqR, SubtreeRL, SubtreeRR> as MinDepth>::Output,
>,
{
fn insert(self, new_req: NewReq) -> Node<Req, NextSubtreeL, Node<ReqR, SubtreeRL, SubtreeRR>> {
Node {
requirement: self.requirement,
prev_left: self.prev_left.insert(new_req),
prev_right: self.prev_right,
}
}
type MinDepth =
Succ<<Node<Req, NextSubtreeL, Node<ReqR, SubtreeRL, SubtreeRR>> as MinDepth>::Output>;
type Queries = Left<PrevQueriesL>;
}
impl<
Req,
ReqL,
SubtreeLL,
SubtreeLR,
ReqR,
SubtreeRL,
SubtreeRR,
NewReq,
NextSubtreeR,
PrevQueriesR,
>
Insert<
NewReq,
<Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, NextSubtreeR> as MinDepth>::Output,
Right<PrevQueriesR>,
Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, NextSubtreeR>,
> for Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, Node<ReqR, SubtreeRL, SubtreeRR>>
where
Node<ReqL, SubtreeLL, SubtreeLR>: MinDepth,
Node<ReqR, SubtreeRL, SubtreeRR>: MinDepth,
Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, NextSubtreeR>: MinDepth,
NextSubtreeR: MinDepth,
Node<ReqR, SubtreeRL, SubtreeRR>:
Insert<NewReq, <NextSubtreeR as MinDepth>::Output, PrevQueriesR, NextSubtreeR>,
(): GreaterThanOrEqual<
<Node<ReqL, SubtreeLL, SubtreeLR> as MinDepth>::Output,
<Node<ReqR, SubtreeRL, SubtreeRR> as MinDepth>::Output,
>,
{
fn insert(self, new_req: NewReq) -> Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, NextSubtreeR> {
Node {
requirement: self.requirement,
prev_left: self.prev_left,
prev_right: self.prev_right.insert(new_req),
}
}
type MinDepth =
Succ<<Node<Req, Node<ReqL, SubtreeLL, SubtreeLR>, NextSubtreeR> as MinDepth>::Output>;
type Queries = Right<PrevQueriesR>;
}