pub trait TeeInternal<const N: usize> {
type Output: Clone;
fn tee_internal(self) -> Self::Output;
}
pub trait Tee {
fn tee<const N: usize>(self) -> <Self as TeeInternal<N>>::Output
where
Self: TeeInternal<N>;
}
impl<T: Clone> Tee for T {
fn tee<const N: usize>(self) -> <Self as TeeInternal<N>>::Output
where
Self: TeeInternal<N>,
{
self.tee_internal()
}
}
macro_rules! gen_tee {
($($x:ty),*) => {
impl<T: Clone> TeeInternal<{${count(x)} + 1}> for T {
type Output = ($($x),*, T);
fn tee_internal(self) -> Self::Output {
($( ${ignore(x)} self.clone() ),*, self)
}
}
};
}
gen_tee!(T);
gen_tee!(T, T);
gen_tee!(T, T, T);
gen_tee!(T, T, T, T);
gen_tee!(T, T, T, T, T);
gen_tee!(T, T, T, T, T, T);
gen_tee!(T, T, T, T, T, T, T);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_test1() {
let x = "test".tee::<2>();
assert_eq!(x.0, x.1);
assert_eq!(x.0, "test");
}
}