utls 0.13.10

A simple utilities library for stuff I actually use sometimes, with a large focus on convenience and lack of dependencies.
Documentation
use utls::containers::prelude::*;

fn main() {
    // Example 1: CircularBuffer with integers
    println!("CircularBuffer Example:");
    let mut int_buffer = CircularBuffer::new(5).unwrap();
    
    // Push some numbers
    for i in 0..4 {
        int_buffer.push(i).expect("Buffer full");
    }
    
    println!("Buffer contents: {:?}", int_buffer.iter().collect::<Vec<_>>());
    println!("Peek first element: {:?}", int_buffer.peek());
    println!("Pop first element: {:?}", int_buffer.pop());
    println!("Available space: {}", int_buffer.free_space());

    assert!(int_buffer.push(5).is_ok());
    println!("Available space after push: {}", int_buffer.free_space());
    assert!(int_buffer.push(6).is_err());
    
    // Example 2: CircularBuffer with strings
    println!("\nCircularBuffer with Strings:");
    let mut string_buffer = CircularBuffer::new(3).unwrap();
    string_buffer.push(String::from("Hello")).unwrap();
    string_buffer.push(String::from("World")).unwrap();
    
    // Demonstrate iteration
    for s in string_buffer.iter() {
        println!("Buffer contains: {}", s);
    }
    
    // Example 3: Sorted container with custom sort function
    println!("\nSorted Container Example:");
    
    // Create a sorting function that sorts numbers in descending order
    let desc_sort = DefaultSorts::random();
    
    let mut sorted_numbers = SortedList::new(desc_sort);
    
    // Add some numbers
    sorted_numbers.push(5);
    sorted_numbers.push(2);
    sorted_numbers.push(8);
    sorted_numbers.push(1);
    
    // Print sorted numbers
    println!("Sorted numbers (random):");
    for i in 0..4 {
        if let Some(num) = sorted_numbers.get(i) {
            println!("Position {}: {}", i, num);
        }
    }

    sorted_numbers.set_sort(DefaultSorts::ascending());
    sorted_numbers.man_sort();
    // Print sorted numbers
    println!("Sorted numbers (ascending):");
    for i in 0..4 {
        if let Some(num) = sorted_numbers.get(i) {
            println!("Position {}: {}", i, num);
        }
    }
    
    // Example 4: Sorted container with strings (lexicographical order)
    println!("\nSorted Strings Example:");
    let string_sort = |slice: &[String]| {
        let mut vec = slice.to_vec();
        vec.sort();
        vec
    };
    
    let mut sorted_strings = SortedList::new(string_sort);
    
    // Add strings without immediate sorting
    sorted_strings.push_no_sort(String::from("zebra"));
    sorted_strings.push_no_sort(String::from("apple"));
    sorted_strings.push_no_sort(String::from("banana"));

    println!("Unsorted strings:");
    for i in 0..3 {
        if let Some(s) = sorted_strings.get(i) {
            println!("Position {}: {}", i, s);
        }
    }
    
    // Manual sort
    sorted_strings.man_sort();
    
    // Print sorted strings
    println!("Sorted strings (alphabetical):");
    for i in 0..3 {
        if let Some(s) = sorted_strings.get(i) {
            println!("Position {}: {}", i, s);
        }
    }
}