use batch_impl::batch_impl;
struct SplatA;
struct SplatB;
struct SplatC;
struct SplatD;
struct SplatE;
struct Pair<A, B>(A, B);
struct Triple<A, B, C>(A, B, C);
#[batch_impl((*(*[SplatD, SplatE])))]
trait SplatNested {}
#[batch_impl([SplatA, *()])]
trait SplatEmpty {}
#[test]
fn splat_idempotent_and_empty() {
fn assert_n<T: SplatNested>() {}
assert_n::<(SplatD, SplatE)>();
fn assert_e<T: SplatEmpty>() {}
assert_e::<SplatA>();
}
#[batch_impl((*(SplatA,)))]
trait SplatTrailingComma {}
#[batch_impl((SplatA, *(), SplatB))]
trait SplatMiddleEmpty {}
#[test]
fn splat_trailing_comma_and_middle_empty() {
fn assert_t<T: SplatTrailingComma>() {}
assert_t::<(SplatA,)>();
fn assert_m<T: SplatMiddleEmpty>() {}
assert_m::<(SplatA, SplatB)>();
}
#[batch_impl([*(SplatA, SplatB)])]
trait SplatLoneArray {}
#[test]
fn splat_lone_array() {
fn assert_t<T: SplatLoneArray>() {}
assert_t::<SplatA>();
assert_t::<SplatB>();
}
#[batch_impl(Pair<*(SplatA, SplatB)>)]
trait SplatGenArgs {}
#[batch_impl(Pair<*(SplatA, *(SplatB))>)]
trait SplatGenArgsNested {}
#[test]
fn splat_generic_args() {
fn assert_t<T: SplatGenArgs>() {}
assert_t::<Pair<SplatA, SplatB>>();
fn assert_n<T: SplatGenArgsNested>() {}
assert_n::<Pair<SplatA, SplatB>>();
}
#[batch_impl(Pair^*[Vec, Box]^u16)]
trait SplatRule2 {}
#[batch_impl(Pair^*(Vec<u8>, Box<u8>))]
trait SplatRule1 {}
#[batch_impl((SplatA, SplatB)^*(SplatC, SplatD))]
trait SplatConcat2 {}
#[batch_impl(Triple^*(SplatA, SplatB)^SplatC)]
trait SplatParenAppend {}
#[batch_impl(*(SplatA, SplatB)^SplatC)]
trait SplatParenLeft {}
#[batch_impl(*[Vec, Box]^SplatC)]
trait SplatBracketLeft {}
#[test]
fn splat_rules() {
fn assert_r2<T: SplatRule2>() {}
assert_r2::<Pair<Vec<u16>, Box<u16>>>();
fn assert_r1<T: SplatRule1>() {}
assert_r1::<Pair<Vec<u8>, Box<u8>>>();
fn assert_c<T: SplatConcat2>() {}
assert_c::<(SplatA, SplatB, SplatC, SplatD)>();
fn assert_pa<T: SplatParenAppend>() {}
assert_pa::<Triple<SplatA, SplatB, SplatC>>();
fn assert_pl<T: SplatParenLeft>() {}
assert_pl::<SplatA>();
assert_pl::<SplatB>();
assert_pl::<SplatC>();
fn assert_bl<T: SplatBracketLeft>() {}
assert_bl::<Vec<SplatC>>();
assert_bl::<Box<SplatC>>();
}
#[batch_impl(Pair^*(SplatA, SplatB)^2)]
trait SplatTuplePow {}
#[batch_impl(Pair^*()^2)]
trait SplatEmptyPowCarrier {}
#[test]
fn splat_pow() {
fn assert_p<T: SplatTuplePow>() {}
assert_p::<Pair<SplatA, SplatA>>();
assert_p::<Pair<SplatA, SplatB>>();
assert_p::<Pair<SplatB, SplatA>>();
assert_p::<Pair<SplatB, SplatB>>();
fn assert_c<T: SplatEmptyPowCarrier>() {}
assert_c::<Pair<SplatA, SplatB>>();
}
#[batch_impl(*((SplatA, SplatB)))]
trait SplatTupleKeep {}
#[batch_impl(*(SplatA, SplatB, (SplatC, SplatD)))]
trait SplatTupleKeepList {}
#[batch_impl(*(SplatA, SplatB)^(SplatC, SplatD))]
trait SplatGroupRight {}
#[batch_impl(Pair^*(*@u*)^2)]
trait RepeatList {}
#[test]
fn splat_one_layer() {
fn assert_k<T: SplatTupleKeep>() {}
assert_k::<(SplatA, SplatB)>();
fn assert_kl<T: SplatTupleKeepList>() {}
assert_kl::<SplatA>();
assert_kl::<SplatB>();
assert_kl::<(SplatC, SplatD)>();
fn assert_gr<T: SplatGroupRight>() {}
assert_gr::<SplatA>();
assert_gr::<SplatB>();
assert_gr::<(SplatC, SplatD)>();
fn assert_rl<T: RepeatList>() {}
assert_rl::<Pair<u8, u8>>();
assert_rl::<Pair<u8, usize>>();
assert_rl::<Pair<u128, u32>>();
assert_rl::<Pair<usize, usize>>();
}