use crate::concepts::{Opt16, Opt4, Opt8};
use crate::{AnyOf, LeftOrRight};
pub type AnyOf4<LL, LR = LL, RL = LR, RR = RL> = AnyOf<AnyOf<LL, LR>, AnyOf<RL, RR>>;
impl<LL, LR, RL, RR> AnyOf4<LL, LR, RL, RR> {
pub fn new4(
ll: Option<LL>,
lr: Option<LR>,
rl: Option<RL>,
rr: Option<RR>,
) -> Self {
Self::from_opt4((ll, lr, rl, rr))
}
pub fn from_opt4(opt: Opt4<LL, LR, RL, RR>) -> Self {
let (ll, lr, rl, rr) = opt;
let left = if ll.is_none() && lr.is_none() {
None
} else {
Some(AnyOf::new(ll, lr))
};
let right = if rl.is_none() && rr.is_none() {
None
} else {
Some(AnyOf::new(rl, rr))
};
AnyOf::new(left, right)
}
pub fn ll(&self) -> Option<&LL> {
self.left()?.left()
}
pub fn lr(&self) -> Option<&LR> {
self.left()?.right()
}
pub fn rl(&self) -> Option<&RL> {
self.right()?.left()
}
pub fn rr(&self) -> Option<&RR> {
self.right()?.right()
}
pub fn opt4(&self) -> Opt4<&LL, &LR, &RL, &RR> {
(self.ll(), self.lr(), self.rl(), self.rr())
}
}
pub type AnyOf8<LLL, LLR = LLL, LRL = LLR, LRR = LRL, RLL = LLL, RLR = LLR, RRL = LRL, RRR = LRR> =
AnyOf<AnyOf4<LLL, LLR, LRL, LRR>, AnyOf4<RLL, RLR, RRL, RRR>>;
impl<LLL, LLR, LRL, LRR, RLL, RLR, RRL, RRR> AnyOf8<LLL, LLR, LRL, LRR, RLL, RLR, RRL, RRR> {
pub fn new8(
lll: Option<LLL>,
llr: Option<LLR>,
lrl: Option<LRL>,
lrr: Option<LRR>,
rll: Option<RLL>,
rlr: Option<RLR>,
rrl: Option<RRL>,
rrr: Option<RRR>,
) -> Self {
Self::from_opt8((lll, llr, lrl, lrr, rll, rlr, rrl, rrr))
}
pub fn from_opt8(opt: Opt8<LLL, LLR, LRL, LRR, RLL, RLR, RRL, RRR>) -> Self {
let (lll, llr, lrl, lrr, rll, rlr, rrl, rrr) = opt;
let left = if [lll.is_none(), llr.is_none(), lrl.is_none(), lrr.is_none()].iter().all(|&x| x) {
None
} else {
Some(AnyOf4::new4(lll, llr, lrl, lrr))
};
let right = if [rll.is_none(), rlr.is_none(), rrl.is_none(), rrr.is_none()].iter().all(|&x| x) {
None
} else {
Some(AnyOf4::new4(rll, rlr, rrl, rrr))
};
AnyOf::new(left, right)
}
pub fn lll(&self) -> Option<&LLL> {
self.left()?.ll()
}
pub fn llr(&self) -> Option<&LLR> {
self.left()?.lr()
}
pub fn lrl(&self) -> Option<&LRL> {
self.left()?.rl()
}
pub fn lrr(&self) -> Option<&LRR> {
self.left()?.rr()
}
pub fn rll(&self) -> Option<&RLL> {
self.right()?.ll()
}
pub fn rlr(&self) -> Option<&RLR> {
self.right()?.lr()
}
pub fn rrl(&self) -> Option<&RRL> {
self.right()?.rl()
}
pub fn rrr(&self) -> Option<&RRR> {
self.right()?.rr()
}
pub fn opt8(&self) -> Opt8<&LLL, &LLR, &LRL, &LRR, &RLL, &RLR, &RRL, &RRR> {
(
self.lll(),
self.llr(),
self.lrl(),
self.lrr(),
self.rll(),
self.rlr(),
self.rrl(),
self.rrr(),
)
}
}
pub type AnyOf16<
LLLL,
LLLR = LLLL,
LLRL = LLLR,
LLRR = LLRL,
LRLL = LLLL,
LRLR = LLLR,
LRRL = LLRL,
LRRR = LLRR,
RLLL = LLLL,
RLLR = LLLR,
RLRL = LLRL,
RLRR = LLRR,
RRLL = LRLL,
RRLR = LRLR,
RRRL = LRRL,
RRRR = LRRR,
> = AnyOf<
AnyOf8<LLLL, LLLR, LLRL, LLRR, LRLL, LRLR, LRRL, LRRR>,
AnyOf8<RLLL, RLLR, RLRL, RLRR, RRLL, RRLR, RRRL, RRRR>,
>;
impl<
LLLL,
LLLR,
LLRL,
LLRR,
LRLL,
LRLR,
LRRL,
LRRR,
RLLL,
RLLR,
RLRL,
RLRR,
RRLL,
RRLR,
RRRL,
RRRR,
>
AnyOf16<
LLLL,
LLLR,
LLRL,
LLRR,
LRLL,
LRLR,
LRRL,
LRRR,
RLLL,
RLLR,
RLRL,
RLRR,
RRLL,
RRLR,
RRRL,
RRRR,
>
{
#[allow(clippy::too_many_arguments)]
pub fn new16(
llll: Option<LLLL>,
lllr: Option<LLLR>,
llrl: Option<LLRL>,
llrr: Option<LLRR>,
lrll: Option<LRLL>,
lrlr: Option<LRLR>,
lrrl: Option<LRRL>,
lrrr: Option<LRRR>,
rlll: Option<RLLL>,
rllr: Option<RLLR>,
rlrl: Option<RLRL>,
rlrr: Option<RLRR>,
rrll: Option<RRLL>,
rrlr: Option<RRLR>,
rrrl: Option<RRRL>,
rrrr: Option<RRRR>,
) -> Self {
Self::from_opt16((
llll, lllr, llrl, llrr, lrll, lrlr, lrrl, lrrr,
rlll, rllr, rlrl, rlrr, rrll, rrlr, rrrl, rrrr,
))
}
#[allow(clippy::too_many_arguments)]
pub fn from_opt16(
opt: Opt16<
LLLL,
LLLR,
LLRL,
LLRR,
LRLL,
LRLR,
LRRL,
LRRR,
RLLL,
RLLR,
RLRL,
RLRR,
RRLL,
RRLR,
RRRL,
RRRR,
>,
) -> Self {
let (
llll, lllr, llrl, llrr, lrll, lrlr, lrrl, lrrr,
rlll, rllr, rlrl, rlrr, rrll, rrlr, rrrl, rrrr,
) = opt;
let left_empty = [
llll.is_none(),
lllr.is_none(),
llrl.is_none(),
llrr.is_none(),
lrll.is_none(),
lrlr.is_none(),
lrrl.is_none(),
lrrr.is_none(),
]
.iter()
.all(|&x| x);
let left = if left_empty {
None
} else {
Some(AnyOf8::new8(
llll, lllr, llrl, llrr, lrll, lrlr, lrrl, lrrr,
))
};
let right_empty = [
rlll.is_none(),
rllr.is_none(),
rlrl.is_none(),
rlrr.is_none(),
rrll.is_none(),
rrlr.is_none(),
rrrl.is_none(),
rrrr.is_none(),
]
.iter()
.all(|&x| x);
let right = if right_empty {
None
} else {
Some(AnyOf8::new8(
rlll, rllr, rlrl, rlrr, rrll, rrlr, rrrl, rrrr,
))
};
AnyOf::new(left, right)
}
pub fn llll(&self) -> Option<&LLLL> {
self.left()?.lll()
}
pub fn lllr(&self) -> Option<&LLLR> {
self.left()?.llr()
}
pub fn llrl(&self) -> Option<&LLRL> {
self.left()?.lrl()
}
pub fn llrr(&self) -> Option<&LLRR> {
self.left()?.lrr()
}
pub fn lrll(&self) -> Option<&LRLL> {
self.left()?.rll()
}
pub fn lrlr(&self) -> Option<&LRLR> {
self.left()?.rlr()
}
pub fn lrrl(&self) -> Option<&LRRL> {
self.left()?.rrl()
}
pub fn lrrr(&self) -> Option<&LRRR> {
self.left()?.rrr()
}
pub fn rlll(&self) -> Option<&RLLL> {
self.right()?.lll()
}
pub fn rllr(&self) -> Option<&RLLR> {
self.right()?.llr()
}
pub fn rlrl(&self) -> Option<&RLRL> {
self.right()?.lrl()
}
pub fn rlrr(&self) -> Option<&RLRR> {
self.right()?.lrr()
}
pub fn rrll(&self) -> Option<&RRLL> {
self.right()?.rll()
}
pub fn rrlr(&self) -> Option<&RRLR> {
self.right()?.rlr()
}
pub fn rrrl(&self) -> Option<&RRRL> {
self.right()?.rrl()
}
pub fn rrrr(&self) -> Option<&RRRR> {
self.right()?.rrr()
}
#[allow(clippy::type_complexity)]
pub fn opt16(
&self,
) -> Opt16<
&LLLL,
&LLLR,
&LLRL,
&LLRR,
&LRLL,
&LRLR,
&LRRL,
&LRRR,
&RLLL,
&RLLR,
&RLRL,
&RLRR,
&RRLL,
&RRLR,
&RRRL,
&RRRR,
> {
(
self.llll(),
self.lllr(),
self.llrl(),
self.llrr(),
self.lrll(),
self.lrlr(),
self.lrrl(),
self.lrrr(),
self.rlll(),
self.rllr(),
self.rlrl(),
self.rlrr(),
self.rrll(),
self.rrlr(),
self.rrrl(),
self.rrrr(),
)
}
}