summaryrefslogtreecommitdiff
path: root/examples/split.rs
blob: c2f6b82ad3505081a541e5421d8a774e4665d8cc (plain)
use varihappy::{Tuple, Tuple1, Tuple2};

type HeadOf<T> = <T as Tuple1>::Item0;
type RestOf<T> = <<<<T as Tuple1>::Rest as Tuple>::Reversed as Tuple1>::Rest as Tuple>::Reversed;
type TailOf<T> = <<<T as Tuple1>::Rest as Tuple>::Reversed as Tuple1>::Item0;

fn split<T>(tuple: T) -> (HeadOf<T>, RestOf<T>, TailOf<T>)
where
	T: Tuple2,
	<<T as Tuple1>::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"));
}