use std::any::TypeId;
pub enum Or2<T1, T2> {
T1(T1),
T2(T2),
}
impl<T1, T2> Or2<T1, T2> {
pub fn is_t1(&self) -> bool {
match self {
Self::T1(_) => true,
_ => false,
}
}
pub fn is_t2(&self) -> bool {
match self {
Self::T2(_) => true,
_ => false,
}
}
pub fn as_t1(self) -> Option<T1> {
match self {
Self::T1(t1) => Some(t1),
_ => None,
}
}
pub fn as_t2(self) -> Option<T2> {
match self {
Self::T2(t2) => Some(t2),
_ => None,
}
}
pub fn map_t1<F, B>(self, f: F) -> Or2<B, T2>
where
F: FnOnce(T1) -> B,
{
match self {
Self::T1(t1) => Or2::<B, T2>::T1(f(t1)),
Self::T2(t2) => Or2::<B, T2>::T2(t2),
}
}
pub fn map_t2<F, B>(self, f: F) -> Or2<T1, B>
where
F: FnOnce(T2) -> B,
{
match self {
Self::T1(t1) => Or2::<T1, B>::T1(t1),
Self::T2(t2) => Or2::<T1, B>::T2(f(t2)),
}
}
pub fn fold<T, F0, F1, F2>(self, f1: F1, f2: F2) -> T
where
F1: FnOnce(T1) -> T,
F2: FnOnce(T2) -> T,
{
match self {
Self::T1(t1) => f1(t1),
Self::T2(t2) => f2(t2),
}
}
}
impl<T1, T2> Or2<T1, T2>
where
T1: 'static,
T2: 'static,
{
pub fn is_type<T: 'static>(&self) -> bool {
match self {
Self::T1(_) => TypeId::of::<T>() == TypeId::of::<T1>(),
Self::T2(_) => TypeId::of::<T>() == TypeId::of::<T2>(),
}
}
}
#[derive(Clone, Copy)]
pub enum Or3<T1, T2, T3> {
T1(T1),
T2(T2),
T3(T3),
}
impl<T1, T2, T3> Or3<T1, T2, T3> {
pub fn is_t1(&self) -> bool {
match self {
Self::T1(_) => true,
_ => false,
}
}
pub fn is_t2(&self) -> bool {
match self {
Self::T2(_) => true,
_ => false,
}
}
pub fn is_t3(&self) -> bool {
match self {
Self::T3(_) => true,
_ => false,
}
}
pub fn as_t1(self) -> Option<T1> {
match self {
Self::T1(t1) => Some(t1),
_ => None,
}
}
pub fn as_t2(self) -> Option<T2> {
match self {
Self::T2(t2) => Some(t2),
_ => None,
}
}
pub fn as_t3(self) -> Option<T3> {
match self {
Self::T3(t3) => Some(t3),
_ => None,
}
}
pub fn map_t1<F, B>(self, f: F) -> Or3<B, T2, T3>
where
F: FnOnce(T1) -> B,
{
match self {
Self::T1(t1) => Or3::<B, T2, T3>::T1(f(t1)),
Self::T2(t2) => Or3::<B, T2, T3>::T2(t2),
Self::T3(t3) => Or3::<B, T2, T3>::T3(t3),
}
}
pub fn map_t2<F, B>(self, f: F) -> Or3<T1, B, T3>
where
F: FnOnce(T2) -> B,
{
match self {
Self::T1(t1) => Or3::<T1, B, T3>::T1(t1),
Self::T2(t2) => Or3::<T1, B, T3>::T2(f(t2)),
Self::T3(t3) => Or3::<T1, B, T3>::T3(t3),
}
}
pub fn map_t3<F, B>(self, f: F) -> Or3<T1, T2, B>
where
F: FnOnce(T3) -> B,
{
match self {
Self::T1(t1) => Or3::<T1, T2, B>::T1(t1),
Self::T2(t2) => Or3::<T1, T2, B>::T2(t2),
Self::T3(t3) => Or3::<T1, T2, B>::T3(f(t3)),
}
}
pub fn fold<T, F0, F1, F2, F3>(self, f1: F1, f2: F2, f3: F3) -> T
where
F1: FnOnce(T1) -> T,
F2: FnOnce(T2) -> T,
F3: FnOnce(T3) -> T,
{
match self {
Self::T1(t1) => f1(t1),
Self::T2(t2) => f2(t2),
Self::T3(t3) => f3(t3),
}
}
}
impl<T1, T2, T3> Or3<T1, T2, T3>
where
T1: 'static,
T2: 'static,
T3: 'static,
{
pub fn is_type<T: 'static>(&self) -> bool {
match self {
Self::T1(_) => TypeId::of::<T>() == TypeId::of::<T1>(),
Self::T2(_) => TypeId::of::<T>() == TypeId::of::<T2>(),
Self::T3(_) => TypeId::of::<T>() == TypeId::of::<T3>(),
}
}
}
pub enum Or4<T1, T2, T3, T4> {
T1(T1),
T2(T2),
T3(T3),
T4(T4),
}
impl<T1, T2, T3, T4> Or4<T1, T2, T3, T4> {
pub fn is_t1(&self) -> bool {
match self {
Self::T1(_) => true,
_ => false,
}
}
pub fn is_t2(&self) -> bool {
match self {
Self::T2(_) => true,
_ => false,
}
}
pub fn is_t3(&self) -> bool {
match self {
Self::T3(_) => true,
_ => false,
}
}
pub fn is_t4(&self) -> bool {
match self {
Self::T4(_) => true,
_ => false,
}
}
pub fn as_t1(self) -> Option<T1> {
match self {
Self::T1(t1) => Some(t1),
_ => None,
}
}
pub fn as_t2(self) -> Option<T2> {
match self {
Self::T2(t2) => Some(t2),
_ => None,
}
}
pub fn as_t3(self) -> Option<T3> {
match self {
Self::T3(t3) => Some(t3),
_ => None,
}
}
pub fn as_t4(self) -> Option<T4> {
match self {
Self::T4(t4) => Some(t4),
_ => None,
}
}
pub fn map_t1<F, B>(self, f: F) -> Or4<B, T2, T3, T4>
where
F: FnOnce(T1) -> B,
{
match self {
Self::T1(t1) => Or4::<B, T2, T3, T4>::T1(f(t1)),
Self::T2(t2) => Or4::<B, T2, T3, T4>::T2(t2),
Self::T3(t3) => Or4::<B, T2, T3, T4>::T3(t3),
Self::T4(t4) => Or4::<B, T2, T3, T4>::T4(t4),
}
}
pub fn map_t2<F, B>(self, f: F) -> Or4<T1, B, T3, T4>
where
F: FnOnce(T2) -> B,
{
match self {
Self::T1(t1) => Or4::<T1, B, T3, T4>::T1(t1),
Self::T2(t2) => Or4::<T1, B, T3, T4>::T2(f(t2)),
Self::T3(t3) => Or4::<T1, B, T3, T4>::T3(t3),
Self::T4(t4) => Or4::<T1, B, T3, T4>::T4(t4),
}
}
pub fn map_t3<F, B>(self, f: F) -> Or4<T1, T2, B, T4>
where
F: FnOnce(T3) -> B,
{
match self {
Self::T1(t1) => Or4::<T1, T2, B, T4>::T1(t1),
Self::T2(t2) => Or4::<T1, T2, B, T4>::T2(t2),
Self::T3(t3) => Or4::<T1, T2, B, T4>::T3(f(t3)),
Self::T4(t4) => Or4::<T1, T2, B, T4>::T4(t4),
}
}
pub fn map_t4<F, B>(self, f: F) -> Or4<T1, T2, T3, B>
where
F: FnOnce(T4) -> B,
{
match self {
Self::T1(t1) => Or4::<T1, T2, T3, B>::T1(t1),
Self::T2(t2) => Or4::<T1, T2, T3, B>::T2(t2),
Self::T3(t3) => Or4::<T1, T2, T3, B>::T3(t3),
Self::T4(t4) => Or4::<T1, T2, T3, B>::T4(f(t4)),
}
}
pub fn fold<T, F0, F1, F2, F3, F4>(self, f1: F1, f2: F2, f3: F3, f4: F4) -> T
where
F1: FnOnce(T1) -> T,
F2: FnOnce(T2) -> T,
F3: FnOnce(T3) -> T,
F4: FnOnce(T4) -> T,
{
match self {
Self::T1(t1) => f1(t1),
Self::T2(t2) => f2(t2),
Self::T3(t3) => f3(t3),
Self::T4(t4) => f4(t4),
}
}
}
impl<T1, T2, T3, T4> Or4<T1, T2, T3, T4>
where
T1: 'static,
T2: 'static,
T3: 'static,
T4: 'static,
{
pub fn is_type<T: 'static>(&self) -> bool {
match self {
Self::T1(_) => TypeId::of::<T>() == TypeId::of::<T1>(),
Self::T2(_) => TypeId::of::<T>() == TypeId::of::<T2>(),
Self::T3(_) => TypeId::of::<T>() == TypeId::of::<T3>(),
Self::T4(_) => TypeId::of::<T>() == TypeId::of::<T4>(),
}
}
}
pub enum Or5<T1, T2, T3, T4, T5> {
T1(T1),
T2(T2),
T3(T3),
T4(T4),
T5(T5),
}
impl<T1, T2, T3, T4, T5> Or5<T1, T2, T3, T4, T5> {
pub fn is_t1(&self) -> bool {
match self {
Self::T1(_) => true,
_ => false,
}
}
pub fn is_t2(&self) -> bool {
match self {
Self::T2(_) => true,
_ => false,
}
}
pub fn is_t3(&self) -> bool {
match self {
Self::T3(_) => true,
_ => false,
}
}
pub fn is_t4(&self) -> bool {
match self {
Self::T4(_) => true,
_ => false,
}
}
pub fn is_t5(&self) -> bool {
match self {
Self::T5(_) => true,
_ => false,
}
}
pub fn as_t1(self) -> Option<T1> {
match self {
Self::T1(t1) => Some(t1),
_ => None,
}
}
pub fn as_t2(self) -> Option<T2> {
match self {
Self::T2(t2) => Some(t2),
_ => None,
}
}
pub fn as_t3(self) -> Option<T3> {
match self {
Self::T3(t3) => Some(t3),
_ => None,
}
}
pub fn as_t4(self) -> Option<T4> {
match self {
Self::T4(t4) => Some(t4),
_ => None,
}
}
pub fn as_t5(self) -> Option<T5> {
match self {
Self::T5(t5) => Some(t5),
_ => None,
}
}
pub fn map_t1<F, B>(self, f: F) -> Or5<B, T2, T3, T4, T5>
where
F: FnOnce(T1) -> B,
{
match self {
Self::T1(t1) => Or5::<B, T2, T3, T4, T5>::T1(f(t1)),
Self::T2(t2) => Or5::<B, T2, T3, T4, T5>::T2(t2),
Self::T3(t3) => Or5::<B, T2, T3, T4, T5>::T3(t3),
Self::T4(t4) => Or5::<B, T2, T3, T4, T5>::T4(t4),
Self::T5(t5) => Or5::<B, T2, T3, T4, T5>::T5(t5),
}
}
pub fn map_t2<F, B>(self, f: F) -> Or5<T1, B, T3, T4, T5>
where
F: FnOnce(T2) -> B,
{
match self {
Self::T1(t1) => Or5::<T1, B, T3, T4, T5>::T1(t1),
Self::T2(t2) => Or5::<T1, B, T3, T4, T5>::T2(f(t2)),
Self::T3(t3) => Or5::<T1, B, T3, T4, T5>::T3(t3),
Self::T4(t4) => Or5::<T1, B, T3, T4, T5>::T4(t4),
Self::T5(t5) => Or5::<T1, B, T3, T4, T5>::T5(t5),
}
}
pub fn map_t3<F, B>(self, f: F) -> Or5<T1, T2, B, T4, T5>
where
F: FnOnce(T3) -> B,
{
match self {
Self::T1(t1) => Or5::<T1, T2, B, T4, T5>::T1(t1),
Self::T2(t2) => Or5::<T1, T2, B, T4, T5>::T2(t2),
Self::T3(t3) => Or5::<T1, T2, B, T4, T5>::T3(f(t3)),
Self::T4(t4) => Or5::<T1, T2, B, T4, T5>::T4(t4),
Self::T5(t5) => Or5::<T1, T2, B, T4, T5>::T5(t5),
}
}
pub fn map_t4<F, B>(self, f: F) -> Or5<T1, T2, T3, B, T5>
where
F: FnOnce(T4) -> B,
{
match self {
Self::T1(t1) => Or5::<T1, T2, T3, B, T5>::T1(t1),
Self::T2(t2) => Or5::<T1, T2, T3, B, T5>::T2(t2),
Self::T3(t3) => Or5::<T1, T2, T3, B, T5>::T3(t3),
Self::T4(t4) => Or5::<T1, T2, T3, B, T5>::T4(f(t4)),
Self::T5(t5) => Or5::<T1, T2, T3, B, T5>::T5(t5),
}
}
pub fn map_t5<F, B>(self, f: F) -> Or5<T1, T2, T3, T4, B>
where
F: FnOnce(T5) -> B,
{
match self {
Self::T1(t1) => Or5::<T1, T2, T3, T4, B>::T1(t1),
Self::T2(t2) => Or5::<T1, T2, T3, T4, B>::T2(t2),
Self::T3(t3) => Or5::<T1, T2, T3, T4, B>::T3(t3),
Self::T4(t4) => Or5::<T1, T2, T3, T4, B>::T4(t4),
Self::T5(t5) => Or5::<T1, T2, T3, T4, B>::T5(f(t5)),
}
}
pub fn fold<T, F0, F1, F2, F3, F4, F5>(self, f1: F1, f2: F2, f3: F3, f4: F4, f5: F5) -> T
where
F1: FnOnce(T1) -> T,
F2: FnOnce(T2) -> T,
F3: FnOnce(T3) -> T,
F4: FnOnce(T4) -> T,
F5: FnOnce(T5) -> T,
{
match self {
Self::T1(t1) => f1(t1),
Self::T2(t2) => f2(t2),
Self::T3(t3) => f3(t3),
Self::T4(t4) => f4(t4),
Self::T5(t5) => f5(t5),
}
}
}
impl<T1, T2, T3, T4, T5> Or5<T1, T2, T3, T4, T5>
where
T1: 'static,
T2: 'static,
T3: 'static,
T4: 'static,
T5: 'static,
{
pub fn is_type<T: 'static>(&self) -> bool {
match self {
Self::T1(_) => TypeId::of::<T>() == TypeId::of::<T1>(),
Self::T2(_) => TypeId::of::<T>() == TypeId::of::<T2>(),
Self::T3(_) => TypeId::of::<T>() == TypeId::of::<T3>(),
Self::T4(_) => TypeId::of::<T>() == TypeId::of::<T4>(),
Self::T5(_) => TypeId::of::<T>() == TypeId::of::<T5>(),
}
}
}
pub enum Or6<T1, T2, T3, T4, T5, T6> {
T1(T1),
T2(T2),
T3(T3),
T4(T4),
T5(T5),
T6(T6),
}
impl<T1, T2, T3, T4, T5, T6> Or6<T1, T2, T3, T4, T5, T6> {
pub fn is_t1(&self) -> bool {
match self {
Self::T1(_) => true,
_ => false,
}
}
pub fn is_t2(&self) -> bool {
match self {
Self::T2(_) => true,
_ => false,
}
}
pub fn is_t3(&self) -> bool {
match self {
Self::T3(_) => true,
_ => false,
}
}
pub fn is_t4(&self) -> bool {
match self {
Self::T4(_) => true,
_ => false,
}
}
pub fn is_t5(&self) -> bool {
match self {
Self::T5(_) => true,
_ => false,
}
}
pub fn is_t6(&self) -> bool {
match self {
Self::T6(_) => true,
_ => false,
}
}
pub fn as_t1(self) -> Option<T1> {
match self {
Self::T1(t1) => Some(t1),
_ => None,
}
}
pub fn as_t2(self) -> Option<T2> {
match self {
Self::T2(t2) => Some(t2),
_ => None,
}
}
pub fn as_t3(self) -> Option<T3> {
match self {
Self::T3(t3) => Some(t3),
_ => None,
}
}
pub fn as_t4(self) -> Option<T4> {
match self {
Self::T4(t4) => Some(t4),
_ => None,
}
}
pub fn as_t5(self) -> Option<T5> {
match self {
Self::T5(t5) => Some(t5),
_ => None,
}
}
pub fn as_t6(self) -> Option<T6> {
match self {
Self::T6(t6) => Some(t6),
_ => None,
}
}
pub fn map_t1<F, B>(self, f: F) -> Or6<B, T2, T3, T4, T5, T6>
where
F: FnOnce(T1) -> B,
{
match self {
Self::T1(t1) => Or6::<B, T2, T3, T4, T5, T6>::T1(f(t1)),
Self::T2(t2) => Or6::<B, T2, T3, T4, T5, T6>::T2(t2),
Self::T3(t3) => Or6::<B, T2, T3, T4, T5, T6>::T3(t3),
Self::T4(t4) => Or6::<B, T2, T3, T4, T5, T6>::T4(t4),
Self::T5(t5) => Or6::<B, T2, T3, T4, T5, T6>::T5(t5),
Self::T6(t6) => Or6::<B, T2, T3, T4, T5, T6>::T6(t6),
}
}
pub fn map_t2<F, B>(self, f: F) -> Or6<T1, B, T3, T4, T5, T6>
where
F: FnOnce(T2) -> B,
{
match self {
Self::T1(t1) => Or6::<T1, B, T3, T4, T5, T6>::T1(t1),
Self::T2(t2) => Or6::<T1, B, T3, T4, T5, T6>::T2(f(t2)),
Self::T3(t3) => Or6::<T1, B, T3, T4, T5, T6>::T3(t3),
Self::T4(t4) => Or6::<T1, B, T3, T4, T5, T6>::T4(t4),
Self::T5(t5) => Or6::<T1, B, T3, T4, T5, T6>::T5(t5),
Self::T6(t6) => Or6::<T1, B, T3, T4, T5, T6>::T6(t6),
}
}
pub fn map_t3<F, B>(self, f: F) -> Or6<T1, T2, B, T4, T5, T6>
where
F: FnOnce(T3) -> B,
{
match self {
Self::T1(t1) => Or6::<T1, T2, B, T4, T5, T6>::T1(t1),
Self::T2(t2) => Or6::<T1, T2, B, T4, T5, T6>::T2(t2),
Self::T3(t3) => Or6::<T1, T2, B, T4, T5, T6>::T3(f(t3)),
Self::T4(t4) => Or6::<T1, T2, B, T4, T5, T6>::T4(t4),
Self::T5(t5) => Or6::<T1, T2, B, T4, T5, T6>::T5(t5),
Self::T6(t6) => Or6::<T1, T2, B, T4, T5, T6>::T6(t6),
}
}
pub fn map_t4<F, B>(self, f: F) -> Or6<T1, T2, T3, B, T5, T6>
where
F: FnOnce(T4) -> B,
{
match self {
Self::T1(t1) => Or6::<T1, T2, T3, B, T5, T6>::T1(t1),
Self::T2(t2) => Or6::<T1, T2, T3, B, T5, T6>::T2(t2),
Self::T3(t3) => Or6::<T1, T2, T3, B, T5, T6>::T3(t3),
Self::T4(t4) => Or6::<T1, T2, T3, B, T5, T6>::T4(f(t4)),
Self::T5(t5) => Or6::<T1, T2, T3, B, T5, T6>::T5(t5),
Self::T6(t6) => Or6::<T1, T2, T3, B, T5, T6>::T6(t6),
}
}
pub fn map_t5<F, B>(self, f: F) -> Or6<T1, T2, T3, T4, B, T6>
where
F: FnOnce(T5) -> B,
{
match self {
Self::T1(t1) => Or6::<T1, T2, T3, T4, B, T6>::T1(t1),
Self::T2(t2) => Or6::<T1, T2, T3, T4, B, T6>::T2(t2),
Self::T3(t3) => Or6::<T1, T2, T3, T4, B, T6>::T3(t3),
Self::T4(t4) => Or6::<T1, T2, T3, T4, B, T6>::T4(t4),
Self::T5(t5) => Or6::<T1, T2, T3, T4, B, T6>::T5(f(t5)),
Self::T6(t6) => Or6::<T1, T2, T3, T4, B, T6>::T6(t6),
}
}
pub fn map_t6<F, B>(self, f: F) -> Or6<T1, T2, T3, T4, T5, B>
where
F: FnOnce(T6) -> B,
{
match self {
Self::T1(t1) => Or6::<T1, T2, T3, T4, T5, B>::T1(t1),
Self::T2(t2) => Or6::<T1, T2, T3, T4, T5, B>::T2(t2),
Self::T3(t3) => Or6::<T1, T2, T3, T4, T5, B>::T3(t3),
Self::T4(t4) => Or6::<T1, T2, T3, T4, T5, B>::T4(t4),
Self::T5(t5) => Or6::<T1, T2, T3, T4, T5, B>::T5(t5),
Self::T6(t6) => Or6::<T1, T2, T3, T4, T5, B>::T6(f(t6)),
}
}
pub fn fold<T, F0, F1, F2, F3, F4, F5, F6>(
self,
f1: F1,
f2: F2,
f3: F3,
f4: F4,
f5: F5,
f6: F6,
) -> T
where
F1: FnOnce(T1) -> T,
F2: FnOnce(T2) -> T,
F3: FnOnce(T3) -> T,
F4: FnOnce(T4) -> T,
F5: FnOnce(T5) -> T,
F6: FnOnce(T6) -> T,
{
match self {
Self::T1(t1) => f1(t1),
Self::T2(t2) => f2(t2),
Self::T3(t3) => f3(t3),
Self::T4(t4) => f4(t4),
Self::T5(t5) => f5(t5),
Self::T6(t6) => f6(t6),
}
}
}
impl<T1, T2, T3, T4, T5, T6> Or6<T1, T2, T3, T4, T5, T6>
where
T1: 'static,
T2: 'static,
T3: 'static,
T4: 'static,
T5: 'static,
T6: 'static,
{
pub fn is_type<T: 'static>(&self) -> bool {
match self {
Self::T1(_) => TypeId::of::<T>() == TypeId::of::<T1>(),
Self::T2(_) => TypeId::of::<T>() == TypeId::of::<T2>(),
Self::T3(_) => TypeId::of::<T>() == TypeId::of::<T3>(),
Self::T4(_) => TypeId::of::<T>() == TypeId::of::<T4>(),
Self::T5(_) => TypeId::of::<T>() == TypeId::of::<T5>(),
Self::T6(_) => TypeId::of::<T>() == TypeId::of::<T6>(),
}
}
}
pub enum Or7<T1, T2, T3, T4, T5, T6, T7> {
T1(T1),
T2(T2),
T3(T3),
T4(T4),
T5(T5),
T6(T6),
T7(T7),
}
impl<T1, T2, T3, T4, T5, T6, T7> Or7<T1, T2, T3, T4, T5, T6, T7> {
pub fn is_t1(&self) -> bool {
match self {
Self::T1(_) => true,
_ => false,
}
}
pub fn is_t2(&self) -> bool {
match self {
Self::T2(_) => true,
_ => false,
}
}
pub fn is_t3(&self) -> bool {
match self {
Self::T3(_) => true,
_ => false,
}
}
pub fn is_t4(&self) -> bool {
match self {
Self::T4(_) => true,
_ => false,
}
}
pub fn is_t5(&self) -> bool {
match self {
Self::T5(_) => true,
_ => false,
}
}
pub fn is_t6(&self) -> bool {
match self {
Self::T6(_) => true,
_ => false,
}
}
pub fn is_t7(&self) -> bool {
match self {
Self::T7(_) => true,
_ => false,
}
}
pub fn as_t1(self) -> Option<T1> {
match self {
Self::T1(t1) => Some(t1),
_ => None,
}
}
pub fn as_t2(self) -> Option<T2> {
match self {
Self::T2(t2) => Some(t2),
_ => None,
}
}
pub fn as_t3(self) -> Option<T3> {
match self {
Self::T3(t3) => Some(t3),
_ => None,
}
}
pub fn as_t4(self) -> Option<T4> {
match self {
Self::T4(t4) => Some(t4),
_ => None,
}
}
pub fn as_t5(self) -> Option<T5> {
match self {
Self::T5(t5) => Some(t5),
_ => None,
}
}
pub fn as_t6(self) -> Option<T6> {
match self {
Self::T6(t6) => Some(t6),
_ => None,
}
}
pub fn as_t7(self) -> Option<T7> {
match self {
Self::T7(t7) => Some(t7),
_ => None,
}
}
pub fn map_t1<F, B>(self, f: F) -> Or7<B, T2, T3, T4, T5, T6, T7>
where
F: FnOnce(T1) -> B,
{
match self {
Self::T1(t1) => Or7::<B, T2, T3, T4, T5, T6, T7>::T1(f(t1)),
Self::T2(t2) => Or7::<B, T2, T3, T4, T5, T6, T7>::T2(t2),
Self::T3(t3) => Or7::<B, T2, T3, T4, T5, T6, T7>::T3(t3),
Self::T4(t4) => Or7::<B, T2, T3, T4, T5, T6, T7>::T4(t4),
Self::T5(t5) => Or7::<B, T2, T3, T4, T5, T6, T7>::T5(t5),
Self::T6(t6) => Or7::<B, T2, T3, T4, T5, T6, T7>::T6(t6),
Self::T7(t7) => Or7::<B, T2, T3, T4, T5, T6, T7>::T7(t7),
}
}
pub fn map_t2<F, B>(self, f: F) -> Or7<T1, B, T3, T4, T5, T6, T7>
where
F: FnOnce(T2) -> B,
{
match self {
Self::T1(t1) => Or7::<T1, B, T3, T4, T5, T6, T7>::T1(t1),
Self::T2(t2) => Or7::<T1, B, T3, T4, T5, T6, T7>::T2(f(t2)),
Self::T3(t3) => Or7::<T1, B, T3, T4, T5, T6, T7>::T3(t3),
Self::T4(t4) => Or7::<T1, B, T3, T4, T5, T6, T7>::T4(t4),
Self::T5(t5) => Or7::<T1, B, T3, T4, T5, T6, T7>::T5(t5),
Self::T6(t6) => Or7::<T1, B, T3, T4, T5, T6, T7>::T6(t6),
Self::T7(t7) => Or7::<T1, B, T3, T4, T5, T6, T7>::T7(t7),
}
}
pub fn map_t3<F, B>(self, f: F) -> Or7<T1, T2, B, T4, T5, T6, T7>
where
F: FnOnce(T3) -> B,
{
match self {
Self::T1(t1) => Or7::<T1, T2, B, T4, T5, T6, T7>::T1(t1),
Self::T2(t2) => Or7::<T1, T2, B, T4, T5, T6, T7>::T2(t2),
Self::T3(t3) => Or7::<T1, T2, B, T4, T5, T6, T7>::T3(f(t3)),
Self::T4(t4) => Or7::<T1, T2, B, T4, T5, T6, T7>::T4(t4),
Self::T5(t5) => Or7::<T1, T2, B, T4, T5, T6, T7>::T5(t5),
Self::T6(t6) => Or7::<T1, T2, B, T4, T5, T6, T7>::T6(t6),
Self::T7(t7) => Or7::<T1, T2, B, T4, T5, T6, T7>::T7(t7),
}
}
pub fn map_t4<F, B>(self, f: F) -> Or7<T1, T2, T3, B, T5, T6, T7>
where
F: FnOnce(T4) -> B,
{
match self {
Self::T1(t1) => Or7::<T1, T2, T3, B, T5, T6, T7>::T1(t1),
Self::T2(t2) => Or7::<T1, T2, T3, B, T5, T6, T7>::T2(t2),
Self::T3(t3) => Or7::<T1, T2, T3, B, T5, T6, T7>::T3(t3),
Self::T4(t4) => Or7::<T1, T2, T3, B, T5, T6, T7>::T4(f(t4)),
Self::T5(t5) => Or7::<T1, T2, T3, B, T5, T6, T7>::T5(t5),
Self::T6(t6) => Or7::<T1, T2, T3, B, T5, T6, T7>::T6(t6),
Self::T7(t7) => Or7::<T1, T2, T3, B, T5, T6, T7>::T7(t7),
}
}
pub fn map_t5<F, B>(self, f: F) -> Or7<T1, T2, T3, T4, B, T6, T7>
where
F: FnOnce(T5) -> B,
{
match self {
Self::T1(t1) => Or7::<T1, T2, T3, T4, B, T6, T7>::T1(t1),
Self::T2(t2) => Or7::<T1, T2, T3, T4, B, T6, T7>::T2(t2),
Self::T3(t3) => Or7::<T1, T2, T3, T4, B, T6, T7>::T3(t3),
Self::T4(t4) => Or7::<T1, T2, T3, T4, B, T6, T7>::T4(t4),
Self::T5(t5) => Or7::<T1, T2, T3, T4, B, T6, T7>::T5(f(t5)),
Self::T6(t6) => Or7::<T1, T2, T3, T4, B, T6, T7>::T6(t6),
Self::T7(t7) => Or7::<T1, T2, T3, T4, B, T6, T7>::T7(t7),
}
}
pub fn map_t6<F, B>(self, f: F) -> Or7<T1, T2, T3, T4, T5, B, T7>
where
F: FnOnce(T6) -> B,
{
match self {
Self::T1(t1) => Or7::<T1, T2, T3, T4, T5, B, T7>::T1(t1),
Self::T2(t2) => Or7::<T1, T2, T3, T4, T5, B, T7>::T2(t2),
Self::T3(t3) => Or7::<T1, T2, T3, T4, T5, B, T7>::T3(t3),
Self::T4(t4) => Or7::<T1, T2, T3, T4, T5, B, T7>::T4(t4),
Self::T5(t5) => Or7::<T1, T2, T3, T4, T5, B, T7>::T5(t5),
Self::T6(t6) => Or7::<T1, T2, T3, T4, T5, B, T7>::T6(f(t6)),
Self::T7(t7) => Or7::<T1, T2, T3, T4, T5, B, T7>::T7(t7),
}
}
pub fn map_t7<F, B>(self, f: F) -> Or7<T1, T2, T3, T4, T5, T6, B>
where
F: FnOnce(T7) -> B,
{
match self {
Self::T1(t1) => Or7::<T1, T2, T3, T4, T5, T6, B>::T1(t1),
Self::T2(t2) => Or7::<T1, T2, T3, T4, T5, T6, B>::T2(t2),
Self::T3(t3) => Or7::<T1, T2, T3, T4, T5, T6, B>::T3(t3),
Self::T4(t4) => Or7::<T1, T2, T3, T4, T5, T6, B>::T4(t4),
Self::T5(t5) => Or7::<T1, T2, T3, T4, T5, T6, B>::T5(t5),
Self::T6(t6) => Or7::<T1, T2, T3, T4, T5, T6, B>::T6(t6),
Self::T7(t7) => Or7::<T1, T2, T3, T4, T5, T6, B>::T7(f(t7)),
}
}
pub fn fold<T, F0, F1, F2, F3, F4, F5, F6, F7>(
self,
f1: F1,
f2: F2,
f3: F3,
f4: F4,
f5: F5,
f6: F6,
f7: F7,
) -> T
where
F1: FnOnce(T1) -> T,
F2: FnOnce(T2) -> T,
F3: FnOnce(T3) -> T,
F4: FnOnce(T4) -> T,
F5: FnOnce(T5) -> T,
F6: FnOnce(T6) -> T,
F7: FnOnce(T7) -> T,
{
match self {
Self::T1(t1) => f1(t1),
Self::T2(t2) => f2(t2),
Self::T3(t3) => f3(t3),
Self::T4(t4) => f4(t4),
Self::T5(t5) => f5(t5),
Self::T6(t6) => f6(t6),
Self::T7(t7) => f7(t7),
}
}
}
impl<T1, T2, T3, T4, T5, T6, T7> Or7<T1, T2, T3, T4, T5, T6, T7>
where
T1: 'static,
T2: 'static,
T3: 'static,
T4: 'static,
T5: 'static,
T6: 'static,
T7: 'static,
{
pub fn is_type<T: 'static>(&self) -> bool {
match self {
Self::T1(_) => TypeId::of::<T>() == TypeId::of::<T1>(),
Self::T2(_) => TypeId::of::<T>() == TypeId::of::<T2>(),
Self::T3(_) => TypeId::of::<T>() == TypeId::of::<T3>(),
Self::T4(_) => TypeId::of::<T>() == TypeId::of::<T4>(),
Self::T5(_) => TypeId::of::<T>() == TypeId::of::<T5>(),
Self::T6(_) => TypeId::of::<T>() == TypeId::of::<T6>(),
Self::T7(_) => TypeId::of::<T>() == TypeId::of::<T7>(),
}
}
}
pub enum Or8<T1, T2, T3, T4, T5, T6, T7, T8> {
T1(T1),
T2(T2),
T3(T3),
T4(T4),
T5(T5),
T6(T6),
T7(T7),
T8(T8),
}
impl<T1, T2, T3, T4, T5, T6, T7, T8> Or8<T1, T2, T3, T4, T5, T6, T7, T8> {
pub fn is_t1(&self) -> bool {
match self {
Self::T1(_) => true,
_ => false,
}
}
pub fn is_t2(&self) -> bool {
match self {
Self::T2(_) => true,
_ => false,
}
}
pub fn is_t3(&self) -> bool {
match self {
Self::T3(_) => true,
_ => false,
}
}
pub fn is_t4(&self) -> bool {
match self {
Self::T4(_) => true,
_ => false,
}
}
pub fn is_t5(&self) -> bool {
match self {
Self::T5(_) => true,
_ => false,
}
}
pub fn is_t6(&self) -> bool {
match self {
Self::T6(_) => true,
_ => false,
}
}
pub fn is_t7(&self) -> bool {
match self {
Self::T7(_) => true,
_ => false,
}
}
pub fn is_t8(&self) -> bool {
match self {
Self::T8(_) => true,
_ => false,
}
}
pub fn as_t1(self) -> Option<T1> {
match self {
Self::T1(t1) => Some(t1),
_ => None,
}
}
pub fn as_t2(self) -> Option<T2> {
match self {
Self::T2(t2) => Some(t2),
_ => None,
}
}
pub fn as_t3(self) -> Option<T3> {
match self {
Self::T3(t3) => Some(t3),
_ => None,
}
}
pub fn as_t4(self) -> Option<T4> {
match self {
Self::T4(t4) => Some(t4),
_ => None,
}
}
pub fn as_t5(self) -> Option<T5> {
match self {
Self::T5(t5) => Some(t5),
_ => None,
}
}
pub fn as_t6(self) -> Option<T6> {
match self {
Self::T6(t6) => Some(t6),
_ => None,
}
}
pub fn as_t7(self) -> Option<T7> {
match self {
Self::T7(t7) => Some(t7),
_ => None,
}
}
pub fn as_t8(self) -> Option<T8> {
match self {
Self::T8(t8) => Some(t8),
_ => None,
}
}
pub fn map_t1<F, B>(self, f: F) -> Or8<B, T2, T3, T4, T5, T6, T7, T8>
where
F: FnOnce(T1) -> B,
{
match self {
Self::T1(t1) => Or8::<B, T2, T3, T4, T5, T6, T7, T8>::T1(f(t1)),
Self::T2(t2) => Or8::<B, T2, T3, T4, T5, T6, T7, T8>::T2(t2),
Self::T3(t3) => Or8::<B, T2, T3, T4, T5, T6, T7, T8>::T3(t3),
Self::T4(t4) => Or8::<B, T2, T3, T4, T5, T6, T7, T8>::T4(t4),
Self::T5(t5) => Or8::<B, T2, T3, T4, T5, T6, T7, T8>::T5(t5),
Self::T6(t6) => Or8::<B, T2, T3, T4, T5, T6, T7, T8>::T6(t6),
Self::T7(t7) => Or8::<B, T2, T3, T4, T5, T6, T7, T8>::T7(t7),
Self::T8(t8) => Or8::<B, T2, T3, T4, T5, T6, T7, T8>::T8(t8),
}
}
pub fn map_t2<F, B>(self, f: F) -> Or8<T1, B, T3, T4, T5, T6, T7, T8>
where
F: FnOnce(T2) -> B,
{
match self {
Self::T1(t1) => Or8::<T1, B, T3, T4, T5, T6, T7, T8>::T1(t1),
Self::T2(t2) => Or8::<T1, B, T3, T4, T5, T6, T7, T8>::T2(f(t2)),
Self::T3(t3) => Or8::<T1, B, T3, T4, T5, T6, T7, T8>::T3(t3),
Self::T4(t4) => Or8::<T1, B, T3, T4, T5, T6, T7, T8>::T4(t4),
Self::T5(t5) => Or8::<T1, B, T3, T4, T5, T6, T7, T8>::T5(t5),
Self::T6(t6) => Or8::<T1, B, T3, T4, T5, T6, T7, T8>::T6(t6),
Self::T7(t7) => Or8::<T1, B, T3, T4, T5, T6, T7, T8>::T7(t7),
Self::T8(t8) => Or8::<T1, B, T3, T4, T5, T6, T7, T8>::T8(t8),
}
}
pub fn map_t3<F, B>(self, f: F) -> Or8<T1, T2, B, T4, T5, T6, T7, T8>
where
F: FnOnce(T3) -> B,
{
match self {
Self::T1(t1) => Or8::<T1, T2, B, T4, T5, T6, T7, T8>::T1(t1),
Self::T2(t2) => Or8::<T1, T2, B, T4, T5, T6, T7, T8>::T2(t2),
Self::T3(t3) => Or8::<T1, T2, B, T4, T5, T6, T7, T8>::T3(f(t3)),
Self::T4(t4) => Or8::<T1, T2, B, T4, T5, T6, T7, T8>::T4(t4),
Self::T5(t5) => Or8::<T1, T2, B, T4, T5, T6, T7, T8>::T5(t5),
Self::T6(t6) => Or8::<T1, T2, B, T4, T5, T6, T7, T8>::T6(t6),
Self::T7(t7) => Or8::<T1, T2, B, T4, T5, T6, T7, T8>::T7(t7),
Self::T8(t8) => Or8::<T1, T2, B, T4, T5, T6, T7, T8>::T8(t8),
}
}
pub fn map_t4<F, B>(self, f: F) -> Or8<T1, T2, T3, B, T5, T6, T7, T8>
where
F: FnOnce(T4) -> B,
{
match self {
Self::T1(t1) => Or8::<T1, T2, T3, B, T5, T6, T7, T8>::T1(t1),
Self::T2(t2) => Or8::<T1, T2, T3, B, T5, T6, T7, T8>::T2(t2),
Self::T3(t3) => Or8::<T1, T2, T3, B, T5, T6, T7, T8>::T3(t3),
Self::T4(t4) => Or8::<T1, T2, T3, B, T5, T6, T7, T8>::T4(f(t4)),
Self::T5(t5) => Or8::<T1, T2, T3, B, T5, T6, T7, T8>::T5(t5),
Self::T6(t6) => Or8::<T1, T2, T3, B, T5, T6, T7, T8>::T6(t6),
Self::T7(t7) => Or8::<T1, T2, T3, B, T5, T6, T7, T8>::T7(t7),
Self::T8(t8) => Or8::<T1, T2, T3, B, T5, T6, T7, T8>::T8(t8),
}
}
pub fn map_t5<F, B>(self, f: F) -> Or8<T1, T2, T3, T4, B, T6, T7, T8>
where
F: FnOnce(T5) -> B,
{
match self {
Self::T1(t1) => Or8::<T1, T2, T3, T4, B, T6, T7, T8>::T1(t1),
Self::T2(t2) => Or8::<T1, T2, T3, T4, B, T6, T7, T8>::T2(t2),
Self::T3(t3) => Or8::<T1, T2, T3, T4, B, T6, T7, T8>::T3(t3),
Self::T4(t4) => Or8::<T1, T2, T3, T4, B, T6, T7, T8>::T4(t4),
Self::T5(t5) => Or8::<T1, T2, T3, T4, B, T6, T7, T8>::T5(f(t5)),
Self::T6(t6) => Or8::<T1, T2, T3, T4, B, T6, T7, T8>::T6(t6),
Self::T7(t7) => Or8::<T1, T2, T3, T4, B, T6, T7, T8>::T7(t7),
Self::T8(t8) => Or8::<T1, T2, T3, T4, B, T6, T7, T8>::T8(t8),
}
}
pub fn map_t6<F, B>(self, f: F) -> Or8<T1, T2, T3, T4, T5, B, T7, T8>
where
F: FnOnce(T6) -> B,
{
match self {
Self::T1(t1) => Or8::<T1, T2, T3, T4, T5, B, T7, T8>::T1(t1),
Self::T2(t2) => Or8::<T1, T2, T3, T4, T5, B, T7, T8>::T2(t2),
Self::T3(t3) => Or8::<T1, T2, T3, T4, T5, B, T7, T8>::T3(t3),
Self::T4(t4) => Or8::<T1, T2, T3, T4, T5, B, T7, T8>::T4(t4),
Self::T5(t5) => Or8::<T1, T2, T3, T4, T5, B, T7, T8>::T5(t5),
Self::T6(t6) => Or8::<T1, T2, T3, T4, T5, B, T7, T8>::T6(f(t6)),
Self::T7(t7) => Or8::<T1, T2, T3, T4, T5, B, T7, T8>::T7(t7),
Self::T8(t8) => Or8::<T1, T2, T3, T4, T5, B, T7, T8>::T8(t8),
}
}
pub fn map_t7<F, B>(self, f: F) -> Or8<T1, T2, T3, T4, T5, T6, B, T8>
where
F: FnOnce(T7) -> B,
{
match self {
Self::T1(t1) => Or8::<T1, T2, T3, T4, T5, T6, B, T8>::T1(t1),
Self::T2(t2) => Or8::<T1, T2, T3, T4, T5, T6, B, T8>::T2(t2),
Self::T3(t3) => Or8::<T1, T2, T3, T4, T5, T6, B, T8>::T3(t3),
Self::T4(t4) => Or8::<T1, T2, T3, T4, T5, T6, B, T8>::T4(t4),
Self::T5(t5) => Or8::<T1, T2, T3, T4, T5, T6, B, T8>::T5(t5),
Self::T6(t6) => Or8::<T1, T2, T3, T4, T5, T6, B, T8>::T6(t6),
Self::T7(t7) => Or8::<T1, T2, T3, T4, T5, T6, B, T8>::T7(f(t7)),
Self::T8(t8) => Or8::<T1, T2, T3, T4, T5, T6, B, T8>::T8(t8),
}
}
pub fn map_t8<F, B>(self, f: F) -> Or8<T1, T2, T3, T4, T5, T6, T7, B>
where
F: FnOnce(T8) -> B,
{
match self {
Self::T1(t1) => Or8::<T1, T2, T3, T4, T5, T6, T7, B>::T1(t1),
Self::T2(t2) => Or8::<T1, T2, T3, T4, T5, T6, T7, B>::T2(t2),
Self::T3(t3) => Or8::<T1, T2, T3, T4, T5, T6, T7, B>::T3(t3),
Self::T4(t4) => Or8::<T1, T2, T3, T4, T5, T6, T7, B>::T4(t4),
Self::T5(t5) => Or8::<T1, T2, T3, T4, T5, T6, T7, B>::T5(t5),
Self::T6(t6) => Or8::<T1, T2, T3, T4, T5, T6, T7, B>::T6(t6),
Self::T7(t7) => Or8::<T1, T2, T3, T4, T5, T6, T7, B>::T7(t7),
Self::T8(t8) => Or8::<T1, T2, T3, T4, T5, T6, T7, B>::T8(f(t8)),
}
}
pub fn fold<T, F0, F1, F2, F3, F4, F5, F6, F7, F8>(
self,
f1: F1,
f2: F2,
f3: F3,
f4: F4,
f5: F5,
f6: F6,
f7: F7,
f8: F8,
) -> T
where
F1: FnOnce(T1) -> T,
F2: FnOnce(T2) -> T,
F3: FnOnce(T3) -> T,
F4: FnOnce(T4) -> T,
F5: FnOnce(T5) -> T,
F6: FnOnce(T6) -> T,
F7: FnOnce(T7) -> T,
F8: FnOnce(T8) -> T,
{
match self {
Self::T1(t1) => f1(t1),
Self::T2(t2) => f2(t2),
Self::T3(t3) => f3(t3),
Self::T4(t4) => f4(t4),
Self::T5(t5) => f5(t5),
Self::T6(t6) => f6(t6),
Self::T7(t7) => f7(t7),
Self::T8(t8) => f8(t8),
}
}
}
impl<T1, T2, T3, T4, T5, T6, T7, T8> Or8<T1, T2, T3, T4, T5, T6, T7, T8>
where
T1: 'static,
T2: 'static,
T3: 'static,
T4: 'static,
T5: 'static,
T6: 'static,
T7: 'static,
T8: 'static,
{
pub fn is_type<T: 'static>(&self) -> bool {
match self {
Self::T1(_) => TypeId::of::<T>() == TypeId::of::<T1>(),
Self::T2(_) => TypeId::of::<T>() == TypeId::of::<T2>(),
Self::T3(_) => TypeId::of::<T>() == TypeId::of::<T3>(),
Self::T4(_) => TypeId::of::<T>() == TypeId::of::<T4>(),
Self::T5(_) => TypeId::of::<T>() == TypeId::of::<T5>(),
Self::T6(_) => TypeId::of::<T>() == TypeId::of::<T6>(),
Self::T7(_) => TypeId::of::<T>() == TypeId::of::<T7>(),
Self::T8(_) => TypeId::of::<T>() == TypeId::of::<T8>(),
}
}
}
pub enum Or9<T1, T2, T3, T4, T5, T6, T7, T8, T9> {
T1(T1),
T2(T2),
T3(T3),
T4(T4),
T5(T5),
T6(T6),
T7(T7),
T8(T8),
T9(T9),
}
impl<T1, T2, T3, T4, T5, T6, T7, T8, T9> Or9<T1, T2, T3, T4, T5, T6, T7, T8, T9> {
pub fn is_t1(&self) -> bool {
match self {
Self::T1(_) => true,
_ => false,
}
}
pub fn is_t2(&self) -> bool {
match self {
Self::T2(_) => true,
_ => false,
}
}
pub fn is_t3(&self) -> bool {
match self {
Self::T3(_) => true,
_ => false,
}
}
pub fn is_t4(&self) -> bool {
match self {
Self::T4(_) => true,
_ => false,
}
}
pub fn is_t5(&self) -> bool {
match self {
Self::T5(_) => true,
_ => false,
}
}
pub fn is_t6(&self) -> bool {
match self {
Self::T6(_) => true,
_ => false,
}
}
pub fn is_t7(&self) -> bool {
match self {
Self::T7(_) => true,
_ => false,
}
}
pub fn is_t8(&self) -> bool {
match self {
Self::T8(_) => true,
_ => false,
}
}
pub fn is_t9(&self) -> bool {
match self {
Self::T9(_) => true,
_ => false,
}
}
pub fn as_t1(self) -> Option<T1> {
match self {
Self::T1(t1) => Some(t1),
_ => None,
}
}
pub fn as_t2(self) -> Option<T2> {
match self {
Self::T2(t2) => Some(t2),
_ => None,
}
}
pub fn as_t3(self) -> Option<T3> {
match self {
Self::T3(t3) => Some(t3),
_ => None,
}
}
pub fn as_t4(self) -> Option<T4> {
match self {
Self::T4(t4) => Some(t4),
_ => None,
}
}
pub fn as_t5(self) -> Option<T5> {
match self {
Self::T5(t5) => Some(t5),
_ => None,
}
}
pub fn as_t6(self) -> Option<T6> {
match self {
Self::T6(t6) => Some(t6),
_ => None,
}
}
pub fn as_t7(self) -> Option<T7> {
match self {
Self::T7(t7) => Some(t7),
_ => None,
}
}
pub fn as_t8(self) -> Option<T8> {
match self {
Self::T8(t8) => Some(t8),
_ => None,
}
}
pub fn as_t9(self) -> Option<T9> {
match self {
Self::T9(t9) => Some(t9),
_ => None,
}
}
pub fn map_t1<F, B>(self, f: F) -> Or9<B, T2, T3, T4, T5, T6, T7, T8, T9>
where
F: FnOnce(T1) -> B,
{
match self {
Self::T1(t1) => Or9::<B, T2, T3, T4, T5, T6, T7, T8, T9>::T1(f(t1)),
Self::T2(t2) => Or9::<B, T2, T3, T4, T5, T6, T7, T8, T9>::T2(t2),
Self::T3(t3) => Or9::<B, T2, T3, T4, T5, T6, T7, T8, T9>::T3(t3),
Self::T4(t4) => Or9::<B, T2, T3, T4, T5, T6, T7, T8, T9>::T4(t4),
Self::T5(t5) => Or9::<B, T2, T3, T4, T5, T6, T7, T8, T9>::T5(t5),
Self::T6(t6) => Or9::<B, T2, T3, T4, T5, T6, T7, T8, T9>::T6(t6),
Self::T7(t7) => Or9::<B, T2, T3, T4, T5, T6, T7, T8, T9>::T7(t7),
Self::T8(t8) => Or9::<B, T2, T3, T4, T5, T6, T7, T8, T9>::T8(t8),
Self::T9(t9) => Or9::<B, T2, T3, T4, T5, T6, T7, T8, T9>::T9(t9),
}
}
pub fn map_t2<F, B>(self, f: F) -> Or9<T1, B, T3, T4, T5, T6, T7, T8, T9>
where
F: FnOnce(T2) -> B,
{
match self {
Self::T1(t1) => Or9::<T1, B, T3, T4, T5, T6, T7, T8, T9>::T1(t1),
Self::T2(t2) => Or9::<T1, B, T3, T4, T5, T6, T7, T8, T9>::T2(f(t2)),
Self::T3(t3) => Or9::<T1, B, T3, T4, T5, T6, T7, T8, T9>::T3(t3),
Self::T4(t4) => Or9::<T1, B, T3, T4, T5, T6, T7, T8, T9>::T4(t4),
Self::T5(t5) => Or9::<T1, B, T3, T4, T5, T6, T7, T8, T9>::T5(t5),
Self::T6(t6) => Or9::<T1, B, T3, T4, T5, T6, T7, T8, T9>::T6(t6),
Self::T7(t7) => Or9::<T1, B, T3, T4, T5, T6, T7, T8, T9>::T7(t7),
Self::T8(t8) => Or9::<T1, B, T3, T4, T5, T6, T7, T8, T9>::T8(t8),
Self::T9(t9) => Or9::<T1, B, T3, T4, T5, T6, T7, T8, T9>::T9(t9),
}
}
pub fn map_t3<F, B>(self, f: F) -> Or9<T1, T2, B, T4, T5, T6, T7, T8, T9>
where
F: FnOnce(T3) -> B,
{
match self {
Self::T1(t1) => Or9::<T1, T2, B, T4, T5, T6, T7, T8, T9>::T1(t1),
Self::T2(t2) => Or9::<T1, T2, B, T4, T5, T6, T7, T8, T9>::T2(t2),
Self::T3(t3) => Or9::<T1, T2, B, T4, T5, T6, T7, T8, T9>::T3(f(t3)),
Self::T4(t4) => Or9::<T1, T2, B, T4, T5, T6, T7, T8, T9>::T4(t4),
Self::T5(t5) => Or9::<T1, T2, B, T4, T5, T6, T7, T8, T9>::T5(t5),
Self::T6(t6) => Or9::<T1, T2, B, T4, T5, T6, T7, T8, T9>::T6(t6),
Self::T7(t7) => Or9::<T1, T2, B, T4, T5, T6, T7, T8, T9>::T7(t7),
Self::T8(t8) => Or9::<T1, T2, B, T4, T5, T6, T7, T8, T9>::T8(t8),
Self::T9(t9) => Or9::<T1, T2, B, T4, T5, T6, T7, T8, T9>::T9(t9),
}
}
pub fn map_t4<F, B>(self, f: F) -> Or9<T1, T2, T3, B, T5, T6, T7, T8, T9>
where
F: FnOnce(T4) -> B,
{
match self {
Self::T1(t1) => Or9::<T1, T2, T3, B, T5, T6, T7, T8, T9>::T1(t1),
Self::T2(t2) => Or9::<T1, T2, T3, B, T5, T6, T7, T8, T9>::T2(t2),
Self::T3(t3) => Or9::<T1, T2, T3, B, T5, T6, T7, T8, T9>::T3(t3),
Self::T4(t4) => Or9::<T1, T2, T3, B, T5, T6, T7, T8, T9>::T4(f(t4)),
Self::T5(t5) => Or9::<T1, T2, T3, B, T5, T6, T7, T8, T9>::T5(t5),
Self::T6(t6) => Or9::<T1, T2, T3, B, T5, T6, T7, T8, T9>::T6(t6),
Self::T7(t7) => Or9::<T1, T2, T3, B, T5, T6, T7, T8, T9>::T7(t7),
Self::T8(t8) => Or9::<T1, T2, T3, B, T5, T6, T7, T8, T9>::T8(t8),
Self::T9(t9) => Or9::<T1, T2, T3, B, T5, T6, T7, T8, T9>::T9(t9),
}
}
pub fn map_t5<F, B>(self, f: F) -> Or9<T1, T2, T3, T4, B, T6, T7, T8, T9>
where
F: FnOnce(T5) -> B,
{
match self {
Self::T1(t1) => Or9::<T1, T2, T3, T4, B, T6, T7, T8, T9>::T1(t1),
Self::T2(t2) => Or9::<T1, T2, T3, T4, B, T6, T7, T8, T9>::T2(t2),
Self::T3(t3) => Or9::<T1, T2, T3, T4, B, T6, T7, T8, T9>::T3(t3),
Self::T4(t4) => Or9::<T1, T2, T3, T4, B, T6, T7, T8, T9>::T4(t4),
Self::T5(t5) => Or9::<T1, T2, T3, T4, B, T6, T7, T8, T9>::T5(f(t5)),
Self::T6(t6) => Or9::<T1, T2, T3, T4, B, T6, T7, T8, T9>::T6(t6),
Self::T7(t7) => Or9::<T1, T2, T3, T4, B, T6, T7, T8, T9>::T7(t7),
Self::T8(t8) => Or9::<T1, T2, T3, T4, B, T6, T7, T8, T9>::T8(t8),
Self::T9(t9) => Or9::<T1, T2, T3, T4, B, T6, T7, T8, T9>::T9(t9),
}
}
pub fn map_t6<F, B>(self, f: F) -> Or9<T1, T2, T3, T4, T5, B, T7, T8, T9>
where
F: FnOnce(T6) -> B,
{
match self {
Self::T1(t1) => Or9::<T1, T2, T3, T4, T5, B, T7, T8, T9>::T1(t1),
Self::T2(t2) => Or9::<T1, T2, T3, T4, T5, B, T7, T8, T9>::T2(t2),
Self::T3(t3) => Or9::<T1, T2, T3, T4, T5, B, T7, T8, T9>::T3(t3),
Self::T4(t4) => Or9::<T1, T2, T3, T4, T5, B, T7, T8, T9>::T4(t4),
Self::T5(t5) => Or9::<T1, T2, T3, T4, T5, B, T7, T8, T9>::T5(t5),
Self::T6(t6) => Or9::<T1, T2, T3, T4, T5, B, T7, T8, T9>::T6(f(t6)),
Self::T7(t7) => Or9::<T1, T2, T3, T4, T5, B, T7, T8, T9>::T7(t7),
Self::T8(t8) => Or9::<T1, T2, T3, T4, T5, B, T7, T8, T9>::T8(t8),
Self::T9(t9) => Or9::<T1, T2, T3, T4, T5, B, T7, T8, T9>::T9(t9),
}
}
pub fn map_t7<F, B>(self, f: F) -> Or9<T1, T2, T3, T4, T5, T6, B, T8, T9>
where
F: FnOnce(T7) -> B,
{
match self {
Self::T1(t1) => Or9::<T1, T2, T3, T4, T5, T6, B, T8, T9>::T1(t1),
Self::T2(t2) => Or9::<T1, T2, T3, T4, T5, T6, B, T8, T9>::T2(t2),
Self::T3(t3) => Or9::<T1, T2, T3, T4, T5, T6, B, T8, T9>::T3(t3),
Self::T4(t4) => Or9::<T1, T2, T3, T4, T5, T6, B, T8, T9>::T4(t4),
Self::T5(t5) => Or9::<T1, T2, T3, T4, T5, T6, B, T8, T9>::T5(t5),
Self::T6(t6) => Or9::<T1, T2, T3, T4, T5, T6, B, T8, T9>::T6(t6),
Self::T7(t7) => Or9::<T1, T2, T3, T4, T5, T6, B, T8, T9>::T7(f(t7)),
Self::T8(t8) => Or9::<T1, T2, T3, T4, T5, T6, B, T8, T9>::T8(t8),
Self::T9(t9) => Or9::<T1, T2, T3, T4, T5, T6, B, T8, T9>::T9(t9),
}
}
pub fn map_t8<F, B>(self, f: F) -> Or9<T1, T2, T3, T4, T5, T6, T7, B, T9>
where
F: FnOnce(T8) -> B,
{
match self {
Self::T1(t1) => Or9::<T1, T2, T3, T4, T5, T6, T7, B, T9>::T1(t1),
Self::T2(t2) => Or9::<T1, T2, T3, T4, T5, T6, T7, B, T9>::T2(t2),
Self::T3(t3) => Or9::<T1, T2, T3, T4, T5, T6, T7, B, T9>::T3(t3),
Self::T4(t4) => Or9::<T1, T2, T3, T4, T5, T6, T7, B, T9>::T4(t4),
Self::T5(t5) => Or9::<T1, T2, T3, T4, T5, T6, T7, B, T9>::T5(t5),
Self::T6(t6) => Or9::<T1, T2, T3, T4, T5, T6, T7, B, T9>::T6(t6),
Self::T7(t7) => Or9::<T1, T2, T3, T4, T5, T6, T7, B, T9>::T7(t7),
Self::T8(t8) => Or9::<T1, T2, T3, T4, T5, T6, T7, B, T9>::T8(f(t8)),
Self::T9(t9) => Or9::<T1, T2, T3, T4, T5, T6, T7, B, T9>::T9(t9),
}
}
pub fn map_t9<F, B>(self, f: F) -> Or9<T1, T2, T3, T4, T5, T6, T7, T8, B>
where
F: FnOnce(T9) -> B,
{
match self {
Self::T1(t1) => Or9::<T1, T2, T3, T4, T5, T6, T7, T8, B>::T1(t1),
Self::T2(t2) => Or9::<T1, T2, T3, T4, T5, T6, T7, T8, B>::T2(t2),
Self::T3(t3) => Or9::<T1, T2, T3, T4, T5, T6, T7, T8, B>::T3(t3),
Self::T4(t4) => Or9::<T1, T2, T3, T4, T5, T6, T7, T8, B>::T4(t4),
Self::T5(t5) => Or9::<T1, T2, T3, T4, T5, T6, T7, T8, B>::T5(t5),
Self::T6(t6) => Or9::<T1, T2, T3, T4, T5, T6, T7, T8, B>::T6(t6),
Self::T7(t7) => Or9::<T1, T2, T3, T4, T5, T6, T7, T8, B>::T7(t7),
Self::T8(t8) => Or9::<T1, T2, T3, T4, T5, T6, T7, T8, B>::T8(t8),
Self::T9(t9) => Or9::<T1, T2, T3, T4, T5, T6, T7, T8, B>::T9(f(t9)),
}
}
pub fn fold<T, F0, F1, F2, F3, F4, F5, F6, F7, F8, F9>(
self,
f1: F1,
f2: F2,
f3: F3,
f4: F4,
f5: F5,
f6: F6,
f7: F7,
f8: F8,
f9: F9,
) -> T
where
F1: FnOnce(T1) -> T,
F2: FnOnce(T2) -> T,
F3: FnOnce(T3) -> T,
F4: FnOnce(T4) -> T,
F5: FnOnce(T5) -> T,
F6: FnOnce(T6) -> T,
F7: FnOnce(T7) -> T,
F8: FnOnce(T8) -> T,
F9: FnOnce(T9) -> T,
{
match self {
Self::T1(t1) => f1(t1),
Self::T2(t2) => f2(t2),
Self::T3(t3) => f3(t3),
Self::T4(t4) => f4(t4),
Self::T5(t5) => f5(t5),
Self::T6(t6) => f6(t6),
Self::T7(t7) => f7(t7),
Self::T8(t8) => f8(t8),
Self::T9(t9) => f9(t9),
}
}
}
impl<T1, T2, T3, T4, T5, T6, T7, T8, T9> Or9<T1, T2, T3, T4, T5, T6, T7, T8, T9>
where
T1: 'static,
T2: 'static,
T3: 'static,
T4: 'static,
T5: 'static,
T6: 'static,
T7: 'static,
T8: 'static,
T9: 'static,
{
pub fn is_type<T: 'static>(&self) -> bool {
match self {
Self::T1(_) => TypeId::of::<T>() == TypeId::of::<T1>(),
Self::T2(_) => TypeId::of::<T>() == TypeId::of::<T2>(),
Self::T3(_) => TypeId::of::<T>() == TypeId::of::<T3>(),
Self::T4(_) => TypeId::of::<T>() == TypeId::of::<T4>(),
Self::T5(_) => TypeId::of::<T>() == TypeId::of::<T5>(),
Self::T6(_) => TypeId::of::<T>() == TypeId::of::<T6>(),
Self::T7(_) => TypeId::of::<T>() == TypeId::of::<T7>(),
Self::T8(_) => TypeId::of::<T>() == TypeId::of::<T8>(),
Self::T9(_) => TypeId::of::<T>() == TypeId::of::<T9>(),
}
}
}