use varihappy::{Tuple, Tuple1, Tuple2}; type HeadOf = ::Item0; type RestOf = <<<::Rest as Tuple>::Reversed as Tuple1>::Rest as Tuple>::Reversed; type TailOf = <<::Rest as Tuple>::Reversed as Tuple1>::Item0; fn split(tuple: T) -> (HeadOf, RestOf, TailOf) where T: Tuple2, <::Rest as Tuple>::Reversed: Tuple1, { let (head, rest) = tuple.split_into(); let (tail, rest) = rest.rev().split_into(); (head, rest.rev(), tail) } fn main() { let (_head, _rest, _tail): (i32, (), &str) = split((42, "foo")); let (_head, _rest, _tail): (i32, (f64, bool, ()), &str) = split((42, 12.3, false, (), "foo")); }