use std::marker::PhantomData;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
pub struct Unset;
#[derive(Debug)]
pub struct Set<Value>(PhantomData<fn() -> Value>);
#[diagnostic::on_unimplemented(
message = "a table sets this setting twice: `{Self}` and `{Other}`",
label = "set twice",
note = "a table sets each setting once: drop one of the two setter calls on its `InboxSpec` or \
`OutboxSpec`, and the marker from `type Table`"
)]
pub trait Merge<Other> {
type Out;
}
impl<Other> Merge<Other> for Unset {
type Out = Other;
}
impl<Value> Merge<Unset> for Set<Value> {
type Out = Self;
}
pub trait Push<New> {
type Out;
}
impl<New> Push<New> for () {
type Out = (New,);
}
macro_rules! push {
($($each:ident),+) => {
impl<$($each,)+ New> Push<New> for ($($each,)+) {
type Out = ($($each,)+ New);
}
};
}
push!(Setting1);
push!(Setting1, Setting2);
push!(Setting1, Setting2, Setting3);
push!(Setting1, Setting2, Setting3, Setting4);
push!(Setting1, Setting2, Setting3, Setting4, Setting5);
push!(Setting1, Setting2, Setting3, Setting4, Setting5, Setting6);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7
);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8
);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9
);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
Setting10
);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
Setting10, Setting11
);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
Setting10, Setting11, Setting12
);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
Setting10, Setting11, Setting12, Setting13
);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
Setting10, Setting11, Setting12, Setting13, Setting14
);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
Setting10, Setting11, Setting12, Setting13, Setting14, Setting15
);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
Setting10, Setting11, Setting12, Setting13, Setting14, Setting15, Setting16
);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
Setting10, Setting11, Setting12, Setting13, Setting14, Setting15, Setting16, Setting17
);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
Setting10, Setting11, Setting12, Setting13, Setting14, Setting15, Setting16, Setting17,
Setting18
);
push!(
Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
Setting10, Setting11, Setting12, Setting13, Setting14, Setting15, Setting16, Setting17,
Setting18, Setting19
);