vecless 0.2.1

A minimal, Vec-free, singly linked list with Display support and ergonomic APIs.
Documentation
use vecless::List;

#[test]
fn test_new_list_is_empty() {
    let list: List<i32> = List::new();
    assert!(list.is_empty());
    assert_eq!(list.len(), 0);
}

#[test]
fn test_push_and_len() {
    let list = List::new().push(1).push(2).push(3);
    assert_eq!(list.len(), 3);
    assert_eq!(format!("{}", list), "[3, 2, 1]");
}

#[test]
fn test_add_preserves_order() {
    let list = List::new().add([1, 2, 3]);
    assert_eq!(format!("{}", list), "[1, 2, 3]");
}

#[test]
fn test_reverse() {
    let list = List::new().add([1, 2, 3]);
    let reversed = list.clone().reverse();
    assert_eq!(format!("{}", reversed), "[3, 2, 1]");
    assert_eq!(list.len(), reversed.len());
}

#[test]
fn test_append() {
    let a = List::new().add([1, 2]);
    let b = List::new().add([3, 4]);
    let combined = a.clone().append(b.clone());
    assert_eq!(format!("{}", combined), "[1, 2, 3, 4]");
    assert_eq!(combined.len(), a.len() + b.len());
}

#[test]
fn test_iter_sum() {
    let list = List::new().add([1, 2, 3]);
    let sum: i32 = list.iter().copied().sum();
    assert_eq!(sum, 6);
}

#[test]
fn test_into_iter_owned() {
    let list = List::new().add(["a", "b", "c"]);
    let collected: Vec<_> = list.clone().into_iter().collect();
    assert_eq!(collected, vec!["a", "b", "c"]);
}

#[test]
fn test_into_iter_borrowed() {
    let list = List::new().add(["x", "y"]);
    let mut collected = vec![];
    for item in &list {
        collected.push(*item);
    }
    assert_eq!(collected, vec!["x", "y"]);
}

#[test]
fn test_into_iter_mut() {
    let mut list = List::new().add(["a", "b"]);
    for item in &mut list {
        *item = match *item {
            "a" => "A",
            "b" => "B",
            _ => item,
        };
    }
    assert_eq!(format!("{}", list), "[A, B]");
}

#[test]
fn test_display_formatting() {
    let list = List::new().add([10, 20, 30]);
    assert_eq!(format!("{}", list), "[10, 20, 30]");
}