1use super::*;
2
3pub struct Node<Req, SubtreeL, SubtreeR> {
4 pub requirement: Req,
5 pub prev_left: SubtreeL,
6 pub prev_right: SubtreeR,
7}
8
9pub trait Depth
10where
11 Self::Output: IsNumber,
12{
13 type Output;
14}
15
16impl Depth for () {
17 type Output = Zero;
18}
19
20impl<Req, SubtreeL, SubtreeR> Depth for Node<Req, SubtreeL, SubtreeR>
21where
22 SubtreeL: Depth,
23 SubtreeR: Depth,
24 <SubtreeL as Depth>::Output: IsNumber,
25 <SubtreeR as Depth>::Output: IsNumber,
26 (): Max<<SubtreeL as Depth>::Output, <SubtreeR as Depth>::Output>,
27{
28 type Output = Succ<<() as Max<SubtreeL::Output, SubtreeR::Output>>::Output>;
29}
30
31pub trait MinDepth
32where
33 Self::Output: IsNumber,
34{
35 type Output;
36}
37
38impl MinDepth for () {
39 type Output = Zero;
40}
41
42impl<Req, SubtreeL, SubtreeR> MinDepth for Node<Req, SubtreeL, SubtreeR>
43where
44 SubtreeL: MinDepth,
45 SubtreeR: MinDepth,
46 <SubtreeL as MinDepth>::Output: IsNumber,
47 <SubtreeR as MinDepth>::Output: IsNumber,
48 (): Min<<SubtreeL as MinDepth>::Output, <SubtreeR as MinDepth>::Output>,
49{
50 type Output = Succ<<() as Min<SubtreeL::Output, SubtreeR::Output>>::Output>;
51}