#![no_std]
#[tuplities_derive::impl_remove]
pub trait TupleRemove<Idx> {
type Type;
type Remainder;
fn remove(self) -> (Self::Type, Self::Remainder);
}
#[cfg(test)]
mod tests {
use super::TupleRemove;
use typenum::{U0, U1};
#[test]
fn test_remove_single_element_tuple() {
let tuple = (42,);
let (removed, _remainder): (i32, ()) = TupleRemove::<U0>::remove(tuple);
let expected_removed: i32 = 42;
assert_eq!(removed, expected_removed);
}
#[test]
fn test_remove_two_element_tuple() {
let tuple = (1, 2);
let (removed0, remainder0) = TupleRemove::<U0>::remove(tuple);
let expected_removed0: i32 = 1;
let expected_remainder0: (i32,) = (2,);
assert_eq!(removed0, expected_removed0);
assert_eq!(remainder0, expected_remainder0);
let tuple = (1, 2);
let (removed1, remainder1) = TupleRemove::<U1>::remove(tuple);
let expected_removed1: i32 = 2;
let expected_remainder1: (i32,) = (1,);
assert_eq!(removed1, expected_removed1);
assert_eq!(remainder1, expected_remainder1);
}
}